python - 尝试用 python 更快地渲染 ASCII 艺术

标签 python python-3.x ascii-art

我正在尝试用 python 构建一个基于文本的开放世界游戏

world = [["=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","=","="],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
     [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],
    ]

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

此代码成功打印了世界地图,尽管速度有点慢。有没有办法提高性能?最终我想要一张巨大的 map ,玩家可以在其中移动、与敌人、NPC 等互动。有什么方法可以加快渲染速度,使其达到 0.1 FPS 以上吗?

我使用的是 Python 3.7 IDLE。

谢谢!

最佳答案

字符串在Python中已经是只读迭代器。所以你可以做类似的事情

world = [
    "  X  ",
    " XXX ",
    " X   ",
    ]
for row in world:
    print(row)

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

world = """\
  X  
 XXX 
  X   """

print(world)

对于这样的字符串,您可以通过计算其前面的字符数来访问 (i,j) 元素。每行有 board_width + 1 个字符(不要忘记计算换行符),并且元素 j 之前有 (i,j) 行。另外,在 0 处建立索引,您在与 i 相同的行上有 (i,j) 个元素,但位于 (i,j) 的左侧,因此 (i,j) 元素是 world[(row_width + 1) * j + i]

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

displayedWorld = "\n".join(map("".join, world))

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

edit2:对于世界的部分渲染,只需在构建字符串之前使用列表的范围选择。例如,world[j1:j2] 仅包含从索引 j1(包含)到索引 j2(排除)的世界行。因此,如果您想显示从 (i,j) 开始、尺寸为 (w,h) 的矩形,请执行以下操作:

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 的行。

关于python - 尝试用 python 更快地渲染 ASCII 艺术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53502169/

相关文章:

python-3.x - 在 Python 中使用一个字符串打印文本

html - HTML 中 ASCII 艺术的 Alt 属性?

user-interface - 更酷的 ASCII 旋转器?

python - 我可以将字典的值分成多列并且仍然能够绘制它们吗?

python - django 通用一对一关系,具有级联删除

python - Matplotlib plot_date 在 UTC 中保持时间,即使使用自定义时区

c++ - 打印心形,里面有文字

python - 如何将 Pandas 数据框转换为分层字典

python - 使用 WxPython 播放动画

python - 如何卡住可变的默认参数值?