我使用 Python 的海龟包创建了一个游戏,您可以使用向上箭头键帮助海龟穿过屏幕并在此过程中避开障碍物。它有一个重玩按钮,您可以在输掉比赛后单击该按钮来重置游戏并重新玩。但是,如果您输了两次并单击“重播”按钮,障碍物会突然开始在屏幕上移动得更快,一旦您输了,障碍物就会不断生成并出现在“游戏结束”消息上。玩游戏的前两次不会发生这种情况。
我相信这是由于一些我不知道的 tkinter 功能造成的。几周前,我尝试使用调试器来解决这个问题,并在海龟遇到障碍并且游戏结束时在 begin_game 函数中注意到以下内容:
play_game 设置为 False 因为 if cosmo.distance(c) <= 20 evaluates to True
if cosmo.reach_finish_line 条件计算结果为 False,这将被跳过
当达到 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)
您观察到的问题有多种原因...... 第一个是 play_game 不是全局变量。