Как ввести строку и присвоить ей номер - PullRequest
0 голосов
/ 09 мая 2020

Привет, я занимаюсь личным python обучением, и у меня есть проблема с практикой, которую я пытаюсь решить. Основная цель - поиграть в ножницы камень-бумага с компьютером. Вы должны ввести «бумага», «камень» или «ножницы» в качестве ответа пользователя, и компьютер случайным образом сгенерирует число от 1 до 3, соответствующее конкретному выбору. Я могу заставить программу работать нормально, если пользователь вводит число от 1 до 3, но вопрос не об этом. Мне кажется, я пробовал все, например, присвоить каждому имени соответствующий номер, создать оператор if then, который затем переназначает выбор числовому значению, но он всегда просто застревает после приглашения ввода и не продвигается вперед с кодом . Я знаю, что проблема, скорее всего, кроется в строке 6, потому что это последнее место, которое она выполняет ... не знаю, как это исправить. Также, если кто-нибудь может дать мне несколько указаний о том, как это может выглядеть немного чище или примерно так должно выглядеть с точки зрения эффективности и чистоты. Имейте в виду, что я не изучил ничего слишком продвинутого, например, списки словарей и т. Д. Проблема должна быть решена на данный момент с использованием материала basi c. Спасибо!

import random

def main():
    global user_answer
    print('lets play paper rock scissors')
    number = comp_answer()
    user_answer = int(input('What do you choose?')) <--- # i know the change would be 
    while number = comp_answer():                        # here.... maybe str(input(' ')) 
        tie(number)                                      # then define the choices? tried 
    paper_rock_scissors(number)                          # that and failed not sure if i'm 
                                                         # doing it wrong.

def comp_answer():
    number = random.randint(1,4)
    return number

def tie(number):
    print("its a tie!")
    print ("tie breaker")
    user_answer = input('What do you choose?')

def paper_rock_scissors(number):

    if number == 3 and user_answer == 1:
        print("computer: scissors")
        print("you: ",user_answer )
        print("you won!")
        print("rocks smashes scissors")

    elif number == 3 and user_answer == 2:
        print("computer: scissors")
        print("you: ",user_answer )
        print("Game over")
        print("scissors cuts paper")

    elif number == 1 and user_answer == 3:
        print("computer: rock")
        print("you: ",user_answer )
        print("Game over")
        print("rocks smashes scissors")
    elif number == 2 and user_answer == 3:
        print("computer: paper")
        print("you: ",user_answer )
        print("you won!")
        print("scissors cuts paper")

    elif number == 1 and user_answer == 2:
        print("computer: rock")
        print("you: ",user_answer )
        print("you won!")
        print("paper covers rock")
    elif user_answer == 1 and number == 2:
        print("computer: paper")
        print("you: ",user_answer )
        print("Game over")
        print("paper covers rock")
main()

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Проблема в вашей программе заключается в

"while number = comp_answer():"

Это должно быть "==" для сравнения. «=» используется для присваивания, и здесь нам нужно приравнивать к оценке. Кроме того,

while number == comp_answer(): 

на самом деле не соответствует ie. Он просто проверяет, совпадает ли номер сохраненного значения с выводом comp_answer (). Вы можете приравнять "user_input" к "number", чтобы проверить то же самое. PS comp_answer () нужно снова вызвать в t ie function

Попробуйте следующее: я поместил операторы печати в новую функцию, которая делает программу более легкой для чтения и короче.

import random

def main():
    global user_answer
    print('lets play paper rock scissors')
    number = comp_answer()
    user_answer = int(input('What do you choose?'))  
    while number == user_answer:                        
        tie()                                       
    paper_rock_scissors(number)                          

def comp_answer():
    number = random.randint(1,4)
    return number

def tie():
    global number
    print("its a tie!")
    print ("tie breaker")
    number = comp_answer()
    user_answer = input('What do you choose?')

def print_ans(computer, user, explanation, win):
    print("computer: ", computer)
    print("you: ", user)
    print(explanation)
    if win:
        print("you won!")
    else:
        print("Game over")

def paper_rock_scissors(number):
    if number == 3:
        if user_answer == 1:
            print_ans("scissors", "rock", "rocks smashes scissors", win=True)
        else:
            print_ans("scissors", "paper", "scissors cut paper", win=False)
    elif number == 1:
        if user_answer == 3:
            print_ans("rock", "scissors", "rocks smashes scissors", win=False)
        else:
            print_ans("rock", "paper", "paper covers rock", win=True)
    else:
        if user_answer == 1:
            print_ans("paper", "rock", "paper covers rock", win=False)
        else:
            print_ans("paper", "scissors", "scissors cut paper", win=True)


main()

Если вы хотите, чтобы пользователь вводил строку вместо целых чисел, код будет выглядеть примерно так (заметьте, я буду использовать словари , поскольку это упрощает задачу, и я думаю, что это важно чтобы каждый знал о них, поэтому прочтите их немного):

import random

num_mappings = {"rock":1 , "paper":2 , "scissors":3}

def main():
    global user_answer
    print('lets play paper rock scissors')
    number = comp_answer()
    user = input('What do you choose?') 
    user_answer = num_mappings[user] 
    while number == user_answer:                        
        tie()                                       
    paper_rock_scissors(number)                          

def comp_answer():
    number = random.randint(1,4)
    return number

def tie():
    global number
    print("its a tie!")
    print ("tie breaker")
    number = comp_answer()
    user = input('What do you choose?') 
    user_answer = num_mappings[user]

def print_ans(computer, user, explanation, win):
    print("computer: ", computer)
    print("you: ", user)
    print(explanation)
    if win:
        print("you won!")
    else:
        print("Game over")

def paper_rock_scissors(number):
    if number == 3:
        if user_answer == 1:
            print_ans("scissors", "rock", "rocks smashes scissors", win=True)
        else:
            print_ans("scissors", "paper", "scissors cut paper", win=False)
    elif number == 1:
        if user_answer == 3:
            print_ans("rock", "scissors", "rocks smashes scissors", win=False)
        else:
            print_ans("rock", "paper", "paper covers rock", win=True)
    else:
        if user_answer == 1:
            print_ans("paper", "rock", "paper covers rock", win=False)
        else:
            print_ans("paper", "scissors", "scissors cut paper", win=True)


main()

Однако имейте в виду, что ваш код не сработает, если пользователь введет что-нибудь, кроме «камень», «бумага» или "ножницы". Я предлагаю вам изучить обработку исключений , чтобы получить хороший gr asp и улучшить эти аспекты.

0 голосов
/ 09 мая 2020

В условии while l oop вы не сравниваете выбор пользователя с выбором программы.

def main():
    global user_answer
    print('lets play paper rock scissors')
    number = comp_answer()
    user_answer = int(input('What do you choose?'))
    while user_answer == number:
        tie(number)
        number = comp_answer()
    paper_rock_scissors(number)

Исправьте это, сравнив вместо этого user_answer и number. Вам также необходимо указать, что user_answer является глобальным в tie. Тот факт, что comp_answer пересчитывается в условии while, приведет к тому, что number будет иметь неверное значение при передаче в rock_paper_scissors. Эти три изменения должны решить проблему.

Что касается чистоты, глобальные переменные - вообще плохая практика. Вы можете изменить это, изменив tie(number) на user_answer = tie(number) и добавив user_answer в качестве аргумента к rock_paper_scissors. Функция tie также не использует свой аргумент, поэтому его можно легко удалить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...