2013-11-18 3 views
1

Я сделал несколько кодов, которые будут катить два кристалла и спрашивать у пользователя сколько раз. После этого он попросит пользователя, хотят ли они снова играть. По какой-то причине он не вырывается из одного из циклов while, когда это необходимо.Не вырваться из цикла while

Вот код:

import random 
again = True 
rolls = 0 
while again == True: 
    rolls = float(raw_input("How many times would you like the dice to roll?")) 
    while rolls >= 1: 
     dice1 = random.randint(1,6) 
     dice2 = random.randint(1,6) 
     print dice1 , dice2 
     rolls = rolls - 1 
    again = raw_input("Would you like to play again?") 
    if again == "Yes" or "Y" or "yes" or "y": 
     again = True 
    else: 
     again = False 

Может любой из вас, ребята, помогите мне

+0

питона версии 2.7.3 и в то время как роллы> = 1 означает, в то время как рулоны больше или равно 1 – user2902668

ответ

4
if again == "Yes" or "Y" or "yes" or "y": 

Это не делает то, что вы думаете. Она оценивается как:

if (again == "Yes") or ("Y") or ("yes") or ("y"): 

Non-пустые строки логически True, поэтому весь этот оператор всегда будет True. Вы должны сравнить again с каждым возможным значением.

if again in ("Yes", "Y", "yes", "y"): 
# or 
if again == "Yes" or again == "Y" or again == "yes" or again == "y": 
8

Проблема эта линия:

if again == "Yes" or "Y" or "yes" or "y": 

Это имеет значение:

if (again == "Yes") or "Y" or "yes" or "y": 

другими словами, это всегда верно. Вы имеете в виду это:

if again in ("Yes", "Y", "yes", "y"): 
+0

Вы быстро. :) – scriptmonster

+0

Спасибо, чувак! Прекрасно работает. – user2902668

1

Линия

if again == "Yes" or "Y" or "yes" or "y": 

неправильно и всегда будет возвращать True. Чтобы исправить это, измените его на

if again == "Yes" or again == "Y" or again == "yes" or again == "y": 

Это происходит потому, что непустая строка всегда правдива. Поскольку вы только сравниваете строку с повторением в первом выражении, в остальных вам просто нужно проверить, не является ли строка «Y» пустой. Поскольку эта строка жестко, она всегда будет правдой

Это также может быть аккуратнее сделать

#Uppercase the input and then check if user said yes 
if again.upper() in ("YES","Y"): 
    do_the_thing() 
1

Проблемы находится в вашем заявлении

if again == "yes" or "Y" or "yes" or "y" 

Заявление в питоне оценивается в Истина, если они не равны 0 или None, которые являются ложными.

Вы должны сделать

if again == "Yes" or again == "Y" or again == "yes" etc. 

Это происходит потому, что or "Y" or "yes" всегда вычисляемая в True.

1

Ниже работы:

import random 
again = True 
rolls = 0 
while again == True: 
    rolls = float(raw_input("How many times would you like the dice to roll?")) 
    while rolls >= 1: 
     dice1 = random.randint(1,6) 
     dice2 = random.randint(1,6) 
     print dice1 , dice2 
     rolls = rolls - 1 
    again = raw_input("Would you like to play again?") 
    # It correct and more short 
    again = True if again in ("Yes", "Y", "yes", "y") else False 
Смежные вопросы