"Delphi. Учимся на примерах" - читать интересную книгу автора (Парижский Сергей Михайлович)

Полный исходный код модуля

Полный исходный код программного модуля игры "Угадывание чисел" представлен в листинге 9. 1.

Листинг 9.1. Программный модуль игры "Угадывание чисел"

unit Unit1;


interface


uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;


type TForm1 = class(TForm)

 Button1: TButton;

 Label1: TLabel;

 Label2: TLabel;

 start : TEdit;

 finish: TEdit;

 Label3: TLabel;

 pl1: TLabel;

 ch1: TEdit;

 pl2: TLabel;

 ch2: TEdit;

 comp: TCheckBox;

 Button2: TButton;

 x: TLabel;

 znak1: TLabel;

 znak2: TLabel;

 procedure FormCreate(Sender: TObject);

 procedure compClick(Sender: TObject);

 procedure Button1Click(Sender: TObject);

 procedure Button2Click(Sender: TObject);

private

 { Private declarations }

 procedure min();

 procedure max();

public

 { Public declarations }

end;


var

 Form1: TForm1;

 num, j, i, kolvo, big, small: integer;

 maximum, minimum: array [1..100] of integer; {массивы максимальных и минимальных чисел}


implementation

{$R *.dfm}


//процедура нахождения наименьшего числа

procedure TForm1.min();

begin

 for i:=1 to kolvo do begin

  for j:=1 to kolvo do begin

   {Если число меньше наименьшего, то оно становится наименьшим}

   if minimum[j] gt; small then small:= minimum[j];

  end;

 end;

end;

//процедура нахождения наибольшего числа

procedure TForm1.max();

var temp: integer;

begin

 temp:= StrToInt(finish.Text);

 for i:=1 to kolvo do begin

  for j:=1 to kolvo do begin

   if temp gt; maximum[j] then

    if maximum[j] gt; 0 then temp:= maximum[j]; {если число больше наибольшего…}

  end;

 end;

 if ( (templt;gt;0) and (templt;gt;StrTolnt(finish.Text)) ) then

  {… и если число входит в допустимый диапазон, то оно становится наибольшим}

  big:= temp;

end;


procedure TForm1.compClick(Sender: TObject);

begin

 if comp.Checked then begin //если флажок установлен

  //блокируем ввод от второго игрока

  ch2.Enabled:= False;

  рl2.Enabled:= False;

  //включаем ввод от первого игрока

  ch1.Enabled:= True;

  pl1.Enabled:= True;

 end

 else begin

  //если игра идет с человеком, то

  //включаем ввод для второго игрока

  ch2.Enabled:= True;

  рl2.Enabled:= True;

 end;

end;


procedure TForm1.Button1Click(Sender: TObject);

begin

 if ((StrToInt(finish.Text) gt; StrToInt(start.Text)) and (StrToInt(start.Text) gt; 0) and (StrToInt(finish.Text) lt; 60000))

 then {проверяем, не выходит ли заданное пользователем число за допустимые пределы}

  {загадаем случайное число в заданном диапазоне}

  num:= Random(StrToInt(finish.Text) – StrToInt(start.Text)) + StrToInt(start.Text)

 else ShowMessage('Неверный диапазон!');

 //обнуляем все, и придаем программе начальный вид

 znak1.Caption:= '';

 znak2.Caption:= '';

 ch1.Enabled:= True;

 ch2.Enabled:= False;

 pl1.Enabled:= True;

 pl2.Enabled:= False;

 x.Caption:= 'X';

 ch1.Text:= '0';

 ch2.Text:= '0';

 //очистим массивы наибольших и наименьших чисел

 for i:= 1 to kolvo+1 do begin

  minimum[i]:= 0;

  maximum[i]:= 0;

  big:= StrToInt(finish.Text); //наибольшее число

  small:= StrToInt(start.Text); //наименьшее число

 end;

 kolvo:= 0; //количество использованных попыток

end;


procedure TForm1.Button2Click(Sender: TObject);

begin

 //увеличиваем количество попыток на единицу

 kolvo:= kolvo + 1;

 if not comp.Checked then //если идет игра с человеком

 begin

  if pl1.Enabled then begin //если ход первого игрока

  //если вариант больше загаданного числа, ставим знак gt;

  if StrToInt(ch1.Text) gt; num then znak1.Caption:= 'gt;';

  //если вариант меньше загаданного числа, ставим знак lt;

  if StrToInt(ch1.Text) lt; num then znak1.Caption:= 'lt;';

  if StrToInt(ch1.Text) = num then //если число угадано

  begin

   znak1.Caption:= '='; //изменим знак на "="

   //вместо знака "X" показываем загаданное число

   х.Caption:= IntToStr(num);

   //выводим сообщение о победе первого игрока

   ShowMessage('Победил первый игрок!' + #13#10 + 'Число угадано за ' + IntToStr(kolvo) + ' попытки')

  end;

  //передаем ход второму игроку

  pl1.Enabled:= False;

  ch1.Enabled:= False;

  ch2.Enabled:= True;

  pl2.Enabled:= True;

  Exit; //прерываем выполнение процедуры

 end;

 if pl2.Enabled then begin //если ход второго игрока

  {сравниваем загаданное число с вариантом второго игрока и ставим соответствующий знак}

  if StrToInt(ch2.Text) gt; num then znak2.Caption:= 'gt;';

  if StrToInt(ch2.Text) lt; num then znak2.Caption := 'lt;';

   if StrToInt(ch2.Text) = num then begin

    znak2.Caption := '=';

    x.Caption:= IntToStr(num);

    ShowMessage('Победил второй игрок!' + #13#10 + 'Число угадано за ' + IntToStr(kolvo) + ' попытки')

   end;

  end;

  //передаем ход первому игроку

  рl2.Enabled:= False;

  ch2.Enabled:= False;

  ch1.Enabled:= True;

  pl1.Enabled:= True;

  Exit;

 end;

 if comp.Checked then begin //если игра против компьютера

  {проверяем вариант первого игрока и ставим соответствующий знак}

  if StrToInt(ch1.Text) gt; num then znak1.Caption:= 'gt;';

  if StrToInt(ch1.Text) lt; num then znak1.Caption:= 'lt;';

  if StrToInt(ch1.Text) = num then begin

   znak1.Caption:= '=';

   x.Caption:= IntToStr(num);

   ShowMessage('Вы победили!' + #13#10 + 'Число угадано за ' + IntToStr(kolvo) + ' попытки');

   Exit;

  end;

  //если вариант первого игрока больше загаданного числа

  if znak1.Caption = 'gt;' then begin

   maximum[kolvo]:= StrToInt(ch1.Text); {добавляем в массив наибольших чисел вариант первого игрока}

   max();

   //ищем наибольшее число

  end;

  //если вариант первого игрока меньше загаданного числа

  if znak1.Caption = 'lt;' then begin

   minimum[kolvo]:= StrToInt(ch1.Text); {добавляем число в массив наименьших чисел, выданных первым игроком}

   min();//ищем наименьшее число

   end;

   //после всех расчетов, компьютер выдает свой вариант

   ch2.Text:= IntToStr(Random(big– small)+ small);

  end;

  //проверяем вариант компьютера и ставим соответствующий знак

  if StrToInt(ch2.Text) gt; num then znak2.Caption:= 'gt;';

  if StrToInt(ch2.Text) lt; num then znak2.Caption:= 'lt;';

  if StrToInt(ch2.Text) = num then begin znak2.Caption:= '=' ;

  x.Caption:= IntToStr(num);

  ShowMessage('Вы проиграли!' + #13#10 + 'В этот раз победил компьютер!' + #13#10 + ' Число угадано за ' + IntToStr(kolvo) + ' попытки');

 end;

end;


end.

#8858; Все файлы проекта и исполняемый файл рассмотренной программы находятся на прилагаемом к книге компакт-диске в папке Chapter09.