这个基本的pygame结构怎么样?

mk1*_*k12 4 python pygame structure

这是我现在如何实现我的简单pygames:

import pygame, sys
from pygame.locals import *

def run_game():
    pygame.init()

    SIZE = (640, 400)
    BG_COLOUR = (0, 0, 0)
    LINE_COLOUR = (255, 255, 255)

    screen = pygame.display.set_mode(SIZE)
    clock = pygame.time.Clock()

    while True:
        time_passed = clock.tick(30)
        for event in pygame.event.get():
                if event.type == QUIT:
                        exit_game()

        screen.fill(BG_COLOUR)
        pygame.draw.aaline(screen, LINE_COLOUR, (1, 1), (639, 399))
        pygame.display.flip()

def exit_game():
    sys.exit()

if __name__ == "__main__"
    run_game()
Run Code Online (Sandbox Code Playgroud)

我还看到一个keeprunning标志用于退出主事件循环,而不是使用pygame.event.poll()循环pygame.event.get().任何建议,如变量的大小写/命名,任何使其更有效或可读的东西?

Ale*_*lli 12

无论pygame作者建议,我建议回避from ... import *:它只会让你的代码难以阅读(如读者有检查每一个barename来检查它是否是实际在本地转让或来自厉害的*).更改到import pygame.locals as pygl,比方说,并尽一切使用名称由它做一个合格的一个(我想在你的代码,这只是意味着改变QUITpygl.QUIT).您选择使用什么简称来代替pygl并不重要,但这是我强烈推荐的一般结构.记住:名称空间是一个很棒的主意 - 让我们做更多的! - )

在任何地方都使用4个空格的缩进,正如PEP 8所说的那样:你似乎将一些4空间的缩进与8个空格或标签混合在一起 - 不要!

不要分配你永远不会使用的变量,就像你正在做的那样time_passed.

这样的代码:如果event.type == QUIT:exit_game()的罚款,只要你在测试一个或很少的可能性(有if/ elif),但不"扩展"了,无论是在可读性和效率.当您需要覆盖几种情况时,请使用可在循环之前设置的字典:

dispatch = {pygl.QUIT: exit_game, # whatever else
           }
Run Code Online (Sandbox Code Playgroud)

而不是if/ elif/ else,使用:

f = dispatch.get(event.type)
if f is None:  # the "else" case"
   ...
else: f()
Run Code Online (Sandbox Code Playgroud)

  • 我完全了解pygame开发人员的建议 - 这就是为什么我说自己的建议相反的是"无论pygame作者推荐什么":我认为他们错了.为什么让我浪费时间仔细阅读以确定QUIT来自pygame而其他大写标识符不是?在解释器提示符下"导入此内容",阅读并思考Python的Zen,尤其是我已经引用过的最后一点.至于"并非所有情况下只有一个方法调用" - 什么阻止你将所有代码放到一个语句处理本地函数或方法?! (4认同)
  • >"我建议避免......导入*:".`pygame.locals`恰好适用于此用途.它包含许多非常常用的常量,主要是键码和事件类型. (3认同)