2016-09-13 2 views
-1

Я делаю базовый код ножницы для школьной бумаги, но мои утверждения elif не работают.Заявления Elif не печатаются

def player1(x): 
    while x != 'rock' and x != 'paper' and x != 'scissors': 
     print("This is not a valid object selection") 
     x = input("Player 1? ") 

def player2(x): 
    while x != 'rock' and x != 'paper' and x != 'scissors': 
     print("This is not a valid object selection") 
     x = input("Player 2? ") 

def winner(): 
    player1(input("Player 1? ")) 
    player2(input("Player 2? ")) 
    if player1 == 'rock' and player2 == 'rock': 
     print('Tie') 
    elif player1 == 'paper' and player2 == 'paper': 
     print('Tie') 
    elif player1 == 'rock' and player2 == 'paper': 
     print('Player 2 wins') 
    elif player1 == 'paper' and player2 == 'rock': 
     print('Player 1 wins') 
    elif player1 == 'rock' and player2 == 'scissors': 
     print('Player 1 wins') 
    elif player1 == 'scissors' and player2 == 'rock': 
     print('Player 2 wins') 
    elif player1 == 'paper' and player2 == 'scissors': 
     print('Player 2 wins') 
    elif player1 == 'scissors' and player2 == 'paper': 
     print('Player 1 wins') 
    elif player1 == 'scissors' and player2 == 'scissors': 
     print('Tie') 

winner() 

Когда я запускаю этот код, он запрашивает 'Player 1?' и не примет ничего, кроме камня, бумаги или ножниц. Затем он продолжает делать то же самое для player2. Однако здесь заканчивается код, и он не будет запускать мои заявления elif и печатать, какой игрок выигрывает.

Редактировать: Solved. Спасибо, что помогли новичку. Я полностью забыл вернуть строки и присвоить их переменным.

+1

Ждать, 'player1' или' player2' не являются переменными, они являются ссылками на функции ... и вы сравниваете их со строками? Я также подумал бы вернуть «х» обратно вызывающему, если вы хотите использовать его в «победителе». – Li357

ответ

0

Ваши сравнения:

elif player1 == "rock" and player2 == "rock": 
# etc 

всегда терпят неудачу, так как player1 и player2 являются функциями.

Вместо этого вам необходимо вернуться из своих функций и назначить их переменным. Давайте выберем валидацию на минуту и ​​немного уменьшим ее.

def choose(prompt): 
    return input(prompt) 

def winner(a, b): 
    if a == 'rock': 
     if b == 'rock': return None 
     elif b == 'paper': return 2 
     elif b == 'scissors': return 1 
    elif a == 'paper': 
     # etc 

def play_game(): 
    p1_choice = choose("Player 1: ") 
    p2_choice = choose("Player 2: ") 
    return winner(p1_choice, p2_choice) 

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

RESULT_DICT = {"rock": {"rock": None, 
         "paper": 2, 
         "scissors": 1}, 
       "paper": {"rock": 1, 
         "paper": None, 
         "scissors": 2}, 
       "scissors": {"rock": 2, 
          "paper": 1, 
          "scissors": None}} 

def winner(a, b): 
    return RESULT_DICT[a][b] 
+1

Я бы, скорее всего, вернул None, если a == b else RESULT_DICT [a] [b] '... тогда вы можете удалить 33% этого dict. – TemporalWolf

+0

@TemporalWolf yep, мне тоже, затем сверните все варианты и все результаты в член класса Enums и выполните входную проверку таким образом. Но это ни здесь, ни там. –

+0

'return None if a == b else ((2 if b ==" Paper "else 1) if ==" Rock "else ((2 if b ==" Scissors "else 1) if a ==" Paper "else (2 if b ==" Rock "else 1)))' Нет необходимости в dict. Я увижу себя. – TemporalWolf

1

Назначение x внутри player1 ничего не делает. Как только функция вернется, значение, присвоенное x, будет удалено. Это означает, что вы отбрасываете свой вклад! Затем вы сравниваете функцию player1 с строкой , которая может соответствовать или не соответствовать вашему вводу.

Предложение для отладки: всякий раз, когда у вас есть проблема с управлением потоком, распечатайте управляющую переменную. Здесь, если вы печатаете player1, вы увидите что-то удивительное.

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