【问题标题】:How to select a random tmx map to be loaded? Opening a random file in pygame?如何选择要加载的随机 tmx 地图?在pygame中打开一个随机文件?
【发布时间】:2020-06-12 23:10:51
【问题描述】:

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

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

【问题讨论】:

  • map = random.choice(MAP) - 但它需要删除使用过的地图才能在下一个选择()中跳过它。所以也许首先洗牌地图random.shuffle(MAP) 然后正常使用for map in MAP: - 它会以随机顺序排列,因为MAP 已经有随机顺序的项目。
  • @furas 成功了,谢谢,如果我想始终从同一张地图开始,那最后一件事该怎么办。所以每次都加载同一个地图,如果条件发生然后加载随机地图?
  • 您可以使用 MAP[0]MAP[1:] 创建新列表 - 作为第一个元素使用 MAP[0] 并从随机列表中添加元素 MAP[1:]
  • 非常感谢。
  • 我在答案示例代码中添加了仅随机播放 MAP[1:] 并始终保持 MAP[0] 为第一

标签: python random pygame


【解决方案1】:

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

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

import random

MAP = ['map.tmx', 'map2.tmx', 'map3.tmx']

map = random.choice(MAP)

print(map)

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

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

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.

【讨论】:

  • 我得到一个 TypeError: join() 参数必须是 str、bytes 或 os.PathLike 对象,而不是 'list',因为 self.map = TiledMap(path.join(self.map_folder, MAP))
  • MAP 是一个列表,但您必须从列表中获取一个元素。 IE。 path.join(..., random.choice(MAP))
  • 我理解随机模块背后的原理,我明白你为什么要随机播放rest然后将两个列表放在一起但是我不明白为什么要使用TiledMap(path.join(self.map_folder, random.choice(MAP)))。这会导致每次启动程序时都会加载随机地图,而不是列表中的第一个。
  • 这只是你不能使用MAP的例子,因为它是列表——你必须从列表map = ...中获取元素并使用这个元素——join(self.map_folder, map)。在示例中,我使用了map = random.choice(MAP),但通常您可以使用map = MAP[0] 获取第一张地图,或者您必须在循环中运行它for map in MAP: load_map_play_game_etc
  • 太棒了!它起作用了,一旦达到最后一个级别,我就遇到了索引问题,但我最终解决了这个问题:) 非常感谢你提供了巨大的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多