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

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

  • автор:

Алгоритм для программы 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 4 4 серебряных знака 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 == ',  

Упражнение из книги Страуструпа. Программа угадай число. Можно ли написать лучше?

Напишите программу, угадывающую число. Пользователь должен задумать
число от 1 до 100, а программа должна задавать вопросы, чтобы выяснить, какое
число он задумал (например, “Задуманное число меньше 50”). Ваша программа
должна уметь идентифицировать число после не более семи попыток. Подсказ-
ка: используйте операторы < и

Мое решение такое:

#include using namespace std; int main() < setlocale(LC_ALL, "Russian"); double curr =50; double shift =50; char answer = ' '; bool equal_check = false; for(int i=0;i<8;i++)< cout << "Число равно" << static_cast(curr + 0.5) > answer; if (answer=='y') < equal_check = true; break; >cout (curr + 0.5) > answer; cout else if(answer=='n') < shift=shift/2; curr += shift; >> if (!equal_check) < cout system("pause"); return 0; >

Вроде работает, но есть подозрение, что я не до конца понял суть упражнения и что еще можно написать как-то проще и эффективней. Подскажите, пожалуйста, можно ли написать лучше? И правильно ли я понял задачу?

upd.Короче сам похоже нашел решение, которое подходит условиям упражнения:

#include using namespace std; int main() < setlocale(LC_ALL, "Russian"); double curr =50, shift =50; char answer = ' '; cout (curr + 0.5) > answer; if (answer=='y') < shift=shift/2; curr -= shift; >else if(answer=='n') < shift=shift/2; curr += shift; >if ( (curr = 99.5) )< cout (curr + 0.5) ; if ( shift <= 0.5)< cout (curr) > system("pause"); return 0; >

upd.Еще раз перепроверил.
Оказалось тоже есть недочет. На 99 не работает. В первый раз проглядел.
Поправил перестала работать как решение снизу от teugen во втором варианте (при выборе 100, до 100 не доходит ).
В итоге получается, что с исходным вопросом “Задуманное число меньше X”, если его не менять и включить 100 в возможный выбор числа, а не брать от 1 до 99 , работать в семь итерации при варианте 100 не будет никак, а только в восемь. Поэтому склоняюсь к тому, что в тексте вопроса неправильный перевод на русский и предполагалось, что интервал будет от 1 до 99. Либо второй вариант такой, что вопрос (“Задуманное число меньше X”) можно видоизменять и тогда вариант такой как у teugen получился в третий раз (финальный). Я лично считаю, что все таки ошибка переводчика или Бьерн неточно написал и ожидалась, что интервал будет от 1 до 99.
Вот думаю какая реализация имелась ввиду (решение от teugen во втором варианте, чуть исправленное мной):

#include #include using namespace std; int main() < setlocale(LC_ALL, "Russian"); int min = 1, max = 100; cout > ans; if (ans == 'y') < max = guess; >else < min = guess; >guess = (min + max) / 2; if (max - min < 2) < cout > cout

Думаю вопрос закрыт.

  • Вопрос задан более трёх лет назад
  • 5882 просмотра

4 комментария

Оценить 4 комментария

Решаем кодом: программа угадает число за 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   

Задача 9. Игра «Угадай число» (Python)

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

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

Пример (загадали число 7):

Введите число: 3

Число меньше, чем нужно. Попробуйте ещё раз!

Введите число: 10

Число больше, чем нужно. Попробуйте ещё раз!

Введите число: 8

Число больше, чем нужно. Попробуйте ещё раз!

Введите число: 7

Вы угадали! Число попыток: 4

Решение задачи:

from random import randint n = randint(1,20) c = 0 while True: c += 1 r = int(input('Число от 1 до 20 ')) if r < n: print('Число меньше чем нужно. Попробуйте еще раз! ') if r >n: print('Число больше чем нужно. Попробуйте еще раз! ') if r == n: print(n, 'Вы угадали! Число попыток: ', c) break

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

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