使用Python从文件中创建一个二维列表(地图)

4

我正在尝试让我的程序读取文本文件的元素,然后创建一个20x30的2D列表,并使用文本文件的元素填充该列表。我的预期结果是一个游戏地图,在其中可以找到某些元素并根据需要移动它们。

我已经编写了两个函数来尝试实现此操作,但似乎无法按照我想要的方式执行,我有点被卡住了,不知道为什么会出现这种情况。

def create_level(level):
     """ Create the level based off of reading positions of agents, player, buildings
water, etc..."""

     a_maze = []

     level_data = level.read()
     for r in range (0, ROWS, 1):
        a_maze.append ([])
        for c in range (0, COLUMNS, 1):
             a_maze[r].append (level_data)
     print(a_maze)



def load_level():
     while True:
          print("Enter the name/directory of the level file you wish to load\
     .txt or .lvl are the only accepted formats")

          level_in = input(">>: ")
          if (level_in.endswith(".txt") or level_in.endswith(".lvl")):
               try:
                    level = open(level_in, "r")

               except IOError:
                    print("Not a valid file")
          else:
               print("Not a suitable format for level")

          return level
1个回答

3

您在这里缺少的是文件解析。 在 Python 中,所有 open 做的只是创建一个文件对象(在这种情况下是文本文件对象),您可以读取或写入该对象。 假设地图中的每个瓦片都是单独的字符,并且每行都是地图的完整宽度,则以下是如何逐行构建地图:

your_map = []
with open(level_in, 'r') as level:
    for line in level:
        your_map.append([a for a in line.split()])

编辑:如果你的地图文件在瓦片之间没有任何分隔符,只需将追加行更改为:

your_map.append(list(line))

Padraic Cunningham建议将your_map赋值进一步压缩,加上分隔符,例如:

your_map = [line.split(your_delimiters) for line in level]

或者像这样,没有分隔符:

your_map = [list(line) for line in level]

这两个方法都可以完全替代for循环。

需要注意的是:

with关键字可用于在完成对象(如文件对象)操作后自动销毁该对象。这比要记得在完成后调用level.close()简单得多,也更安全。

for line in level会逐行迭代文件对象,当达到文件结尾时会自动结束。

[a for a in line.split]是一个列表推导式,但在本例中其实相当于创建了一个新的列表,在这个列表中每个索引都是行字符串中的非空格标记之一。

上面的代码做了几个假设——首先,文本文件每一行有相同数量的单元格;其次,每个单元格都是由一个空格与前一个单元格分隔开来的。这是我想象的情况示例:

` ` ` o # ` . . .
` ` o # # # . . .
` o # # # # # . .

其中任何一个字符都对应于沙漠、水等。


不要使用“map”作为变量名。 - Padraic Cunningham
@PadraicCunningham,您是什么意思?我假定他正在创建地图文件,并打算使任何给定的行对应于完整的地图跨度。不过,我可能误解了您的意思。 - furkle
@NathanGeist 你有任何分隔符吗?我会为这种情况添加一个示例。 - furkle
nvm不能用,另外一件事是list(line) == [a for a in line] - Padraic Cunningham
@PadraicCunningham 啊,我知道有一种更好的方法,但我忘了。搜了一下,但没能快速找到什么。谢谢! - furkle
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接