所以我试图让我的程序读取文本文件的元素,然后使用文本文件的元素创建一个20x30的二维列表。我的预期结果基本上是一个游戏地图,我可以在其中找到某些元素并根据需要移动它们。
我到目前为止尝试这样做的两个功能如下,但我似乎无法做到我想要它做的事情,我有点难过为什么我能做到'吨。
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
答案 0 :(得分:2)
这里你缺少的是解析文件。 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 # # # # # . .
任何给定的角色对应于沙漠,水等等。