Отображение «карты» с проклятиями и питоном

Я начал делать игру в проклятиях, но чувствую, что показываю карту неэффективно и неэффективно.

Вот код (только соответствующие части):

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 ответ
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, который делает то же самое, но является более кратким и (возможно) более читаемым.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *