所以我试图让我的程序读取文本文件的元素,然后使用文本文件的元素创建一个 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/