所以我目前正在编写蛇代码,试图学习 pygame。我对编码很陌生,所以如果我解释得不好,我很抱歉。我有一个游戏循环,当 running = True 时处于事件状态,当蛇碰到边界时,running 变为 False,结束游戏循环并切换到另一个 while 循环,表示游戏结束。当然,我稍后会在此屏幕上添加更多内容。我目前只是想弄清楚当我单击 r 时如何做到这一点,在第二个循环中,运行再次变为 true,再次触发游戏循环以有效地重新启动该游戏。我真的很感激任何建议,谢谢!
import pygame
pygame.init()
display_x = 400
display_y = 300
display = pygame.display.set_mode((display_x, display_y))
pygame.display.set_caption("Ned's snake game")
x1 = display_x / 2
y1 = display_y / 2
x1_change = 0
y1_change = 0
clock = pygame.time.Clock()
fps = 45
game_over_font = pygame.font.Font("freesansbold.ttf", 16)
def game_over():
over_text = game_over_font.render("GAME OVER", True, (200, 0, 0))
display.blit(over_text, ((display_x / 2) - 54, (display_y / 2) - 16))
running = True
while running is True:
print("thing")
display.fill((50, 200, 20))
pygame.draw.rect(display, (0, 0, 255), [x1, y1, 10, 10])
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -5
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = 5
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -5
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = 5
x1_change = 0
elif event.key == pygame.K_ESCAPE:
pygame.quit()
x1 += x1_change
y1 += y1_change
if x1 <= 0 or x1 >= display_x or y1 <= 0 or y1 >= display_y:
running = False
end_screen = True
clock.tick(fps)
pygame.display.update()
while end_screen is True:
display.fill((255, 255, 255))
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
elif event.key == pygame.K_r:
running = True
end_screen = False
game_over()
pygame.display.update() ```
最佳答案
解决此问题的一种方法是将整个 while running == True
block 放入 def
中。这样做会使许多变量超出范围。为了解决这个问题,您可以将其中的大部分移至 def
内部,并使用 global
关键字访问其余部分,如我在代码中所示。
我将其称为 def playGame()
,并且由于您已将该 block 放入 playGame()
中,因此您必须执行语句 playGame()
来启动它,正如您在代码中看到的那样。当 playGame()
中的 while
变为 false 时,它会进入 while end_screen == True
block ,然后检查该 r
键,如果找到它,则重新运行 playGame()
。
这是一个非常快速和肮脏的修复,可以让你快速到达你想要的地方,我怀疑这可能会导致创建一两个错误,但这是一个开始。如果我要给你一个建设性的批评,那就是你的程序中没有适当的游戏循环。如果今晚晚些时候我有时间,我会对此添加更多评论。
import pygame
pygame.init()
display_x = 400
display_y = 300
display = pygame.display.set_mode((display_x, display_y))
pygame.display.set_caption("Ned's snake game")
clock = pygame.time.Clock()
fps = 45
game_over_font = pygame.font.Font("freesansbold.ttf", 16)
def game_over():
over_text = game_over_font.render("GAME OVER", True, (200, 0, 0))
display.blit(over_text, ((display_x / 2) - 54, (display_y / 2) - 16))
def playGame():
global display_x, display_y, end_screen #"globals" are variables defined outside of the def block
x1 = display_x / 2 #moved these inside the def block
y1 = display_y / 2
x1_change = 0
y1_change = 0
#just moved this inside of a def block
running = True
while running is True:
#print("thing")
display.fill((50, 200, 20))
pygame.draw.rect(display, (0, 0, 255), [x1, y1, 10, 10])
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -5
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = 5
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -5
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = 5
x1_change = 0
elif event.key == pygame.K_ESCAPE:
pygame.quit()
x1 += x1_change
y1 += y1_change
if x1 <= 0 or x1 >= display_x or y1 <= 0 or y1 >= display_y:
running = False
end_screen = True
clock.tick(fps)
pygame.display.update()
playGame() #kickstart the game
while end_screen is True:
display.fill((255, 255, 255))
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
elif event.key == pygame.K_r:
running = True
end_screen = False
playGame() #restart the game
game_over()
pygame.display.update()
pygame.quit()
关于python - 如何重新触发之前的 'while' 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72736494/