Ищите и обрящете.
Библейское
Попытка не пытка.
Фольклорное
Правила игры
Компьютер загадывает число от 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;
А на сегодня это всё!