首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图在python中更快地呈现ASCII艺术

试图在python中更快地呈现ASCII艺术
EN

Stack Overflow用户
提问于 2018-11-27 14:43:30
回答 3查看 884关注 0票数 2

我试图在python中构建一个基于文本的开放世界游戏。

代码语言:javascript
复制
world = [["=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","="],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
    ]

for i in world:
    for j in i:
        print(j, end="")
    print("")

这段代码成功地打印了世界地图,尽管速度有点慢。有没有提高性能的方法?最终,我希望有一个巨大的地图,玩家可以移动,与敌人互动,NPC等。有什么办法,我可以加快渲染,以获得比.1 FPS更好?

我在Python3.7空闲版。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-27 14:58:06

String已经是python中的只读迭代器。所以你可以做这样的事

代码语言:javascript
复制
world = [
    "  X  ",
    " XXX ",
    " X   ",
    ]
for row in world:
    print(row)

但是,您确实应该尽量减少对print的更多调用,这是很慢的。也许你只能用一个三倍引号的字符串?

代码语言:javascript
复制
world = """\
  X  
 XXX 
  X   """

print(world)

哪个字符串可以通过计数(i,j)元素前面的字符数来访问它。每一行都有board_width + 1字符(不要忘记计算换行符),在元素(i,j)之前有j行。另外,在0上索引时,i元素与(i,j)在同一行,但在(i,j)的左侧,所以(i,j)元素是world[(row_width + 1) * j + i]

如果您想保持双数组,因为它是可变的,那么在打印它之前,考虑将它合并到一个字符串中。为此,请使用map在一次调用中合并每一行。

代码语言:javascript
复制
displayedWorld = "\n".join(map("".join, world))

edit1:您可以像TrebuchetMS那样理解列表,但实际上它在python3中构建了一个列表,map将创建一个迭代器,它不需要在调用"\n".map之前存储所有已转换的行,而是动态计算转换行的列表,而不将它们存储在列表中。

edit2:对于世界的部分呈现,只需在构建字符串之前使用列表的范围选择即可。例如,worldj1 1:j2只包含从索引j1 (包括)到索引j2 (排除的)的世界行。因此,如果要显示从(i,j)生成的具有维度(w,h)的矩形,请执行以下操作:

代码语言:javascript
复制
displayedWorld = "\n".join(map(lambda row: "".join(row[i:i+w]), world[j:j+h]))

这使用了一个新的成语lambda,它只是一个未命名的函数。lambda lambda row: "".join(row)等效于方法"".join。因此,lambda row: "".join(row[i:i+w])只将行中的ii+w合并。注意,在这个世界上,我们也只选择了从jj+h的行。

票数 1
EN

Stack Overflow用户

发布于 2018-11-27 14:46:25

使用.join()可以快速地将列表串在一起。

代码语言:javascript
复制
print('\n'.join([''.join(row) for row in world]))

空闲时,print的开销很大。您最好希望在打印字符串之前编译它,以获得最佳性能。

票数 1
EN

Stack Overflow用户

发布于 2018-11-27 14:51:48

如果您在linux / osx上,可以查看curses。使用该库,您可以单独绘制像素,而不是每次都重新绘制。

当涉及到一个巨大的地图时:只绘制当前可见的地图部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53502169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档