2016-06-09 4 views
-2

У меня есть while-loop, вложенный в Class "Function/Block". Я занимался исследованиями, и предположим, что вы должны поставить self.Counter (for example), если вы хотите поставить счетчик в классе. До этого я использовал функцию break, чтобы остановить мой while-loop. Это может быть не в том месте, или оно было настроено неправильно, но, хотя это False, он продолжает продолжаться. Вот код:Python 3: Как остановить цикл while В классе От ​​запуска После того, как каждый класс я добавил?

class Class: 
    def __init__(self, Health, Attack, Defense): 
     self.Health = Health 
     self.Attack = Attack 
     self.Defense = Defense 
     self.Role = [] 
     self.Move = [] 
     self.RoleCount = 1 
     while(self.RoleCount > 0): 
      Input = input("What role do you want to be?\nChoices:\n1. Mage\n2. Warrior\n3. Archer\n4. Gunner\n") 
      if(Input.lower() in ['mage', 'warrior', 'archer', 'gunner']): 
       print("Your role is: %s" % (Input.upper()[0]+Input.lower()[1:])) 
       self.Role.append(Input.upper()[0]+Input.lower()[1:]) 
       self.RoleCount -= 1 
      else: 
       print("That's not a role! Try again.") 
Mage = Class(40, 20, 7) 
Warrior = Class(60, 9, 10) 
Archer = Class(50, 12, 18) 
Gunner = Class(55, 16, 12) 

Вам может понадобиться запустить это так, вы можете увидеть проблему я вижу, но всякий раз, когда я запускаю это, while-loop продолжает идти даже после того, как это False. Если вы скажете мне, почему это происходит и как это исправить, я был бы признателен :). Благодаря!

Кроме того, вот версия break Я пробовал, прежде чем пробовал предыдущий код. Он все еще не остановил while-loop.

class Class: 
    def __init__(self, Health, Attack, Defense): 
     self.Health = Health 
     self.Attack = Attack 
     self.Defense = Defense 
     self.Role = [] 
     self.Move = [] 
     while(True): 
      Input = input("What role do you want to be?\nChoices:\n1. Mage\n2. Warrior\n3. Archer\n4. Gunner\n") 
      if(Input.lower() in ['mage', 'warrior', 'archer', 'gunner']): 
       print("Your role is: %s" % (Input.upper()[0]+Input.lower()[1:])) 
       self.Role.append(Input.upper()[0]+Input.lower()[1:]) 
       break 
      else: 
       print("That's not a role! Try again.") 
Mage = Class(40, 20, 7) 
Warrior = Class(60, 9, 10) 
Archer = Class(50, 12, 18) 
Gunner = Class(55, 16, 12) 

Я предполагаю, что проблема является позиционирование while-loop, но я действительно не знаю. Любое разъяснение было бы полезно!

Обновить информацию 1: Он продолжает работать для всех «классов», которые я создал, но мне нужны эти классы для проверки статистики для каждой роли, т. Е. «Маг», «Воин» и т. Д. Как мне сделать в то время как цикл выполняется один раз, хотя их четыре класса?

Классы:

Mage = Class(40, 20, 7) 
Warrior = Class(60, 9, 10) 
Archer = Class(50, 12, 18) 
Gunner = Class(55, 16, 12) 
+0

Оба фрагмента отлично работают. Подробнее о предоставлении [MCVE]. –

+0

Я просто попробовал ваш код без прерывания, и он отлично работает для меня. вы создаете четыре объекта, поэтому он просит вас ввести четыре раза. вы пытались создать только один объект? – sumit

+0

@Rogalski Оба фрагмента, для меня, продолжают работать даже после того, как я отвечу «Маг» (например). Я делаю этот код на repl.it Python 3. – BradTheBrutalitist

ответ

3

Если вы хотите, чтобы пользователь выбрал класс, то я адаптировали код следующим образом!

class Role: 
    def __init__(self, Health, Attack, Defense): 
     self.Health = Health 
     self.Attack = Attack 
     self.Defense = Defense 
     self.Move = [] 

def chooseClass(): 
    Roles = { 
       'mage':lambda:Role(40, 20, 7), 
       'warrior':lambda:Role(60, 9, 10), 
       'archer':lambda:Role(50, 12, 18), 
       'gunner':lambda:Role(55, 16, 12) 
       } 

    while(True): 
     Input = input("What role do you want to be?\nChoices:\n1. Mage\n2. Warrior\n3. Archer\n4. Gunner\n") 
     if(Input.lower() in Roles): 
      print("Your role is: %s" % (Input.upper()[0]+Input.lower()[1:])) 
      break 
     else: 
      print("That's not a role! Try again.") 
chooseClass() 
+0

Он не запускает цикл while. – BradTheBrutalitist

+0

@BradTheBrutalitist Lol вам нужно вызвать 'select_class()' ... Обновленный код! – TheLazyScripter

+0

Вы вызвали функцию «choose_class()»? if __name__ == '__main__': select_class() –

3

Это не бесконечное время цикла; все работает правильно. Вы просто вызываете конструктор четыре раза, поэтому он будет предлагать вам четыре раза.

Это звучит, как вы хотите сделать следующее:

Учитывая некоторый пользовательский ввод, если вход соответствует действительной роли, а затем возвращает экземпляр этой роли с различной предопределенной статистикой. В противном случае, если вход недействителен, залейте его до тех пор, пока вход не будет действительным.

В этом случае, мы можем сделать что-то вроде следующего:

class Role: 
    def __init__(self, health, attack, defense): 
     self.health = health 
     self.attack = attack 
     self.defense = defense 
     self.move = [] 

def choose_role(): 
    role_stats = { 
     "mage": (40, 20, 7), 
     "warrior": (60, 9, 10), 
     "archer": (50, 12, 18), 
     "gunner": (55, 16, 12) 
    } 
    menu = "\n".join([ 
     "What role do you want to be?", 
     "Choices:", 
     "1. Mage", 
     "2. Warrior", 
     "3. Archer", 
     "4. Gunner", 
     "" 
    ]) 

    while True: 
     choice = input(menu).lower() 
     if choice in role_stats: 
      stats = role_stats[choice] 
      print("Your role is: %s" % choice.capitalize()) 
      return Role(*stats) 
     else: 
      print("That's not a role! Try again.") 

role = choose_role() 
print("Health: %d, Attack: %d, Defense: %d" % 
     (role.health, role.attack, role.defense)) 
+1

Единственная проблема, я вижу, что вы создаете дополнительные 3 неиспользуемых класса. В конечном итоге это не повлияет на производительность, но, если его можно избежать, это лучше всего! – TheLazyScripter

+1

@ TheLazyScripter достаточно. Я изменил свой пример, чтобы избежать этого. – Adriano

+0

@Adriano Благодарим вас за предмет ввода статистики. – BradTheBrutalitist