Double while循环无响应

时间:2017-01-07 00:03:50

标签: python loops if-statement while-loop pygame

现在,我正在开发一个包含3个类的小型RPG,并且能够拥有自己的用户名。我的主脚本有问题。问题是,粗体if语句需要是一个while循环才能添加我的下一个部分,即主菜单。但是,当我尝试使用while关键字时,它会导致游戏停止响应。 提前感谢任何以任何方式提供帮助的人。

这是我的代码:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()

    gameDisplay.fill(green)

    while User_name == None:
        User_name = Username.ask(gameDisplay,"username")
        print User_name + "'s run/dio"

    if Class_Choice == None:
        Choice_wall().paint(gameDisplay)
        Class_Choice = Choice_wall().Choice(pygame.mouse.get_pos(
            [0],0,pygame.mouse.get_pressed()[0],0,0)


    pygame.display.update()
clock.tick(30)

以下是功能:

 def Choice(self, c1,c2 , p1,p2,p3):
        while p1 == 0:
            if 0 <= c1 <= 319 and p1 == 1 :
                return "warrior"
            elif 320 <= c1 <= 639 and p1 == 1:
                return "archer"
            elif 640 <= c1 <= 960 and p1 == 1:
                return "mage"

def get_key():
  while 1:
    event = pygame.event.poll()
    if event.type == KEYDOWN:
      return event.key
    else:
      pass

def display_box(screen, message):
  "Print a message in a box in the middle of the screen"
  fontobject = pygame.font.Font(None,18)
  pygame.draw.rect(screen, (0,0,0),
                   ((screen.get_width() / 2) - 100,
                    (screen.get_height() / 2) - 10,
                    200,20), 0)
  pygame.draw.rect(screen, (255,255,255),
                   ((screen.get_width() / 2) - 102,
                    (screen.get_height() / 2) - 12,
                    204,24), 1)
  if len(message) != 0:
    screen.blit(fontobject.render(message, 1, (255,255,255)),
                ((screen.get_width() / 2) - 100, (screen.get_height() / 2) -     10))
  pygame.display.flip()

def ask(screen, question):
  "ask(screen, question) -> answer"
   pygame.font.init()
  current_string = []
  display_box(screen, question + ": " + string.join(current_string,""))
  while 1:
    inkey = get_key()
    if inkey == K_BACKSPACE:
      current_string = current_string[0:-1]
    elif inkey == K_RETURN:
      break
    elif inkey == K_MINUS:
      current_string.append("_")
    elif inkey <= 127:
      current_string.append(chr(inkey))
    display_box(screen, question + ": " + string.join(current_string,""))
  return string.join(current_string,"")

1 个答案:

答案 0 :(得分:1)

问题几乎可以肯定是Choice_Wall.Choice方法中的循环:

while p1 == 0:

由于p1永远不会在循环中发生变化(并且如果满足循环条件它将永远不会返回),如果该条件第一次出现True,则总是会永远循环叫做。您可能需要将调用移动到循环内的pygame.mouse.get_pospygame.mouse.get_pressed,以便它有可能以您想要的方式工作。

另一种方法可能是完全删除内部循环,因为调用代码中的if Class_Choice == None行将导致它在主循环的每次迭代中继续调用Choice,直到做出选择。< / p>

与无限循环问题无关的一些进一步说明:创建一个Class_Wall实例只需一次,而不是每个帧需要两次,这也更自然。当然,如果它不包含任何状态(只有一个或多个函数,就像你用于上面的用户名那样),你甚至可能根本不需要一个类。正如另一位用户评论的那样,如果您在代码中遵循更典型的命名约定,例如lowercase_with_underscores的函数,方法和模块名称(保留CapitalizedNames),则对其他人的理解非常有帮助。类)。