2013-08-01 4 views
0

Я пытаюсь создать игру в кости, используя цикл while и if's. Я сделал это успешно, но я пытаюсь выяснить, как программировать игру, чтобы, если номера 4,6 или 12 не введены, он будет указывать неверный выбор и снова попросит diceChoice. Может ли кто-нибудь помочь?Dice game query While loop

До сих пор у меня есть ...

rollAgain = "Yes" or "yes" or "y" 

while rollAgain == "Yes" or "yes" or "y": 
    diceChoice = input ("Which dice would you like to roll; 4 sided, 6, sided or 12 sided?") 
    if diceChoice == "4": 
     import random 
     print("You rolled a ", random.randint(1,4)) 
    if diceChoice == "6": 
     import random 
     print("You rolled a ", random.randint(1,6)) 
    if diceChoice == "12": 
     import random 
     print("You rolled a ", random.randint(1,12)) 

    rollAgain = input ("Roll Again?") 
print ("Thank you for playing") 
+0

возможно дубликат [если х или у, г == бла] (http://stackoverflow.com/questions/15112125/if-x- or-y-or-z-blah) –

+0

Вы, вероятно, хотите, чтобы ваш импорт за пределами цикла while – StephenTG

+0

он все равно работал внутри, может быть, не самый лучший, хотя .. haha ​​ – sihrc

ответ

3

Fixed While Loop, Приведено в порядок все повторения. Перемещено заявление импорта вверх. Структурировано, чтобы предоставить больше возможностей для rollAgain и diceChoice.

import random 

rollAgain = "Yes" 

while rollAgain in ["Yes" , "yes", "y"]: 
    diceChoice = input ("Which dice would you like to roll; 4 sided, 6, sided or 12 sided?") 
    if diceChoice in ["4","6","12"]: 
     print("You rolled a ",random.randint(1,int(diceChoice))) 
    else: 
     print "Please input 4,6, or 12." 
    rollAgain = input ("Roll Again?") 

print ("Thank you for playing") 

Выполнение такого рода уступки:

rollAgain = "Yes" or "yes" or "y" 

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

Такого рода уступки здесь не работает либо:

while rollAgain == "Yes" or "yes" or "y": 

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

+0

+1, заметив, что условие while не соответствует коду афера. Могу упомянуть, что явно, хотя – StephenTG

+0

Это большое спасибо. Не думал о том, чтобы делать это таким образом, я новичок в Python, поэтому начинаю подбирать новые методы. Вы научили меня, как делать массив, я тоже могу поблагодарить вас. что делает функция в порядке? – user2633836

+0

Он проверяет, находится ли значение в rollAgain где-то в списке. возвращает логическое – sihrc

1

Вы должны импортировать только случайный один раз в верхней

import random #put this as the first line 

Ваше объявление rollAgain должен только установить его на одно значение

rollAgain = "yes" # the or statements were not necessary 

Вы забыли сделать rollAgain == в своих последующих условностях, вот более простая ва у

while rollAgain.lower().startswith("y"): #makes sure it starts with y or Y 

Чтобы сделать неверный ввод заявление, вы можете использовать elif: и else: заявления, чтобы сохранить его простым

if diceChoice == "4": 
    print("You rolled a ", random.randint(1,4)) 
elif diceChoice == "6": 
    print("You rolled a ", random.randint(1,6)) 
elif diceChoice == "12": 
    print("You rolled a ", random.randint(1,12)) 
else: 
    print("Invalid Input, please enter either 4, 6, or 12") 

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

while rollAgain == "Yes" or True or True #because non-empty strings are treated as True 

Редактировать, так как вы просили о in заявления, вот краткий пример

>>>5 in [1,2,3,4] 
False 
>>>5 in [1,2,3,4,5] 
True 

in оператор похож на на других языках он проверяет, если переменная находится внутри списка

Поскольку 5 не в списке [1,2,3,4] он вернулся False
однако, 5 IS в списке [1,2,3,4,5] поэтому возвращает True

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

+0

Это потрясающе большое спасибо Стефану за то, что он исправил это для меня. Я новичок в Python, поэтому методы, которые я изучил до сих пор, это то, что я использовал, чтобы попытаться решить проблемы, однако то, что вы объяснили, является реальной помощью. – user2633836

0
diceChoice = None 
while diceChoice not in ["4","12","6"]: 
    diceChoice = input("enter choice of dice(4,6,12)") 
print "You picked %d"%diceChoice 
0

Просто мой взгляд на него:

# If you are only using one function from random 
# then it seems cleaner to just import that name 
from random import randint 
while True: 
    choice = int(input("Which dice would you like to roll; 4 sided, 6, sided or 12 sided?\n:")) 
    # Using sets for 'in' comparisons is faster 
    if choice in {4, 6, 12}: 
     print("You rolled a", randint(1, choice)) 
    else: 
     print("Please input 4, 6, or 12.") 
    # Make the input lowercase so that it will accept anything that can be 
    # interpreted as "yes". 
    if input("Roll Again?\n:").lower() not in {"yes", "y"}: 
     # End the game by breaking the loop 
     break 
# You should use an input at the end to keep the window open to see the results 
input("Thank you for playing!")