Я начал делать игру в проклятиях, но чувствую, что показываю карту неэффективно и неэффективно.
Вот код (только соответствующие части):
import curses
world_map = [
'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000000011111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000011111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000011111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000111111111111111111110000000000000000000000000000000001111111111111111111111111000000000000000000000000000',
'00000000000000000111111111111111111111000000000000000000000000000001111111111111111111111111000000000000000000000000000',
'00000000000000000011111111111111111000000000000000000000000000000001111133333111111111111111000000000000000000000000000',
'00000000000000000000011111111111100000000000000000000000000000000001111133333111111111111111000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000001111133333111111111222211000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000001111133333111111111222211000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000001111133333111111111222211000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000011111111111111111133333111111111222211000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000011111111111111111133333111111111222211000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000011111111111111111111111111111111222211000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111000000000000000000000000000',
'00000000000000001111111111111111111111111000000000000011111111111110000000000000000000000000000000000000000000000000000',
'00000000000000001111111111111111111111111000000000000011111111111110000000000000000000000000000000000000000000000000000',
'00000000000000001114444411111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000001114444411111115555555111000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000001114444411111115555555111000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000001114444411111115555555111000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000001111111111111115555555111000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000001111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000']
def win(stdscr):
curses.init_color(255, 0, 0x64 * 1000 // 0xff, 0)
curses.init_color(254, 0xff * 1000 // 0xff, 0xff * 1000 // 0xff, 0xff * 1000 // 0xff)
curses.init_color(253, 0x82 * 1000 // 0xff, 0x8c * 1000 // 0xff, 0x51 * 1000 // 0xff)
curses.init_color(252, 0xff * 1000 // 0xff, 0xe4 * 1000 // 0xff, 0xb5 * 1000 // 0xff)
curses.init_color(251, 0xc0 * 1000 // 0xff, 0xc0 * 1000 // 0xff, 0xc0 * 1000 // 0xff)
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLUE) # water
curses.init_pair(2, curses.COLOR_RED, curses.COLOR_GREEN) # grass
curses.init_pair(3, curses.COLOR_RED, 255) # trees
curses.init_pair(4, curses.COLOR_RED, 254) # mountains
curses.init_pair(5, curses.COLOR_RED, 253) # swamp
curses.init_pair(6, curses.COLOR_RED, 252) # desert
curses.init_pair(7, curses.COLOR_RED, 251) # village
colors = [curses.color_pair(1), curses.color_pair(2), curses.color_pair(3), curses.color_pair(4), curses.color_pair(5), curses.color_pair(6), curses.color_pair(7)]
while True:
for i in range(30):
for j in range(119):
stdscr.addch(i, j, ' ', colors[int(world_map[i][j])])
stdscr.refresh()
def main():
curses.wrapper(win)
if __name__ == '__main__':
main()
Запуск этого приводит к появлению этого окна:
(если вы не могли сказать, это просто тест)
Есть ли лучший способ сделать это?
1 ответ
Вот небольшой рефакторинг вашего кода, чтобы улучшить читаемость и уменьшить повторяемость. (К сожалению, я не думаю, что все, что я здесь делаю, сильно повлияет на производительность.)
import curses as c
from itertools import product
world_map = [
'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000000011111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000011111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000011111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000111111111111111111110000000000000000000000000000000001111111111111111111111111000000000000000000000000000',
'00000000000000000111111111111111111111000000000000000000000000000001111111111111111111111111000000000000000000000000000',
'00000000000000000011111111111111111000000000000000000000000000000001111133333111111111111111000000000000000000000000000',
'00000000000000000000011111111111100000000000000000000000000000000001111133333111111111111111000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000001111133333111111111222211000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000001111133333111111111222211000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000001111133333111111111222211000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000011111111111111111133333111111111222211000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000011111111111111111133333111111111222211000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000011111111111111111111111111111111222211000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111000000000000000000000000000',
'00000000000000001111111111111111111111111000000000000011111111111110000000000000000000000000000000000000000000000000000',
'00000000000000001111111111111111111111111000000000000011111111111110000000000000000000000000000000000000000000000000000',
'00000000000000001114444411111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000001114444411111115555555111000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000001114444411111115555555111000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000001114444411111115555555111000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000001111111111111115555555111000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000001111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
]
colors_for_initialising = (
(255, 0, 0x64 * 1000 // 0xff, 0),
(254, 0xff * 1000 // 0xff, 0xff * 1000 // 0xff, 0xff * 1000 // 0xff),
(253, 0x82 * 1000 // 0xff, 0x8c * 1000 // 0xff, 0x51 * 1000 // 0xff),
(252, 0xff * 1000 // 0xff, 0xe4 * 1000 // 0xff, 0xb5 * 1000 // 0xff),
(251, 0xc0 * 1000 // 0xff, 0xc0 * 1000 // 0xff, 0xc0 * 1000 // 0xff)
)
RED, BLUE, GREEN = c.COLOR_RED, c.COLOR_BLUE, c.COLOR_GREEN
color_pairs = (
(1, RED, BLUE), # water
(2, RED, GREEN), # grass
(3, RED, 255), # trees
(4, RED, 254), # mountains
(5, RED, 253), # swamp
(6, RED, 252), # desert
(7, RED, 251) # village
)
def win(stdscr):
for color in colors_for_initialising:
c.init_color(*color)
for color_pair in color_pairs:
c.init_pair(*color_pair)
colors = [c.color_pair(i) for i in range(1, 8)]
while True:
for i, j in product(range(30), range(119)):
stdscr.addch(i, j, ' ', colors[int(world_map[i][j])])
stdscr.refresh()
def main():
c.wrapper(win)
if __name__ == '__main__':
main()
Сводка изменений, которые я сделал здесь:
- Введен псевдоним для
curses
(c
), чтобы сделать код более лаконичным. Вы можете обсудить, делает ли это изменение код более или менее читаемым — когда вы интенсивно используете модуль, например, в этом примере, я обычно предпочитаю использовать более короткий псевдоним, а не вводить каждый раз все имя модуля. - Также введены псевдонимы для
curses.COLOR_RED
,curses.COLOR_BLUE
иcurses.COLOR_GREEN
позже в коде по той же причине. Из этих трех только КРАСНЫЙ используется более одного раза, но я ввел псевдонимы для двух других, а также для согласованности именования цветов. - В вашей
win
функция, которую вы вызывалиcurses.init_color
иcurses.init_pair
неоднократно, что приводило к повторяющемуся коду. Я взял аргументы в пользу этих звонков изwin
и поместите их в кортеж в глобальном пространстве имен, а затем абстрагируйте серию вызовов доinit_color
иinit_pair
на два цикла for вwin
. - Я изменил твою
colors
список вwin
от литерала-списка к пониманию списка, что делает код менее повторяющимся, более кратким и читаемым. - Я вынул ваш вложенный цикл for в
win
и заменил его призывом кitertools.product
, который делает то же самое, но является более кратким и (возможно) более читаемым.