2014-09-27 2 views
0

В этом примере мы установим PH[0] в 'Ten of Hearts' и guess к 'Ten'«Пока не» ошибка - питон

Список «PH» представляет руку игрока в карточной игре Go Fish. Когда пользователь догадывается о карте, они должны угадать карту, которая соответствует карте в руке. Я написал этот блок кода, чтобы, если пользователь вводит недопустимое предположение (если угадание не находится в PH, они будут снова запрошены, чтобы ввести новое предположение)

Я чувствую, что у меня возникают проблемы с переменными в массив [guess1, guess2, guess3, guess4], но я не уверен.

Когда код выполнен, цикл продолжается вечно. Мне нужно уйти из цикла, чтобы вернуть предположение, чтобы его можно было ввести в следующую функцию.

Если кто-то может помочь мне решить проблему, которую я испытываю.

guess = str(raw_input("Make a guess : ")) 

guess11 = guess, 'of Hearts' 
guess1 = " ".join(guess11) 

guess22 = guess, 'of Diamonds' 
guess2 = " ".join(guess22) 

guess33 = guess, 'of Clubs' 
guess3 = " ".join(guess33) 

guess44 = guess, 'of Spades' 
guess4 = " ".join(guess44) 

while PH[0] not in [guess1, guess2, guess3, guess4] : 
    print "You do not have a card like that in your hand." 
    guess = str(raw_input("Make another guess : ")) 

    guess11 = guess, 'of Hearts' 
    guess1 = " ".join(guess11) 

    guess22 = guess, 'of Diamonds' 
    guess2 = " ".join(guess22) 

    guess33 = guess, 'of Clubs' 
    guess3 = " ".join(guess33) 

    guess44 = guess, 'of Spades' 
    guess4 = " ".join(guess44) 

return guess 
+5

Этот код болит глаза! Узнайте о написании кода [DRY] (http://en.wikipedia.org/wiki/Don't_repeat_yourself). Это сделает вашу жизнь намного проще. – Basic

+0

Он работает для меня, когда я устанавливаю 'PH [0]' '' Десять сердец' и 'угадываем'' 'Десять''. Петля выходит правильно. – interjay

+0

'raw_input' уже строка –

ответ

1

Вы только тестирование, если первая карта в руке игроков любого из догадывается. Вы должны проверить каждую карту в руке:

while not any(guess in PH for guess in [guess1, guess2, guess3, guess4]): 

Это происходит каждый догадывался карты и тесты, карты с руки, в свою очередь. any() останавливает цикл над догадками при обнаружении совпадения.

Лучшая идея по-прежнему заключается в использовании набор перекрестки:

guesses = {guess1, guess2, guess3, guess4} 
while not guesses.intersection(PH): 
    # ask for new guesses 

Вы хотите, чтобы избежать необходимости вводить ваш «попросить угадать» кода в два раза; начать цикл с while True и использовать break для завершения цикла, когда правильное предположение было сделано:

suits = ('Hearts', 'Diamonds', 'Clubs', 'Spades') 

while True: 
    guess = raw_input("Make a guess:") 
    guesses = {'{} of {}'.format(guess, suit) for suit in suits} 
    if guesses.intersection(PH): 
     # correct guess! 
     break 
    print "You do not have a card like that in your hand." 

Я использовал множество понимания строить догадки в цикле.

+1

@EvanCooper: но ваш цикл while не заканчивается до тех пор, пока в 'PH [0]' не будет соответствующей карты. Эти другие части никогда не будут достигнуты. –

+0

Хорошо, теперь я понимаю. огромное спасибо –

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