为游戏地图中的每个方块指定唯一的名称

时间:2015-12-08 19:01:26

标签: python oop pygame

我正在制作一个涉及方形瓷砖地图的游戏(如文明III)。地图中的每个方格都是一个具有x,y坐标和其他一些属性的对象(平铺,高程等资源)。

我的地图文件存储为数组,如下所示:

tilemap =   [
        [GRASS, DIRT, DIRT],
        [GRASS, GRASS, WATER],
        [GRASS, GRASS, WATER],
        [DIRT, GRASS, WATER],
        [DIRT,  GRASS, GRASS]
        ]

我想通过地图并在数组中的位置给出的x,y坐标处制作一个正方形,并使用文本指示的类型(草,泥土等)。

到目前为止,我已经尝试过这个:

class LevelMap():
def __init__(self, level_array=tilemap):
    self.level_array = level_array

    # Go through every row in the map...
    for row in range(MAPHEIGHT):
        # ... and every column...
        for column in range(MAPWIDTH):
            # ...and make a square at that location.
            Square(row, column, tilemap[row][column])

Square类接受参数Square(x,y,square_type)

但是,我不知道如何给每个方块赋予自己独特的名称,所以我可以说

square_1 = the square at 0,0
square_2 = the square at 0,1

依此类推,以便我可以使用,例如square1.get_square_type()或square_1.change_terrain_type(rocky)。

如何将地图数组转换为一组具有唯一名称的Square对象?

我正在使用Python 3.4和pygame。

1 个答案:

答案 0 :(得分:2)

你没有。

您已经说过您将地图存储为2D列表。您只能通过该数组中的索引引用您的图块。

class LevelMap():
    def __init__(self, level_array=tilemap):
        self.level_array = level_array

        # Go through every row in the map...
        for row in range(MAPHEIGHT):
            # ... and every column...
            for column in range(MAPWIDTH):
                # ...and make a square at that location.
                Square(row, column, tilemap[row][column])

map = LevelMap(level_array=[])
# change the tile at (0, 1) to rocky:
map.level_array[1][0].change_terrain_to("rocky")

我甚至强烈建议在LevelMap上编写一个帮助函数来获取一个给定(x,y)的图块。

class LevelMap():
    ...
    def get_tile(self, x, y):
        return self.level_array[y][x]

map = LevelMap()
tile = map.get_tile(0, 1)
# or
location = (0, 1)
tile = map.get_tile(*location)

当我过去写过这样的内容时,我已Map成为list的孩子

class Map(list):
    def __init__(self, height, width):
        for y in range(height):
            self.append([Square(y, x, tilemap[y][x]) for x in range(width)])
    def get_tile(self, x, y):
        return self[y][x]