python - 如何重新触发之前的 'while' 循环

标签 python pygame

所以我目前正在编写蛇代码,试图学习 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/

相关文章:

python - 将多个 CSV 字段导入一个 MySQL 字段

python - SVM - 如何向量化核化克矩阵?

python - 使用 Pygame 显示文本的透明度问题

python - 我可以使用 "normal"(Enthought) python 将 numpy 数组保存为 16 位图像吗?

Python:将对象序列化为json

python - 使用 pygame 的基于图 block 的游戏问题/问题

python - Pygame:如何位图传输和旋转图像以连接屏幕上的两个点?

python - Pygame-如何朝玩家 Sprite 的方向射击?

python - 无法为多个对象使用相同的图像

python - 如何允许群组用户修改 Odoo 中表单的特定部分?