基于 Turtle 的 Python 游戏第二次重玩时表现异常

问题描述 投票:0回答:1

我使用 Python 的海龟包创建了一个游戏,您可以使用向上箭头键帮助海龟穿过屏幕并在此过程中避开障碍物。它有一个重玩按钮,您可以在输掉比赛后单击该按钮来重置游戏并重新玩。但是,如果您输了两次并单击“重播”按钮,障碍物会突然开始在屏幕上移动得更快,一旦您输了,障碍物就会不断生成并出现在“游戏结束”消息上。玩游戏的前两次不会发生这种情况。

我相信这是由于一些我不知道的 tkinter 功能造成的。几周前,我尝试使用调试器来解决这个问题,并在海龟遇到障碍并且游戏结束时在 begin_game 函数中注意到以下内容:

  1. play_game 设置为 False 因为 if cosmo.distance(c) <= 20 evaluates to True

  2. if cosmo.reach_finish_line 条件计算结果为 False,这将被跳过

  3. 当达到 if play_game 条件时,调试器进入一些 tkinter 代码,并在其结束时转到 begin_game 函数的开头并开始执行它。这不应该发生,因为 play_game 设置为 False,因此不应该递归调用 begin_game。在评估这个 if 语句之前,我什至仔细检查了 play_game 的值,它仍然是 False。

有谁知道为什么会发生这种情况?为什么第二次重玩游戏时障碍物突然移动得更快?为什么即使玩家输了,它们仍然继续出现在屏幕上?

下面是有问题的 begin_game 函数。 以下是我的 GitHub 存储库的链接,其中包含整个项目代码:https://github.com/karenbraganz/intergactic-adventure-game如果您需要更多上下文。

# Begin game when player hits 'Play' or 'Replay' buttons
def begin_game():
    cosmo.showturtle()
    level_display.show_level()
    play_game = True
    screen.update()

    # Call obstacle_generator methods to create obstacles and move them forward
    obstacle_generator.create_obstacles()
    obstacle_generator.obstacle_move()

    # Detect collision between obstacle and turtle
    for c in obstacle_generator.all_obstacles:
        if cosmo.distance(c) <= 20:
            time.sleep(0.3)
            screen.tracer(0)

            # Iterate over obstacle list, hide turtle, and append to recycle list since this game round is over,
            # and they should not be visible on the end game screen
            for num in range(len(obstacle_generator.all_obstacles)):
                obstacle_generator.all_obstacles[num].hideturtle()
                obstacle_generator.recycle.append(obstacle_generator.all_obstacles[num])
            obstacle_generator.all_obstacles = []

            cosmo.hideturtle()

            # Call function to display end game screen
            end_game()

            play_game = False
            break

    # Detect if player has completed current level
    if cosmo.reach_finish_line():
        level_display.refresh_level()
        obstacle_generator.level_up()

    # Recursively call begin_game function if game is still on
    if play_game:
        screen.ontimer(fun=begin_game, t=100)
python tkinter turtle-graphics python-turtle event-loop
1个回答
0
投票

您观察到的问题有多种原因...... 第一个是 play_game 不是全局变量。

© www.soinside.com 2019 - 2024. All rights reserved.