首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >显示带有诅咒和蟒蛇的“地图”

显示带有诅咒和蟒蛇的“地图”
EN

Code Review用户
提问于 2021-07-23 01:55:13
回答 1查看 246关注 0票数 3

我开始用诅咒来做游戏,但我觉得我的地图显示效率不高,效果不佳。

下面是代码(只有相关部分):

代码语言:javascript
运行
复制
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()

运行此操作将生成以下窗口:

(如果你看不出这只是个测试)

有什么更好的方法吗?

EN

回答 1

Code Review用户

发布于 2021-07-23 08:46:37

下面对代码进行轻微重构,以提高可读性并减少重复。(我认为我在这里做的任何事情都不会对你的表现有多大帮助,很遗憾。)

代码语言:javascript
运行
复制
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 = [
    (n, *((i * 1000 // 0xff) for i in rgb))
    for n, *rgb in (
        (255, 0,    0x64, 0),
        (254, 0xff, 0xff, 0xff),
        (253, 0x82, 0x8c, 0x51),
        (252, 0xff, 0xe4, 0xb5),
        (251, 0xc0, 0xc0, 0xc0)
    )
]

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_REDcurses.COLOR_BLUEcurses.COLOR_GREEN引入了别名。在这三个中,只有curses.COLOR_RED不止一次被使用,但我也为另外两个引入了别名,以保持颜色命名的一致性。
  • win函数中,您反复调用curses.init_colorcurses.init_pair,这导致了一些重复的代码。我将这些调用的参数从win中提取出来,并将它们放入全局命名空间,然后将对init_colorinit_pair的一系列调用抽象为win中的两个for -循环。
  • 我将colors列表从win中的列表改为列表理解,从而减少了代码的重复性、简洁性和可读性。
  • 我在win中取出了嵌套的for-循环,并将其替换为对itertools.product的调用,后者做同样的事情,但更简洁,更易读。
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/264300

复制
相关文章

相似问题

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