如何选择要加载的随机 tmx 地图?在pygame中打开随机文件?



当满足某些条件时,尝试从我的地图文件夹中选择随机地图,我将如何选择新地图。

MAP = ['map.tmx', 'map2.tmx', 'map3.tmx']
self.map_folder = path.join(game_folder, 'maps')
self.map = TiledMap(path.join(self.map_folder, MAP))
class TiledMap:
def __init__(self, filename):
tm = pytmx.load_pygame(filename, pixelalpha=True)
self.width = tm.width * tm.tilewidth
self.height = tm.height * tm.tileheight
self.tmxdata = tm
def render(self, surface):
ti = self.tmxdata.get_tile_image_by_gid
for layer in self.tmxdata.visible_layers:
if isinstance(layer, pytmx.TiledTileLayer):
for x, y, gid, in layer:
tile = ti(gid)
if tile:
surface.blit(tile, (x * self.tmxdata.tilewidth,
y * self.tmxdata.tileheight))
def make_map(self):
surface = py.Surface((self.width, self.height))
self.render(surface)
return surface

要获得随机的东西,您需要模块random

您可以使用choice()从列表中获取随机项目

import random
MAP = ['map.tmx', 'map2.tmx', 'map3.tmx']
map = random.choice(MAP)
print(map)

但是,如果您再次使用choice()那么有时您可能会得到相同的地图。要获得不同的地图,您必须在下choice()之前从MAP中删除已使用的地图

或者你可以用不同的方式做到这一点。使用shuffle()您可以获得随机顺序的项目列表,然后您可以使用for循环来获得始终唯一和随机的地图

import random
MAP = ['map.tmx', 'map2.tmx', 'map3.tmx']
random.shuffle(MAP)
for map in MAPS:
print(map)

编辑:将第一张地图始终保留为第一张地图,并仅随机播放其他地图

import random
MAP = ['map.tmx', 'map2.tmx', 'map3.tmx', 'map4.tmx', 'map5.tmx']
first = MAP[:1]  # list with one element - it need `first + rest` instead of `[first] + rest`
rest  = MAP[1:]
random.shuffle(rest)
MAP = first + rest
print(MAP)

顺便说一句:以同样的方式,您可以将第一张和第二张地图保留在适当的位置

first = MAP[:2]
rest  = MAP[2:]

编辑:洗牌后

仅加载第一个地图

map = MAP[0]
fullpath = path.join(self.map_folder, map)
self.map = TiledMap(fullpath)

要使用所有地图,您可以循环运行

for map in MAP:
fullpath = path.join(self.map_folder, map)
self.map = TiledMap(fullpath)
# ... run game with this map ...

或者将变量与level一起使用

# first level 
level = 0
map = MAP[level]
fullpath = path.join(self.map_folder, map)
self.map = TiledMap(fullpath)
# ... run game with this map ...
# next level 
level += 1
map = MAP[level]
fullpath = path.join(self.map_folder, map)
self.map = TiledMap(fullpath)
# ... run game with this map ...
# next level 
level += 1
map = MAP[level]
fullpath = path.join(self.map_folder, map)
self.map = TiledMap(fullpath)
# ... run game with this map ...
# etc.

最新更新