【问题标题】:How to restart my program with a button press 'r'?如何通过按“r”按钮重新启动我的程序?
【发布时间】:2020-09-08 20:46:22
【问题描述】:

好的,我已经在 Python 3.7.4 和 Pygame 1.9.6 中创建了 Space Invaders。我已经让一切正常,没有错误或任何东西。我什至让暂停按钮工作得很好。就在屏幕上出现“GAME OVER”文字表示您输了的时候。我想在文本消失后弹出一个窗口再次询问播放。但我只是不知道从哪里开始。我已经查看How do I restart a program based on user input? 寻求帮助,但我不明白在哪里实现它或在哪里查看。这是我在 Pygame 中创建的第一个真正的项目/游戏。

代码:

paused = False
running = True
while running:
    # RGB =  Red, Green, Blue
    screen.fill((0, 0, 0))
    # Background Image
    screen.blit(background, (0, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_p:  # Pausing
                paused = True
            if event.key == pygame.K_u:  # Unpausing
                paused = False
    if not paused:
                '''The rest of the code, with the movement key presses, etc.'''

由于“运行时循环”之上的所有内容都在不断加载或用于数据检索,例如图像、图像应该在哪里的坐标、背景音乐等。所以我希望它像暂停/取消暂停部分当我按下说'r'时的代码。我想重播程序而不退出它。所以我会非常感谢人们的帮助。谢谢大家。

【问题讨论】:

  • 尝试将需要重置的while循环/变量放入函数中。第一次开始游戏,你调用那个函数,然后重新启动它,你可以再次调用它。
  • 您可以将代码放入while-loop - 当您结束游戏时设置running = False,它将退出while running并转到外部while-loop,它将再次运行并再次设置值。当然,有些元素只能设置一次,因此您可以在外部 while-loop 之前进行设置
  • 但是重启的时候不会只调用一次,如果我想再调用一次呢。
  • 如果您将代码放入while,那么它将多次运行您的while running。如果您要使用函数reset(),请在while running 之前运行一次,然后在按下r 时在while 循环内使用reset()。在reset() 中,您只需设置重新启动游戏时想要再次重置的值 - 您不必再次运行pygame.init(),设置screen,加载图像,但您必须重置得分,玩家位置,敌对位置等。
  • 但是一旦出现“GAME OVER”文本,我就会让它中断 while 循环。

标签: python pygame python-3.7


【解决方案1】:

您必须在对象中创建函数或方法来重置数据并在每次游戏之前使用它。您可以为此使用外部while-loop。

# executed only once
pygame.init()
screen = ...
# .. load data ...
player = ...
enemy = ...

gameing = True
while gameing:
    
    # reset data before every game
    player.reset()
    enemy.reset()
    score = 0
    
    paused = False
    running = True
    
    while running:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:  # exit game
                running = False
                gameing = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:  # restart game (but don't exit)
                    running = False
                    #gameing = True
                if event.key == pygame.K_x:  # exit game and program
                    running = False
                    gameing = False

        if game_over:  # restart game (but don't exit)
           running = False
           #gameing = True

您也可以将其组织为评论中提到的@Starbuck5 - 但是您应该使用running 退出程序,而不是在游戏结束时退出游戏

def reset():
    global score, paused, running

    player.reset()
    enemy.reset()
    score = 0
    paused = False
    running = True

# executed only once
pygame.init()
screen = ...
# .. load data ...
player = ...
enemy = ...

# (re)set data before first game
reset()    

while running:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # exit game
            running = False
            gameing = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_r:  # restart game (but don't exit)
                #running = False  # DON'T DO THIS
                reset()

            if event.key == pygame.K_x:  # exit game and program
                running = False

   if game_over:  # restart game (but don't exit)
      #running = False  # DON'T DO THIS
      reset()

这需要为您必须重置的每个变量使用global,这样当您在类中有代码并且您可以使用self. 而不是global 时它会更有用

【讨论】:

  • 您向我展示它让我更了解它,非常感谢。我不只是要复制和粘贴或从中学到任何东西。
猜你喜欢
  • 2018-11-22
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多