Игра в угадайку Python с подсказками

Новичок Python (3.7) здесь. Эта игра в угадайку дает подсказки по дальности:

  • Cold
  • Warm
  • Hot

В зависимости от того, насколько близок к ответу игрок.

Проблема: как добавить дополнительные 3 дополнительные подсказки:

  • Colder

  • Warmer

  • Hotter

    Colder используется, если следующее предположение находится дальше от ответа.
    Warmer используется, если следующее предположение ближе к ответу.
    Hotter используется вместо Warmer, если он находится в диапазоне Hot.

Первое предположение дает подсказки диапазона Cold, Warm или Hot.

Последующие догадки будут давать дополнительные подсказки Colder или Warmer/Hotterесли, пока они попадут в тот же диапазон, что и предыдущая догадка.

Если они выпадают из диапазона, сначала будут созданы подсказки диапазона Cold, Warm или Hot, а тогдаColder или Warmer/Hotter в этом диапазоне. другими словами, подсказки диапазона Cold, Warm или Hot имеют более высокий приоритет, чем инкрементные Colder или Warmer/Hotter.

print("The secret number is somewhere between 0 and 100. You have 5 guesses.")
user_input = int(input('Make a guess '))

count = 0

while user_input is not 41 and count < 4:
    count = count + 1
    how_close_to_answer = 41 - user_input
    if 5 < how_close_to_answer.__abs__() < 20:
        user_input = int(input(f'Warm. Remaining guesses {5 - count} '))
    elif how_close_to_answer.__abs__() >= 20:
        user_input = int(input(f'Cold. Remaining guesses {5 - count} '))
    else:
        user_input = int(input(f'Hot. Remaining guesses {5 - count} '))


if user_input is not 41:
    print('You Lose!')
else:
    print('You Win!')
    print(f"It took you {count + 1} guesses to get this correct.")

Например (в случае бесконечных догадок n):

  1. догадки игрока = 10, желаемый результат 'Cold. Осталось догадок (n-1) '
  2. следующее предположение = 15, желаемый результат 'Warmer. Осталось догадок (n-2) '
  3. следующее предположение = 12, желаемый результат 'Colder. Осталось догадок (n-3) '
  4. следующее предположение = 36, желаемый результат 'Hot. Осталось догадок (n-4) '
  5. следующее предположение = 37, желаемый результат 'Hotter. Осталось догадок (n-5) '
  6. следующее предположение = 30, желаемый результат 'Warm. Осталось догадок (n-6) '

В 4. примере - число 36 больше Warmer, чем предыдущие 12, но оно также попадает в диапазон Hot, поэтому вместо него дается подсказка Hot.

в 6. примере - число 30 Colder, чем предыдущие 37, но оно также попадает в диапазон Warm, поэтому вместо него дается подсказка Warm.

Прежде всего, нужно ТОЧНО решить, как вы хотите, чтобы эти дополнительные подсказки работали. Если бы мне пришлось угадывать, вы бы хотели, чтобы все догадки после первого говорили либо warmer, либо colder, либо HOT. Если игрок угадывает HOT предположение, а затем получает следующее в пределах диапазона HOT, должен ли ваш код повторять HOT снова или одно из warmer / colder?

Hoog 15.07.2019 20:39

В дополнение к предложению @Hoog вы можете сделать это в зависимости от того, идет ли их предположение к ответу или отклоняется от него. то есть угадай 35, потом 40, "теплее", потом 38, "холоднее". Таким образом, вы говорите, что они становятся «теплее», если они переходят от 10 к 15, даже если они находятся в одной и той же группе. Затем вы можете сделать это так, чтобы, если они находятся в пределах 10% от ответа, он говорил «горячо».

Thomas Smyth 15.07.2019 21:00

если предположение попадает в диапазон «Холодный», он сначала скажет «Холодный» и «Теплее» / «Холоднее», пока остается в диапазоне «Холодный». То же самое касается «Теплого» диапазона. Для диапазона «Горячий» то же самое, за исключением «Горяче»/«Холоднее» вместо «Теплее»/«Холоднее». т.е. 20 -> «Холоднее», затем 21 -> «Теплее», затем 25 -> «Теплее», затем 24 -> «Холоднее», затем 44 -> «Горяче», затем 43 -> «Горяче», затем 45 -> «Холоднее», затем 15 -> «Холоднее». В основном сначала будет объявлено имя диапазона, а затем относительный прогресс внутри этого диапазона.

iguors 16.07.2019 22:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
1 066
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я взял num как случайно сгенерированное число вместо 41.

import random 

print("The secret number is somewhere between 0 and 100. You have 5 guesses.")
user_input = int(input('Make a guess '))

count = 0
num = random.randint(1,101)

while user_input is not num and count < 4:
    #uncomment the line below to see random generated number
    #print('Generated Random Number= '+str(num))
    count = count + 1
    how_close_to_answer = num - user_input

    if abs(how_close_to_answer)>5 and abs(how_close_to_answer) <20 :
        user_input = int(input(f'Warm. Remaining guesses {5 - count} '))
    elif abs(how_close_to_answer) >= 20 :
        user_input = int(input(f'Cold. Remaining guesses {5 - count} '))
    else:
        user_input = int(input(f'Hot. Remaining guesses {5 - count} '))


if user_input is not num:
    print('You Lose!')
else:
    print('You Win!')
    print(f"It took you {count + 1} guesses to get this correct.")

Насколько я понял, вышеприведенная программа генерирует случайное число, и вам нужно угадать это число,

  • если ваше угаданное число меньше или эквивалентно 5 цифрам ближе к этому случайному числу, оно сообщит вам hot
  • если он больше 5 и меньше 20, то он скажет вам warm
  • больше, чем 20, это даст вам cold

Надеюсь, что это поможет вам !!

Это изменяет 41 на случайное число, но не добавляет 2 новые подсказки «Холоднее или Теплее». если предположение попадает в диапазон «Холодный», он сначала скажет «Холодный» и «Теплее» / «Холоднее», пока остается в диапазоне «Холодный». То же самое касается «Теплого» диапазона. Для диапазона «Горячий» то же самое, за исключением «Горяче»/«Холоднее» вместо «Теплее»/«Холоднее». т.е. 20 -> «Холоднее», затем 21 -> «Теплее», затем 25 -> «Теплее», затем 24 -> «Холоднее», затем 44 -> «Горяче», затем 43 -> «Горяче», затем 45 -> «Холоднее», затем 15 -> «Холоднее». В основном сначала будет объявлено имя диапазона, а затем относительный прогресс внутри этого диапазона.

iguors 16.07.2019 22:55
Ответ принят как подходящий

Это самое близкое, что я мог получить к тому, что вы просили. На мой взгляд, комментарии к вашему исходному вопросу стоит прочитать, но я думаю, что это именно то, о чем вы просили в вопросе.

print("The secret number is somewhere between 0 and 100. You have 5 guesses.")
user_input = int(input('Make a guess '))

count = 0
last_distance = -1
while user_input is not 41 and count < 4:
    count = count + 1
    how_close_to_answer = (41 - user_input)
    how_close_to_answer = how_close_to_answer.__abs__()
    if how_close_to_answer <= 5 and last_distance > 5:
        user_input = int(input(f'Hot. Remaining guesses {5 - count} '))
    elif last_distance == -1:
        if 5 < how_close_to_answer < 20:
            user_input = int(input(f'Warm. Remaining guesses {5 - count} '))
        elif how_close_to_answer >= 20:
            user_input = int(input(f'Cold. Remaining guesses {5 - count} '))
        elif how_close_to_answer <= 5:
            user_input = int(input(f'Hot. Remaining guesses {5 - count} '))
    else:
        if how_close_to_answer < last_distance:
            if how_close_to_answer <= 5:
                user_input = int(input(f'Hotter. Remaining guesses {5 - count} '))
            else:
                user_input = int(input(f'Warmer. Remaining guesses {5 - count} '))
        elif how_close_to_answer > last_distance:
            user_input = int(input(f'Colder. Remaining guesses {5 - count} '))
    last_distance = how_close_to_answer


if user_input is not 41:
    print('You Lose!')
else:
    print('You Win!')
    print(f"It took you {count + 1} guesses to get this correct.")

Надеюсь, это то, что поможет

Спасибо, это почти идеальное решение. Есть 2 проблемы:

iguors 16.07.2019 22:00

1-й - когда ввод находится в «горячем» диапазоне, он перестает отслеживать, будет ли следующее предположение «теплее» или «холоднее». 2-й: если один и тот же номер вводится дважды подряд (от 1 до 35 и от 47 до 100), цикл прерывается преждевременно с сообщением «Вы потеряли сообщение».

iguors 16.07.2019 22:08

что вы хотите, чтобы произошло, если они введут один и тот же номер, вы не указали. Кроме того, не уверен, какова первая проблема после прочтения вашего исходного вопроса. Теплее/Холоднее все еще работает, даже если вход находится в горячем диапазоне (например, предположение 1 = 40 (выход = горячее), предположение 2 = 12 (выход = холоднее). Что требуется?

pjmaracs 18.07.2019 03:36

Это то, что вы хотите? Угадай 1 = 39 (выход = горячее), Угадай 2 = 40 (выход = горячее) Если это так, что, если порядок предположений был изменен на противоположный? Это все еще просто «Холоднее» (ааа, только что увидел ваш другой ответ. Похоже, единственная разница в том, что вам нужна более горячая функциональность. Сейчас редактирую)

pjmaracs 18.07.2019 14:00

Спасибо, это решает все. Другая проблема была довольно незначительной — если игрок ввел одно и то же число дважды подряд, цикл прервался с сообщением «Вы проиграли!» сообщение до того, как были использованы оставшиеся предположения. Исправлено, добавив else: user_input = int(input(f'Same. Remaining guesses {5 - count} ')) между 26-й и 27-й строками, чтобы решить случай, когда как_close_to_answer = last_distance

iguors 18.07.2019 17:40

Другие вопросы по теме