Игра Угадай число, или Бинарный поиск в Delphi

Ищите и обрящете.

Библейское

Попытка не пытка.

Фольклорное

Правила игры

Компьютер загадывает число от 1 до 100, а игрок должен угадать его за минимальное число попыток. Если число угадано, то компьютер поздрав­ляет его и загадывает следующее. И так до тех пор, пока игроку не надоест. Если названное игроком число меньше задуманного, то компьютер сооб­щает ему о недоборе, если больше - о переборе.

Стратегия игры

Игра очень простая - и стратегия тоже не сложнее: нужно каждый раз называть число, находящееся посередине интервала оставшихся чисел. Например, на первом ходу игрок должен назвать число 100 : 2 = 50. Если угадал - сразу молодец! Если перебор, то диапазон уменьшается вдвое - 1..49. При недоборе - аналогично: 51..100. Далее действуем по заранее утверждённому плану, без особых затей. Легко подсчитать, что потребует­ся не более 8 ходов, чтобы угадать число от 1 до 100. Если вам этого мало, загадывайте число побольше.

Несмотря на кажущуюся простоту, наша стратегия является хорошим примером двоичного (бинарного) поиска. Действительно, с каждым ходом число претендентов уменьшается вдвое: вначале их было 100, после пер­вого хода 50, затем 25 - 13 - 7 - 4 - 2 - 1. Обычно этот метод используют для поиска нужного элемента в упорядоченном массиве. Наше применение чуток нетрадиционное, но очень эффективное!

Программа для игры в 100

Иногда задние мысли опережают передние.

Фольклорное 

Если отвлечься от кнопок и других элементов интерфейса (Рис. С14.1), то в сухом остатке мы получим условный оператор, затаившийся в процедуре:


procedure TForm1.sbtTestClick(Sender: TObject);
var code: integer; 
begin
inc(popytka); lblPopytka.Caption:= 'Попытка '+inttostr(popytka); //otvet:= strtoint(txtOtvet.text); val(txtOtvet.text, otvet, code); if (code <> 0) or (otvet > MAX_NUMBER) or (otvet < 1) then begin application.MessageBox('Ваще мимо!!!', NAME_PROG, MB_OK); exit end; if otvet = zadum then lblMessage.Caption:='Поздравляюугадал!' else if otvet > zadum then lblMessage.Caption:='Перебор!' else lblMessage.Caption: = 'Недобор!', end;

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

установили текстовое поле I1— ШЛ ItxtOtvet. Игрок набирает число с кла­

виатуры и нажимает кнопку Проверить (sbtTest), после чего и выполняет­ся процедура TForm1.sbtTestClick. Поскольку в текстовом поле находится строка, а нам нужно число, то мы должны позаботиться о её преобразова­нии. Первое, что приходит в голову, воспользоваться специально для этого предназначенной функцией преобразования строки в число StrToInt. И всё бы хорошо, но если игрок попадётся невнимательный или коварный, то сможет удумать недоброе и нажать кнопку Проверить вообще без всякого числа или с буквами вместо цифр. Функция StrToInt, увы, такого удара судьбы не переживёт, и вся программа закончит своё бренное существова­ние полным коллапсом. Этого не надо бояться, но к этому надо готовиться, поэтому для преобразования строки в число безопаснее использовать процедуру Val, которая делает это более хитроумно - её не проведёшь! О результате конвертирования можно судить по значению переменной code: если оно равно 0, значит, ошибок при вводе числа не найдено. Следует ехидно надсмеяться над криворуким игроком, который путается в клавиатуре, но такое дело по силам каждому, поупражняйтесь в язвительности сами.

 

Кнопка Новая игра её и начинает:


procedure TForm1.newGame;
begin
randomize;
lblMessage.Caption:='';
txtOtvet.text:='';
zadum:= GetRandom(1, MAX_NUMBER); popytka:=0;
lblPopytka.Caption:= 'Попытка '+inttostr(popytka); end;

 

А на сегодня это всё!

Игра Угадай число, или Бинарный поиск в Delphi

������� ������ ��� dle ������� ��������� ������

Помоги проекту! Расскажи друзьям об этом сайте: