所以我正在尝试制作一个基于文本的冒险游戏,它有一个使用嵌套列表管理的地图系统,如下所示:
self.map_ = [
['O', 'O', 'O'],
['O', 'O', 'O'],
['O', 'O', 'O']
]
我在一个名为Map()
的类中有一个地图,它有创建地图,添加和更改单元格等功能。
但是,我不确定如何打印地图。我想创建一个__str__()
函数来打印地图,但我不确定如何这样做。我希望它像这样打印出来,在X轴上分隔元素的空格和分隔Y轴的换行符:
O O O
O O O
O O O
我见过这样的例子:
for row in map_:
print ' '.join(row)
...此示例以我想要的格式打印地图。
但是,我希望将其转换为__str__()
函数,其中返回' '.join(row)
(在每个行元素之间打印一个空格)和'\n'.join(map_)
的组合(在两者之间打印换行符)每一行)。
当然,我希望元素的顺序正确(打印视图的左上角对应map_[0][0]
等)。
有没有办法可以使用__str__()
功能执行此操作,还是必须使用上面的打印功能?
答案 0 :(得分:1)
如何使用list comprehension?
"\n".join([" ".join(row) for row in map_])
例如:
In [1]: map_ = [
...: ['O', 'O', 'O'],
...: ['O', 'O', 'O'],
...: ['O', 'O', 'O']
...: ]
In [2]: print "\n".join([" ".join(row) for row in map_])
O O O
O O O
O O O
更直接地回答有关使用__str__()
的问题:
def __str__(self):
return "\n".join([" ".join(row) for row in self.map_])
答案 1 :(得分:1)
使用空格连接每个行元素,并使用\n
连接每一行
def __str__(self):
return "\n".join([" ".join(x) for x in self.map_])
答案 2 :(得分:1)
比列表理解方法稍微快一点的解决方案,尽管如果电路板尺寸很大就完全重要:
def __str__(self):
return '\n'.join(map(' '.join, self.map_))
具有C内置函数的 map
(str.join
)可以通过将更多工作推送到CPython参考解释器上的C层,以相当大的优势击败等效列表理解。
答案 3 :(得分:-1)
试试这个:
class Map:
def __init__(self):
self.map_ = [
['O', 'O', 'O'],
['O', 'O', 'O'],
['O', 'O', 'O']
]
def __str__(self):
string = ""
for i in self.map_:
for j in i:
string += j + " "
string += "\n"
return string
def change(self, x, y): # For change correctly invert the order
self.map_[y][x] = "A"
def main():
mapa = Map()
print(mapa)
if __name__ == '__main__':
main()