Игра в угадывание обратного числа Python

#python #algorithm

#python #алгоритм

Вопрос:

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

 Enter the range: 6
Think of a random number between 1 and 6 and press enter once done!
Is it smaller than 4, 'y' or 'n'?y
Is it smaller than 2, 'y' or 'n'?n
Is it smaller than 3, 'y' or 'n'?y
Wonderful it took me 3 questions to find out that you had the number 2 in mind!
  

Это мои коды до сих пор:

 import random

maxNum = int(input('Enter the range: '))
input('Think of a random number between 1 and '   str(maxNum)   ' and press enter once done!')
lowBound = 1
highBound = maxNum
response = ''
noOfGuesses = 0
numberHasBeenGuessed = False
randomNumber = random.randint(lowBound,highBound)

while not numberHasBeenGuessed:
    noOfGuesses  = 1
    response = input("Is it smaller than "   str(randomNumber)   ", 'y' or 'n'?")
    if response == "n" or response == 'N':
        lowBound = randomNumber   1   
        randomNumber = random.randint(lowBound,highBound)
    elif response == "y" or response == "Y":
        highBound = randomNumber - 1
        randomNumber = random.randint(lowBound,highBound)
    else:
        print ('Please only type y, Y, n or N as responses')
        
numberHasBeenGuessed = True        
print('Wonderful it took me '   str(noOfGuesses)   ' attempts to guess that you had the number '   str(randomNumber)   ' in mind')
  

Основной алгоритм работает, но каким-то образом он не может его обнаружить, когда число было «угадано»..
кто-нибудь знает, почему?

Я буду очень признателен за помощь 🙂

Ответ №1:

Вот версия, использующая try/except

 import random

maxNum = int(input('Enter the range: '))
input('Think of a random number between 1 and '   str(maxNum)   ' and press enter once done!')
lowBound = 1
highBound = maxNum
response = ''
noOfGuesses = 0
numberHasBeenGuessed = False
randomNumber = random.randint(lowBound,highBound)

while not numberHasBeenGuessed:
        noOfGuesses  = 1
        response = input("Is it smaller than "   str(randomNumber)   ", 'y', 'n', or 'Thats it'?")
        if response == "n" or response == 'N':
            lowBound = randomNumber   1
            
            try:
                randomNumber = random.randint(lowBound,highBound)
            except ValueError:
                numberHasBeenGuessed = True
        elif response == "y" or response == "Y":
            highBound = randomNumber - 1

            try:
                randomNumber = random.randint(lowBound,highBound)
            except ValueError:
                numberHasBeenGuessed = True
        else:
            print ('Please only type y, Y, n or N as responses')
        
           
print('Wonderful it took me '   str(noOfGuesses)   ' attempts to guess that you had the number '   str(randomNumber)   ' in mind')
  

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

Вы также могли бы поместить try/except предложения в a def , чтобы сделать его более компактным, поскольку это одни и те же фрагменты кода, но я не был уверен, разрешено это или нет для вашего проекта, поэтому я оставил его.

Ответ №2:

У вас есть numberHasBeenGuessed = True outside цикла while, что означает, что он не может быть вызван, пока цикл не закончится, поэтому он навсегда застрянет.

Когда дело доходит до вашего предположения, допустим, у меня есть число 7. Ваша программа спрашивает: «7 меньше или больше 7?» Очевидно, что это не имеет смысла, 7 равно 7. 7 не меньше и не больше 7: и ваша программа знает это и выходит из строя. Итак, вам нужно ввести новую опцию пользовательского ввода:

     import random
    
    maxNum = int(input('Enter the range: '))
    input('Think of a random number between 1 and '   str(maxNum)   ' and press enter once done!')
    lowBound = 1
    highBound = maxNum
    response = ''
    noOfGuesses = 0
    numberHasBeenGuessed = False
    randomNumber = random.randint(lowBound,highBound)
    
    while not numberHasBeenGuessed:
        noOfGuesses  = 1
        response = input("Is it smaller than "   str(randomNumber)   ", 'y', 'n', or 'Thats it'?")
        if response == "n" or response == 'N':
            lowBound = randomNumber   1   
            randomNumber = random.randint(lowBound,highBound)
            print(randomNumber)
        elif response == "y" or response == "Y":
            highBound = randomNumber - 1
            randomNumber = random.randint(lowBound,highBound)
            print(randomNumber)
        elif response == "Thats it": #New input option 'Thats it'
            numberHasBeenGuessed = True #Stops the while loop
        else:
            print ('Please only type y, Y, n or N as responses')
               
    print('Wonderful it took me '   str(noOfGuesses)   ' attempts to guess that you had the number '   str(randomNumber)   ' in mind')
  

Теперь вы можете ввести «Вот и все», когда ваше число угадано, и программа завершит работу с выводом, который вы хотите. (Конечно, измените входные данные и то, что не соответствует тому, что вы хотите)

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

Комментарии:

1. Да, я должен был сначала прокомментировать, прежде чем спрашивать, спасибо за помощь, но моя задача задана так, что она не требует нового параметра ввода и должна быть только y или n, если она меньше

2. Например, если взять из вывода, который я опубликовал выше, поскольку он меньше 4 и не меньше 2, ответ может быть только 2 или 3, но поскольку он меньше 3 из следующего qn, он должен быть 2

3. @TristonLoh Ах, хорошо, в этом случае используйте try / except — я напишу новый ответ.

4. Я бы использовал while lowBound < highBound: