2017-01-07 2 views
0

Прямо сейчас, я работаю над небольшой RPG с 3 классами и возможностью иметь собственное имя пользователя. У меня проблема с моим основным скриптом. Проблема заключается в том, что выражение bolded 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,"") 
+0

Какой полужирный «если»? Последняя часть вашего кода не подходит в коде, а отступы выглядят так, как будто это испортилось. – ShadowMitia

+0

Не могли бы вы уточнить, что происходит? Замораживает ли он до или после ввода вашего имени пользователя? – UnsignedByte

+0

У вас уже есть игровой цикл, у вас нет другого внутри него. – Natecat

ответ

1

Проблема почти наверняка петли в методе Choice_Wall.Choice:

while p1 == 0: 

С p1 никогда изменения в цикле (и он никогда не вернется, если условие цикла было выполнено), вы всегда будете цитировать навсегда, если это условие True при первом вызове метода. Вероятно, вам нужно переместить вызовы на pygame.mouse.get_pos и pygame.mouse.get_pressed внутри цикла, чтобы иметь возможность получить доступ к тому, как вы это делаете.

Альтернативой может быть удаление внутренней петли целиком, поскольку строка if Class_Choice == None в вызывающем коде приведет к тому, что она будет продолжать звонить Choice на каждой итерации основного цикла до тех пор, пока не будет сделан выбор.

Некоторые дополнительные примечания, не связанные с проблемой бесконечного цикла: было бы более естественным создание экземпляра Class_Wall только один раз, а не дважды на каждом кадре. Конечно, вам может даже не понадобиться класс вообще, если он не содержит никакого состояния (только одна или несколько функций, например, вы используете для имени пользователя выше). И, как прокомментировал другой пользователь, это может быть очень полезно для понимания другими людьми, если вы следуете более типичному соглашению об именах в своем коде, например lowercase_with_underscores для ваших имен функций, методов и модулей (резервирование CapitalizedNames для классов).

+0

Спасибо для подсказок я сделаю все возможное, чтобы следовать им в будущем. Тем не менее, мне нужно как-то подождать, пока утверждение if не станет ложным, прежде чем двигаться мимо it.any tips –

+0

Nevermind Я понял это Спасибо за советы. попытаюсь сложнее отформатировать его правильно в futre –

Смежные вопросы