Как написать программу которая угадывает число
Перейти к содержимому

Как написать программу которая угадывает число

  • автор:

Алгоритм для программы Python

Я недавно начал изучать Python. Эту задачу я решил, но она работает криво и не так, как должно быть. У меня возникла проблема, что я понимаю, как написать программу, но не могу правильно выразить мысли в коде.

left = 0 right = 1000 answer = None while answer != '=': answer = input() if answer == '=': print('Я угадал!') break elif answer == '': right = (right - left) // 2 + left print(right, '?') 

Отслеживать
задан 29 окт 2018 в 20:14
97 3 3 серебряных знака 15 15 бронзовых знаков
начинать явно стоит с вывода предложения 500. А иначе на что будет давать ответ пользователь ?
29 окт 2018 в 20:46

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

В целом ваше решение не такое уж и плохое, предлагаю несколько шагов по улучшению:

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

left = 0 right = 1001 current = (left + right) // 2 

Обратите внимание что right мы устанавливаем в 1001 а не 1000, это необходимо что бы при «угадывании» захватить число 1000 .

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

while answer != '=': print(current, '?') answer = input() 

В третьих, после этого можно внести небольшие изменения в цепочку if-elif , этот вариант отличается от вашего тем что здесь изменяются только границы нашего вычисления и добавлена обработка некорректного ввода

 if answer == '=': print('Я угадал!') break elif answer == '>': left = current elif answer == ',  

И самом конце цикла добавляем сточку с вычислением текущего значения

current = (left + right) // 2 

Код полностью

left = 0 right = 1001 current = (left + right) // 2 answer = None while answer != '=': print(current, '?') answer = input() if answer == '=': print('Я угадал!') break elif answer == '>': left = current elif answer == ',  

Решаем кодом: программа угадает число за 7 попыток

Недавно у нас была задачка про то, как угадать любое число от 1 до 100 за 7 попыток. Кратко логика такая:

  1. Оппонент загадывает целое число от 1 до 100.
  2. Мы называем своё целое число в этом диапазоне.
  3. Оппонент говорит, наше число больше или меньше, чем то, которое он загадал.
  4. Удивительно то, что за 7 попыток можно гарантированно угадать любое число от 1 до 100.

Секрет решения в том, что с каждой попыткой мы делим диапазон поиска числа вдвое. Например, наша первая догадка будет 50, и после неё мы узнаем, в каком отрезке искомое число: от 1 до 50 или от 51 до 100. Например, оно больше 50. Мы берём диапазон чисел от 51 до 100 и делим его пополам — получается 75. Это следующее предположение. И так мы «складываем вдвое» область поиска, пока не останется одно число. А математические законы таковы, что если 100 поделить на 2 семь раз подряд, получится плюс-минус единица.

Теперь сделаем следующий шаг — автоматизируем эту игру в виде простого веб-приложения. Пусть потеет машина.

Логика угадывателя

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

Сделаем проект в виде HTML-страницы: так нам будет удобнее выводить сообщения, а пользователю — нажимать на кнопки.

Готовим страницу

За основу возьмём страницу со стилями из проекта про калькулятор и выкинем из неё всё лишнее. Заодно сразу наполним её двумя элементами:

  1. Приветственной надписью, которая скажет, что нужно сделать.
  2. Кнопкой, по нажатию на которую запустится игровой скрипт.

    Как угадать число от 0 до 100 /*задаём общие параметры для всей страницы: шрифт и отступы*/ body < text-align: center; margin: 10; font-family: Verdana, Arial, sans-serif; font-size: 16px; >/* внешний вид кнопок */ button   

// обрабатываем нажатие на стартовую кнопку function start()

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

Скрываем элементы

Чтобы скрыть то, что сейчас на экране, мы сделаем так:

  1. В том же проекте с калькулятором возьмём код, который добавляет и убирает классы у разных элементов на странице.
  2. Добавим класс скрытия текущим элементам.

Первый пункт делается просто — добавим в стили такой блок:

А чтобы скрыть элементы, в стартовой функции напишем две команды:

// скрываем приветственную надпись и кнопку
document.getElementById("startText").classList.add("notOnScreen");
document.getElementById("startButton").classList.add("notOnScreen");

Всё, теперь при нажатии на кнопку у нас снова будет пустая страница.

Добавляем элементы с интерфейсом игры

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

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

Игровой интерфейс будет простой: текст с угадыванием и кнопки. В тексте мы сразу выводим номер попытки и середину нашего диапазона. Если попытки закончились — называем число. Чтобы за всем этим следить, сразу заведём нужные переменные:

// границы, в которых мы угадываем число var min = 0; var max = 100; // середина диапазона var middle = Math.floor((min + max)/2); // количество попыток var stage = 1;

Кнопки изначально будут скрыты с помощью класса notOnScreen, а при нажатии на каждую будет срабатывать своя функция. До них мы дойдём чуть позже, пока просто пропишем механику на странице под прошлыми элементами:

  Теперь, чтобы магия сработала, добавим этот код в функцию start():
// показываем текст с первой попыткой document.getElementById("question").classList.remove("notOnScreen"); document.getElementById("question").innerHTML = "Попытка " + stage + ": " + middle; // и три игровые кнопки document.getElementById("small").classList.remove("notOnScreen"); document.getElementById("bingo").classList.remove("notOnScreen"); document.getElementById("big").classList.remove("notOnScreen");

Решаем кодом: программа угадает число за 7 попыток

Обрабатываем нажатия на кнопки

Задача кнопок «Больше» и «Меньше» — сократить пополам диапазон возможных значений. Для этого они делят его пополам и округляют до целого числа. Проблема в том, что иногда компьютер может округлить число обратно до минимальной или максимальной границы и предложить это же число заново.

Чтобы такого не было, добавим в функции простую проверку: если новая граница совпадает с минимальным или максимальным значением диапазона, то принудительно двигаем её на единицу в нужную сторону.

Финальный штрих: добавим в каждую функцию в конце проверку на выигрыш. Так как проверка везде одинаковая, то сделаем её отдельной функцией.

// если загадано число, которое меньше, чем на экране function smallClick() < // уменьшаем диапазон max = middle; // находим новую середину диапазона middle = Math.floor((min + max)/2); // если при округлении середина совпала с текущей верхней границей — уменьшаем её на единицу if (max == middle) < middle -= 1; >// проверяем результат checkGame(); > // если загадано число, которое больше, чем на экране function bigClick() < // уменьшаем диапазон min = middle; // находим новую середину диапазона middle = Math.floor((min + max)/2); // если при округлении середина совпала с текущей нижней границей — увеличиваем её на единицу if (min == middle) < middle += 1; >// проверяем результат checkGame(); > // если мы угадали function bingoClick() < // уменьшаем диапазон до одного числа max = middle; min = middle; // проверяем результат checkGame(); >

Решаем кодом: программа угадает число за 7 попыток

Добавляем проверку на выигрыш

Если наш диапазон сузился до одного числа — значит, мы его нашли и можно выводить сообщение о победе. Также сразу предусмотрим сценарий, когда игрок жульничает и специально нажимает не те кнопки:

// проверяем, угадали или нет function checkGame() < // если в диапазоне осталось только одно число — называем его if (min == max)< document.getElementById("question").innerHTML = "Вы загадали число " + min; // убираем кнопки document.getElementById("small").classList.add("notOnScreen"); document.getElementById("bingo").classList.add("notOnScreen"); document.getElementById("big").classList.add("notOnScreen"); // игра закончена return; >// увеличиваем счётчик попыток stage += 1; if (stage == 8) < // выводим сообщение об ошибке document.getElementById("question").innerHTML = "Жульничать — нехорошо!"; >// выводим новое предположение на экран document.getElementById("question").innerHTML = "Попытка " + stage + ": " + middle; >

Готовый код

    Как угадать число от 0 до 100 /*задаём общие параметры для всей страницы: шрифт и отступы*/ body < text-align: center; margin: 10; font-family: Verdana, Arial, sans-serif; font-size: 16px; >/* внешний вид кнопок */ button < font-family: Verdana, Arial, sans-serif; font-size: 16px; margin: 10px; padding: 10px; >.notOnScreen   

Задача 10. Игра «Компьютер угадывает число» (Python)

Поменяйте мальчика и компьютер из прошлой задачи местами. Теперь мальчик загадывает число между 1 и 100 (включительно). Компьютер может спросить у мальчика: «Твоё число равно, меньше или больше, чем число N?», где N — число, которое хочет проверить компьютер. Мальчик отвечает одним из трёх чисел: 1 — равно, 2 — больше, 3 — меньше.

Напишите программу, которая с помощью цепочки таких вопросов и ответов мальчика угадывает число.

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

Что оценивается

Задача 10. Игра «Компьютер угадывает число» (Python)

  • результат вычислений корректен;
  • input содержит корректное приглашение для ввода;
  • правильное употребление пробелов после запятых и при бинарных операциях.
  • правильно оформленный input, без пустого приветствия для ввода (видео 2.3);
  • переменные имеют значащие имена, не только a, b, c, d (видео 2.3);
  • правильное употребление пробелов после запятых и при бинарных операциях;
  • отсутствие пробелов после имён функций и перед скобками: “print ()”,“input ()” — неверно, “print()” — верно;
  • правильно оформлены блоки if-elif-else, отступы одинаковы во всех блоках одного уровня:
  • переменные имеют корректные названия, в качестве имён не используются имена встроенных функций (список встроенных функций — официальная документация).
Советы и рекомендации
  • Стиль оформления программ на языке Python PEP8.
    Оригинальный документ PEP8 (на английском).
  • Приоритет арифметических операций PEP8 (мы вводим and, or).
    Список встроенных функций (официальная документация).

Задача 10. Игра «Компьютер угадывает число» язык кода Python помогите пожалуйста

Поменяйте мальчика и компьютер из прошлой задачи местами. Теперь мальчик загадывает число между 1 и 100 (включительно). Компьютер может спросить у мальчика: «Твое число равно, меньше или больше, чем число N?», где N — число, которое хочет проверить компьютер. Мальчик отвечает одним из трёх чисел: 1 — равно, 2 — больше, 3 — меньше.
Напишите программу, которая с помощью цепочки таких вопросов и ответов мальчика угадывает число.
Дополнительно: сделайте так, чтобы можно было гарантированно угадать число за семь попыток.

Лучший ответ

Начинаем с числа 64
до него 63 варианта, после него 35 вариантов ( "округляем" до 63 )
По получении ответа делим "варианты на 3 группы
31 число, 1 число, 31 число
итд (15/1/15, 7/1/7, 3/1/3, 1/1/1 )
Получается за 6 вопросов гарантированно "угадываем"

┴═╦╕47™Мудрец (16452) 2 года назад
ну ты компьютер))
неизвестный артистУченик (209) 2 месяца назад
ну как же без ДЦП ?)))
Остальные ответы

g=50;l=[25,12,6,3,2,1,1];s="Твое число равно, меньше или больше, чем число %s?"
while l:
print(s%g);i=input()
if i=='1':print('Твое число -',g);break
else:g+=l.pop(0)*[i]
print('Твое число -',g)

P.S. заменив и игрока тоже на компьютер, проверил - угадывает все правильно и не больше, чем за 7 шагов

куда код вводить
?
Максим ЖарковУченик (151) 9 месяцев назад
в паскаль мб
неизвестный артистУченик (209) 2 месяца назад

start = 0
finish = 101
count = 0

while True:
N = (start + finish) // 2
print('Загаданное число равно, меньше пли больше', N)
answer = int(input('1 - равно, 2 - меньше, 3-больше '))
count += 1

if answer == 1:
print('Я угадал! Ура! c', count, 'попытки')
break

elif answer == 2:
finish = N

elif answer == 3:
start = N

ViSk XRuleZzzУченик (165) 1 год назад

Не работает должным образом, например если загадали число 60:
Загаданное число равно, меньше пли больше 50
1 - равно, 2 - меньше, 3-больше 3
Загаданное число равно, меньше пли больше 75
1 - равно, 2 - меньше, 3-больше 2
Загаданное число равно, меньше пли больше 62
1 - равно, 2 - меньше, 3-больше 3
Загаданное число равно, меньше пли больше 68
1 - равно, 2 - меньше, 3-больше 2
Загаданное число равно, меньше пли больше 65
1 - равно, 2 - меньше, 3-больше 2
Загаданное число равно, меньше пли больше 63
1 - равно, 2 - меньше, 3-больше 2
Загаданное число равно, меньше пли больше 62
1 - равно, 2 - меньше, 3-больше 2
Загаданное число равно, меньше пли больше 62
1 - равно, 2 - меньше, 3-больше

ViSk XRuleZzz Ученик (165) Не работает должным образом если finish = 100, т.е. если мы диапазон сделаем меньше

УПРАВЛЯЮЩАЯ КОМПАНИЯУченик (104) 2 месяца назад
вы проверяете свой код, прежде чем отправить ?

просто скопируй!
import random
guessesTaken = 0
print("Желаешь разбогатеть, друг?")

myName = input("скажи имя!:")
number = random.randint(1,20)
print("Ну тогда приступим? "+myName+", я загадал число от одного до 20")
while guessesTaken < 6:
print("Как ты думаешь, какое?") #Перед функцией print() должно быть 4 пробела
guess = input()
guess = int(guess)
guessesTaken = guessesTaken+1
if guess < number:
print("Мое число больше твоего") #Перед функцией print() должно быть 8 пробелов
if guess > number:
print("Мое число меньше твоего")
if guess == number:
break
if guess == number:
guessesTaken = str(guessesTaken)
print("Превосходно "+myName+"! Ты угадал число с "+guessesTaken+" попытки. Твой выигрыш 10 очков.")
if guess != number:
number = str(number)
print("Жаль, но у тебя не осталось попыток. Я загадал число "+number+". Ты проиграл… Эй! Вы! Двое! Живо! Снимите ка с него шкуру!")

неизвестный артистУченик (209) 2 месяца назад
говнокодер, ты проверил свой код, прежде чем его отправить ?

start = int(1)
finish = int (100)
number_attempts = 0
while number_attempts number_attempts += 1
n = (start + finish) // 2
print("Число n равно: ", n)
prompt = int(input("Твоё число равно, меньше или больше, чем n "))
if prompt == 1 :
print("Урра! Угадал! с ", number_attempts, "попытки")
break
elif prompt == 2 :
finish = n
elif prompt == 3 :
start = n

start = 1
finish = 100
count = 0
while count __number = (start + finish) // 2
__print('Загаданное число равно, меньше или больше', number)
__answer = int(input('1 - равно, 2 - больше, 3 - меньше '))
__count += 1
__if answer == 1:
____print("Ура! Угадал! с", count, "попытки.")
____break
__elif answer == 2:
____start = number
__elif answer == 3:
____finish = number

михаил шатцУченик (123) 5 месяцев назад
Супер! коротко и четко!

start = 1
finish = 100
count = 0
while count number = (start + finish) // 2
print('Загаданное число равно, меньше или больше', number)
answer = int(input('1 - равно, 2 - больше, 3 - меньше '))
count += 1
if answer == 1:
print("Ура! Угадал! с", count, "попытки.")
break
elif answer == 2:
start = number
elif answer == 3:
finish = number

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *