Перейти к содержимому

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

  • автор:

Алгоритм для программы 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 серебряных знака 16 16 бронзовых знаков
начинать явно стоит с вывода предложения 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   

Бинарная угадайка python

Напишите программу, которая отгадывает загаданное целое число от 1 до 1000 (пользователь загадывает число в уме и не сообщает программе). Угадать число нужно не более чем за 10 попыток. На каждую попытку пользователь отвечает, что названное число больше загаданного (вводит символ “>”), меньше загаданного (“<”) или угадано правильно (“=”).

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

Например, для диапазона от 1 до 8 (а не до 1000) это могло бы выглядеть так (загадано число 5):

Лучший ответ
РусланЗнаток (435) 5 лет назад

Со временем программа тупеет и начинает на один и тот-же знак прибавлять и убавлять одну единичку
Например:
">" или "" или "" или "" или "" или "" или "

Программа "Угадай число"

Отгадать целое число, которое "загадал" компьютер в определенном диапазоне.

  • a – число, "загаданное" компьютером;
  • b – очередное число, вводимое пользователем.

Алгоритм решения задачи:

Программа генерирует псевдослучайное число, которое записывается в переменную a .

Пока число a не совпадет с числом b , пользователю будет предлагаться ввести очередное число. При этом, если b > a , то на экран будет выдаваться сообщение "Много". Иначе будет проверяться условие b < a . При его положительном значении появится сообщение "Мало", иначе сообщение "Угадал".

Не трудно понять, что если b не больше и не меньше a , то значит оно равно a . В таком случае логическое выражение при while вернет false, и цикл прервется.

Программа на языке Паскаль:

var a,b: integer; begin randomize; a := random(100); while a <> b do begin write('Введи число: '); readln(b); if b > a then writeln('Много') else if b < a then writeln('Мало') else writeln('Угадал'); end; end.

Примечание. Угадать число всегда можно не более чем через 6-7 попыток, если делить каждый оставшийся диапазон пополам.

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

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