(Python)从文件创建二维列表(贴图)

(Python)从文件创建二维列表(贴图),python,list,2d,Python,List,2d,因此,我试图让我的程序读取文本文件的元素,然后创建一个包含文本文件元素的20x30的2d列表。我的预期结果本质上是一个游戏地图,在其中我可以找到某些元素并根据需要移动它们 到目前为止,我尝试做这件事的两个功能如下,但我似乎无法让它做我想让它做的事情,我有点困惑为什么我不能 def create_level(level): """ Create the level based off of reading positions of agents, player, buildings wa

因此,我试图让我的程序读取文本文件的元素,然后创建一个包含文本文件元素的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

这里缺少的是对文件的解析。在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还建议
您的_map
赋值可以进一步压缩为这样,使用分隔符:

your_map = [line.split(your_delimiters) for line in level]
your_map = [list(line) for line in level]
或类似情况,不带分隔符:

your_map = [line.split(your_delimiters) for line in level]
your_map = [list(line) for line in level]
这两种方法都将完全消除对
for
循环的需要

请注意:

with
关键字用于在处理完文件对象之类的对象后自动销毁它们-这比在处理完之后记住调用level.close()要简单和安全得多

行中级别的
逐行遍历文件对象,当到达文件末尾时,该操作将自动结束

[a代表in-line.split]
是一个列表理解,但在本例中,它归结为创建一个新列表,其中每个索引都是行字符串中的一个非空格标记

我上面写的这段代码做了两个假设——首先,文本文件在每行中具有相同数量的分幅,其次,每个分幅与前一个分幅之间用空格分隔。下面是我想象中的一个例子:

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

如果任何给定的字符对应于,比如,沙漠、水等。

不要使用map作为变量名。您可以使用itertools.chain创建数组,那么行长将不会像这个想法那样重要,它看起来更像python(y)。while循环用于确保收到正确形式的输入。最后,我将再次研究它,但每个地图中的角色并没有被空格分隔,因为空格只是表示玩家可以自由移动到的空白。我想补充一句,爱这里的社区,我问了一个问题,你在2分钟内回答了什么?@PadraicCunningham,你是什么意思?我认为他创建地图文件的目的是让任何给定的线对应于完整的地图跨度。不过,我可能误解了你。@Nathangest你有任何分隔符吗?我将为这种情况添加一个示例。