这是我的代码:
player1 = player2 = ball = score1 = score2 = None
def reset_game():
player1 = Pad(PAD_WIDTH, (WINDOW_HEIGHT / 2) - (PAD_HEIGHT / 2), FIRST_PLAYER)
player2 = Pad(WINDOW_WIDTH - (PAD_WIDTH * 2), (WINDOW_HEIGHT / 2) - (PAD_HEIGHT / 2), SECOND_PLAYER)
ball = Ball((WINDOW_WIDTH / 2) - (BALL_SIZE / 2), (WINDOW_HEIGHT / 2) - (BALL_SIZE / 2))
score1 = Score(((WINDOW_WIDTH / 2) - (SCORE_SIZE / 2.8) - SCORE_SPACING * 2), SCORE_SPACING, 1)
score2 = Score(((WINDOW_WIDTH / 2) - (SCORE_SIZE / 2.8) + SCORE_SPACING * 2), SCORE_SPACING, 2)
reset_game()
我最初这样定义它们(我知道它有点像java-ish,但无论如何),因为当我按ESCAPE时,我想将整个游戏重置为其初始值:
if e.key == pygame.K_ESCAPE:
reset_game()
复制并粘贴整个东西是可怜的。像这样运行,Python给了我错误:
这是因为Python只能看到函数内的赋值。
def redraw():
pygame.display.flip()
screen.fill((0, 0, 0))
if game_screen == SINGLE_PLAYER or game_screen == MULTIPLAYER:
draw_middle_line()
player1.draw()
player2.draw()
score1.draw()
score2.draw()
ball.draw()
如果我在全球范围内进行作业,则可行。为什么Python即使我宣布"也无法看到作业。 as None并在之后调用带有赋值的函数? (我知道这是c / c ++ / java-ish思考,但它仍然有意义。)
答案 0 :(得分:2)
Python不能看到作业"但只是你没有宣布你的名字是全球的。
https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces
https://docs.python.org/3/reference/simple_stmts.html#global
将您的功能更改为如下所示并尝试:
def reset_game():
global player1, player2, player3
player1 = Pad(PAD_WIDTH, (WINDOW_HEIGHT / 2) - (PAD_HEIGHT / 2), FIRST_PLAYER)
player2 = Pad(WINDOW_WIDTH - (PAD_WIDTH * 2), (WINDOW_HEIGHT / 2) - (PAD_HEIGHT / 2), SECOND_PLAYER)
ball = Ball((WINDOW_WIDTH / 2) - (BALL_SIZE / 2), (WINDOW_HEIGHT / 2) - (BALL_SIZE / 2))
score1 = Score(((WINDOW_WIDTH / 2) - (SCORE_SIZE / 2.8) - SCORE_SPACING * 2), SCORE_SPACING, 1)
score2 = Score(((WINDOW_WIDTH / 2) - (SCORE_SIZE / 2.8) + SCORE_SPACING * 2), SCORE_SPACING, 2)
PS。使用全局变量是非常差的设计。我建议使用不同的方法来组织程序的数据和代码。
答案 1 :(得分:1)
x = None
def foo():
global x
x = 10
foo()
print x #prints 10
本地范围内的任何赋值都被视为局部变量,您需要从全局范围获取它
答案 2 :(得分:-1)
如果您不向函数发送变量,它将尝试在本地创建变量,因此为了允许访问,它必须在函数内全局声明。
示例:
player1 = None
def reset_game():
global player1 #now you can modify player1
player1 = Pad(PAD_WIDTH, (WINDOW_HEIGHT / 2) - (PAD_HEIGHT / 2), FIRST_PLAYER)
reset_game()