Изучение Python — игра с числами

#python #loops #random

#python #циклы #Случайный

Вопрос:

Я новичок в Python. Я пытаюсь написать небольшую игру, которая просит конечного пользователя выбрать число от 1 до 1000 и сохранить его в голове (число не предоставляется программе). Программа должна быть в состоянии найти число в пределах 10 догадок. Как я обычно делаю, я пошел по неверному пути. Моя программа работает большую часть времени, но бывают случаи, когда она не находит число менее чем за 10 догадок. Вот мой код:

 # script to guess a user's number between 1 and 1000 within 10 guesses

# import random so we can use it to generate random numbers
from random import randint

# Variables
lowerBound = 1
upperBound = 1000
numGuesses = 1
myGuess = 500
failed = False

# Welcome Message
print("#####################################################################################################"
      "n#                                                                                                   #"
      "n#   Please think of a number between 1 and 1000.  I will attempt to guess the number in 10 tries.   #"
      "n#                                                                                                   #"
      "n#####################################################################################################")

while numGuesses <= 10:

    # if the lower and upper bounds match we've found the number
    if lowerBound == upperBound:
        print(f"nYour number is {str(lowerBound)}.  It took me '{str(numGuesses)} guesses!")
        break

    print(f"nIs the number {str(myGuess)}?  If correct, type CORRECT.  If low, type LOW.  If high, type HIGH.")
    # uncomment for var output
    # print(f"nGuesses = {str(numGuesses)}nLower bound = {str(lowerBound)}nUpper bound = {str(upperBound)}")
    userFeedback = input("nResponse: ").upper()

    if userFeedback == 'HIGH':
        print(f"nGuess #{str(numGuesses)} was too high")
        if numGuesses == 10:
            failed = True
            break
        upperBound = myGuess - 1
        myGuess = randint(lowerBound, upperBound)
    elif userFeedback == 'LOW':
        print(f"nGuess #{str(numGuesses)} was too low")
        if numGuesses == 10:
            failed = True
            break
        lowerBound = myGuess   1
        myGuess = randint(lowerBound, upperBound)
    elif userFeedback == 'CORRECT':
        print(f"nYour number is {str(myGuess)}!  It took me {str(numGuesses)} guesses!")
        break

    numGuesses  = 1

if failed:
    print(f"nMy final guess of {str(myGuess)} was not correct.  I wasn't able to guess your number in 10 tries.")
  

Кажется очевидным (сейчас), что способ, которым я сокращаю числа, не сработает. Первоначально я думал спросить, было ли это 500, а если меньше, спросить, было ли это 250. Если снова понизить, спросите, было ли это 125, и так далее. Если выше, спросите, было ли это 750, 875 и так далее. Это правильный подход здесь?

Я слишком долго думал об этом, и я считаю, что я приготовил свой мозг. Спасибо!

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

1. Не используйте случайное число для следующего предположения. Используйте (upperBound - lowerBound) / 2 .

2. не используйте random!!! это ставит все на волю случая

3. ваш первоначальный план был правильным. почему вместо этого вы использовали случайное число?

4. @PeterM. Если бы только у меня был ответ на это. 🙂 Я попробую преобразовать его. У кого-нибудь есть пример такого подхода?

5. myGuess = int((Верхняя граница-нижняя граница) / 2)

Ответ №1:

 myGuess = int(math.ceil((myGuess) / 2))
  

неверно.

Если вы сузили диапазон до между 6 и 8 и вы предполагали 7 , ваш предыдущий код будет вызывать 4 вместо этого, который находится за пределами вашего диапазона поиска.

 if userFeedback == 'HIGH':
    print(f"nGuess #{numGuesses} was too high")
    upperBound = myGuess - 1
elif userFeedback == 'LOW':
    print(f"nGuess #{numGuesses} was too low")
    lowerBound = myGuess   1
myGuess = int(lowerBound   ((upperBound - lowerBound) / 2))
  

Ответ №2:

Я обновил свой код, и я думаю, что он у меня есть. Спасибо за советы.

 # script to guess a number between 1 and 1000 within 10 guesses

# Variables
lowerBound = 1
upperBound = 1000
numGuesses = 1
myGuess = 500

# Welcome Message
print("#####################################################################################################"
      "n#                                                                                                   #"
      "n#   Please think of a number between 1 and 1000.  I will attempt to guess the number in 10 tries.   #"
      "n#                                                                                                   #"
      "n#####################################################################################################")

while numGuesses <= 10:

    # uncomment next line for var output
    # print(f"nGuesses = {numGuesses}nLower bound = {lowerBound}nUpper bound = {upperBound}")

    print(f"nIs the number {myGuess}?  If correct, type CORRECT.  If low, type LOW.  If high, type HIGH.")
    userFeedback = input("nResponse: ").upper()

    if userFeedback == 'HIGH':
        print(f"nGuess #{numGuesses} was too high")
        upperBound = myGuess
        myGuess = (lowerBound   myGuess) // 2
    elif userFeedback == 'LOW':
        print(f"nGuess #{numGuesses} was too low")
        lowerBound = myGuess
        myGuess = (upperBound   myGuess   1) // 2
    elif userFeedback == 'CORRECT':
        print(f"nYour number is {myGuess}!  It took me {numGuesses} guesses!")
        break

    numGuesses  = 1