2017-07-06 2 views
1

ユーザ入力を定義済みのリストと照合するための検証ループを作成しようとしていますが、何らかの理由でコードがループして値を再入力することを永久に求めています。私はループにprintコマンドを追加してテストし、入力データは属性辞書に格納されていますが、forループからのブレークをトリガする==基準を満たすことは決してないようです。ここでforループ内でのraw_inputの検証

は、これまでの私のコードですが、私は間違って行くよどこに任意の提案を本当に感謝:

attributes = {'Name': 'None', 'Class': 'None', 'Strength': 3, 'Agility': 3, 'Wounds': 3, 'Intelligence': 3} 

attributes['Name'] = raw_input('What is your character\'s name?') 
attributes['Class'] = raw_input('Choose your character\'s class, enter Warrior, Mage, Ranger or Thief.') 

#this is the section I am struggling with! 
for values in attributes: 
    if attributes['Class'] != "Warrior" or "Mage" or "Ranger" or "Thief": 
     attributes['Class'] = raw_input('Please choose either Warrior, Mage, Ranger or Thief.') 
     continue 
    elif attributes['Class'] == "Warrior" or "Mage" or "Ranger" or "Thief": 
     break 

if attributes["Class"] == "Warrior": 
    attributes["Strength"] += 1 
    attributes["Wounds"] += 1 
elif attributes["Class"] == "Mage": 
    attributes["Intelligence"] += 2 
elif attributes["Class"] == "Ranger": 
    attributes["Strength"] += 1 
    attributes["Agility"] += 1 
elif attributes["Class"] == "Thief": 
    attributes["Agility"] += 1 
    attributes["Intelligence"] += 1 

print 
print 'Name: ' + attributes['Name'] 
print 'Class: ' + attributes['Class'] 
print 'STR: ' + str(attributes['Strength']), 'AGI: ' + str(attributes['Agility']), 'WOU: ' + str(attributes['Wounds']) ,'INT: ' + str(attributes['Intelligence']) 

答えて

0

ライン

if attributes['Class'] != "Warrior" or "Mage" or "Ranger" or "Thief": 

は常にTrueに解決されます。私はあなたが探していると思う何

がに近いものです:あなただけattributes['Class']の値をチェックしようとしている場合

if attributes['Class'] not in ("Warrior", "Mage", "Ranger", "Thief"): 

、次のループでは、より適切な場合があります:

while attributes['Class'] not in ("Warrior", "Mage", "Ranger", "Thief"): 
    attributes['Class'] = raw_input('Please choose either Warrior, Mage, Ranger or Thief.') 
1

あなたが思うよりも異なるor作品。 これは真の最初の値を与えます。 Pythonでは、空でない文字列は常にtrueです。入力された入力は、あなたのタプルの名前である場合

if attributes['Class'] not in ("Warrior", "Mage", "Ranger", "Thief"): 
    attributes['Class'] = raw_input('Please choose either Warrior, Mage, Ranger or Thief.') 
    continue 
else: 
    break 

このチェックを:したがって:

>>> "Warrior" or "Mage" or "Ranger" or "Thief" 
'Warrior' 
はにあなたのコードを変更し

。そうでなければ、それは新しい入力を要求し、そうでなければ入力を求めることを止める。 bool("Mare") == Trueはので、あなたのループが壊れることはありませんので、

1

あなたのORは最初のIFでANDでなければなりません。

if attributes['Class'] != "Warrior" and attributes['Class'] != "Mage" and attributes['Class'] != "Ranger" and attributes['Class'] != "Thief" 

リストでそれらを探すためにこれを行うだろう簡単な方法を:あなたは、それらを実行する必要があります

for values in attributes: 
    if attributes['Class'] not in ["Warrior", "Mage", "Ranger", "Thief"]: 
     attributes['Class'] = raw_input('Please choose either Warrior, Mage, Ranger or Thief.') 
     continue 
    elif attributes['Class'] in ["Warrior", "Mage", "Ranger", "Thief"]: 
     break 
関連する問題