python - (Python) 从文件创建二维列表( map )

标签 python list 2d

所以我试图让我的程序读取文本文件的元素,然后使用文本文件的元素创建一个 20x30 的二维列表。我的预期结果基本上是一张游戏 map ,我可以在其中找到某些元素并根据需要移动它们。

到目前为止,我尝试执行此操作的两个功能如下,但我似乎无法让它做我想做的事,而且我有点困惑为什么我可以'

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

最佳答案

您在这里缺少的是文件的解析。 open 在 python 中所做的就是创建一个文件对象(在本例中为文本文件对象),您可以读取或写入该文件对象。假设 map 中的每个图 block 都是一个单独的字符,并且每一行都是 map 的整个宽度,下面是逐行构建 map 的方法:

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

编辑:如果您的 map 文件在图 block 之间根本没有分隔符,只需将附加行更改为:

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] 是一个列表理解,但在这种情况下归结为您正在创建一个新列表,其中每个索引都是行字符串中的非空格标记。

我在上面编写的这段代码做出了几个假设 - 首先,您的文本文件在每一行中都有相同数量的图 block ,其次,每个图 block 与前一个图 block 之间用空格分隔。这是我想象的一个例子:

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

其中任何给定的字符对应于 say、desert、water 等。

关于python - (Python) 从文件创建二维列表( map ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27006638/

相关文章:

python - 自动填充子图

c# - 如何验证类中 List<> 属性中的数据?

java - toArray(T[] a) 和 toArray() 之间的区别

Python 类和定义

python - 尝试将列表项添加到 tkinter 中的文本框

java - 将逗号与列表分开并在Java中显示在单行中

java - 在二维数组网格中的 JLabel 之间绘制线条

java - 二维数组复制(JAVA)

c++ - 在 C++ 游戏中更改光标

python - urllib2 代理不适用于 tor