Попытка визуализировать ASCII-арт в python быстрее - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь построить текстовую игру с открытым миром на python

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

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

Этот код успешно печатает карту мира, хотя и несколько медленно.Есть ли способ улучшить производительность?В конце концов, мне бы хотелось иметь огромную карту, где игрок мог бы двигаться, взаимодействовать с врагами, NPC и т. Д. Есть ли способ ускорить рендер, чтобы он стал лучше, чем .1 FPS?

IЯ в Python 3.7 IDLE.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

вы можете проверить curses, если вы используете Linux / OSX.Используя библиотеку, вы можете рисовать пиксели индивидуально, а не перерисовывать все время.

Когда дело доходит до огромной карты: нарисуйте только ту часть карты, которая видна в данный момент.

0 голосов
/ 27 ноября 2018

Строка уже итераторы только для чтения в Python.Таким образом, вы можете сделать что-то вроде

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

Но вам следует постараться свести к минимуму еще больше вызовов на print, что медленно .Может быть, вы можете использовать только одну строку в тройных кавычках?

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, чтобы объединить все строки в одном вызове.

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

edit1 : вы могли бы понимать список, как это делал TrebuchetMS, но на самом деле он создает список в то время как в python3,map создаст итератор, которому не нужно хранить все преобразованные строки перед вызовом "\n".map, а достаточно быстро вычислить этот список преобразованных строк, не сохраняя их в списке.

edit2 : для частичного рендеринга мира, просто используйте выбор диапазона вашего списка перед построением строки.Например, мир [j1: j2] содержит только строки мира от индекса j1 (включен) до индекса j2 (исключен).Поэтому, если вы хотите отобразить прямоугольник, охватывающий (i,j) с размерами (w,h), выполните:

displayedWorld = "\n".join(map(lambda row: "".join(row[i:i+w]), world[j:j+h]))

Это использует новую идиому, лямбду, которая является просто неназванной функцией.Лямбда lambda row: "".join(row) эквивалентна методу "".join.Следовательно, lambda row: "".join(row[i:i+w]) объединяет только дела от i до i+w в строке.Обратите внимание, что мы также выбрали только строки от j до j+h в мире.

0 голосов
/ 27 ноября 2018

Используйте .join(), чтобы быстро связать воедино список.

print('\n'.join([''.join(row) for row in world]))

На IDLE много издержек с print.Возможно, вы захотите скомпилировать вашу строку перед печатью, чтобы добиться максимальной производительности.

...