- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
Procedure TForm1.CreateObjects(Column, Row: Integer); // Процедура создания кнопок (ячеек).
Var
i, j, iLeft, iTop, iRow : Integer; // Переменные, отвечающие за расположение ячеек на форме. (Кроме iRow, она содержит номер ячейки по горизонтали.)
SpeedButton : array of TSpeedButton; // Собственно, сам массив с ячейками.
cColumn : Char; // Номер ячейки по вертикали.
iMine : ShortInt; // Дополнительная переменная кол-ва бомб на поле.
BEGIN
{Присваиваем начальные значения переменным. :7:}
iLeft := 0; // Начальная позиция по горизонтали.
iTop := 5; // Начальная позиция по вертикали.
iRow := 1; // Номер ячейки по горизонтали.
iMine := MineCount; // Кол-во мин на поле.
cColumn := 'A'; // Номер ячейки по вертикали.
SetLength(SpeedButton, Row+1); // Массив с ячейками.
{------------------------------------------ :7:}
{Создаём новые списки. :8:}
FObjectList := TObjectList.Create; // Список с объектами.
Form2.FMineList := TStringList.Create(); // Список с номерами мин на поле.
{--------------------- :8:}
{Главный цикл создания игрового поля :9:}
For i := 1 to Column do // Запускаем цикл создания по вертикали.
Begin
For j:=1 to Row do // Теперь тоже самое по горизонтали.
bEgin
SpeedButton[j] := TSpeedButton.Create(Self); // Создаём очередную ячейку на поле.
SpeedButton[j].Parent := GamePanel; // Этим параметром указываем, что ячейка принадлежит первой форме.
SpeedButton[j].Top := iTop; // Задаём расположение ячейки по вертикали.
SpeedButton[j].Name := cColumn + IntToStr(iRow); // Задаём имя ячейки.
SpeedButton[j].Flat := True; // Используем св-во кнопок не отображаться на рисунке.
SpeedButton[j].Font.Color := clBlue; // Делаем цвет текста синим.
SpeedButton[j].Font.Style := [fsBold]; // Делаем шрифт жирным.
SpeedButton[j].OnClick := SpeedButton1.OnClick; // Указываем, какая процедура будет вызываться при клике на ячейку.
SpeedButton[j].OnMouseDown := SpeedButton1.OnMouseDown; // Указываем, какая процедура будет вызываться при нажатии на ячейку.
SpeedButton[j].Left := iLeft+8; // Задаём расположение ячейки по горизонтали, смещая её на 8 пикселей вправо.
{Устанавливаем бомбу в ячейку. :10:}
If (iMine <> 0) and (SpeedButton[j].Name <> 'A1') then // Если кол-во бомб не превышено, то...
beGin
Randomize; // Генерируем список ПСЧ.
SpeedButton[j].Tag := Random(2); // Случайным образом задаём, будет ли бомба находится в ячейке.
If SpeedButton[j].Tag = 1 then
begin
Form2.FMineList.Add(SpeedButton[j].Name); // Добавляем новую запись в массив бомб.
Dec(iMine); // Уменьшаем счетчик мин на единицу.
end;
enD;
{----------------------------- :10:}
FObjectList.Add(SpeedButton[j]);// Добавляем новую запись в массив ячеек.
iLeft := iLeft + 24; //Увеличиваем расстояние между ячейками.
If iRow = Row then iRow := 1 // Если номер следующей ячейки по горизонтали неправильный, то меняем его на 1.
Else Inc(iRow); // Иначе увеличиваем номер.
eNd;
cColumn := Char(Ord(cColumn) + 1); // Увеличиваем номер ячейки по вертикали.
iTop := iTop + 24; // Увеличиваем положение ячейки по вертикали.
iLeft := 0; // Обнуляем позицию ячейки по горизонтали.
End;
{----------------------------------- :9:}
ImageList1.GetBitmap(0, (FindComponent('A1') as TSpeedButton).Glyph); // Загружаем спрайт в первую ячейку.
Form2.FMineList.SaveToFile('OUTPUT.TXT'); // Сохраняем расположение мин в файл.
MineCountLabel.Caption := IntToStr(Form2.FMineList.Count); // Показываем колво мин на поле.
END;
Function TForm1.CheckMove(X,Y : ShortString): Boolean; // Функция проверки валидности ячейки. Она должна находится рядом с текущей.
Var
iXod, iAlf : Integer; // Вспомогательные переменные.
BEGIN
result := false; // Презумпция вины :)
iXod := Abs(StrToInt(Y) - StrToInt(dPos.yInt)); // Получаем расстояние до текущей ячейки по горизонтали.
iAlf := Abs(Ord(dPos.xChr) - Ord(X[1])); // Получаем расстояние до текущей ячейки по вертикали.
If ((iXod <= 1) and (iAlf <= 1)) and ((iXod <> 0) or (iAlf <> 0)) then result := true; // И если оно не больше одного, то разрешаем ход.
END;
Procedure TForm1.SpeedButton1Click(Sender: TObject); // Главная процедура нажатия на кнопку(ячейку).
Var
i : Integer; // Счётчик цикла.
cObject : TSpeedButton; // Сам объект.
Str, j : String; // Вспомогательная переменная имени ячейки.
Count : Integer; // Вспомогательная переменная. (стр. 160)
BEGIN
{Подготавливаем переменные :1:}
cObject := TSpeedButton(Sender); // Получаем ячейку, на которую кликнули.
Str := cObject.Name; // Присваиваем вспомогательной переменной имя задействованной ячейки.
dClick.xAlf := Str[1]; // Присваиваем переменной первый символ задействованной ячейки по вертикали.
dClick.yFlt := Copy(Str, 2, Length(Str)); // Получаем номер ячейки по горизонтали.
{------------------------- :1:}
...