Початок гри

На початку гри потрібно розставити міни, потім для кожної клітини поля підрахувати, скільки хв знаходиться в сусідніх клітках. Процедура NewGame (її текст приведений в лістингу 15.3) вирішує це завдання.

Лістинг 15.3. Процедура NewGame// нова гра – генерує нове поле procedure

 

procedure NewGame ();

row, col : Integer; // координати клітини (індекси масиву)

n : Integer; // кількість поставлених хв

k : Integer; // кількість хв в сусідніх клітках

begin
// Очистимо ел-ти масиву, відповідні клітинам

// ігрового поля

for row: = 1 to MR do

for col: = 1 to MC do Pole [row, col]: = 0;
// розставимо міни
Randomize Про; // ініціалізація ГСЧ
n : = 0; // кількість хв
repeat
row : = Random (MR) + 1;

col : = Random (MC) + 1;

if (Pole [row, col] <> 9) then begin
Pole [row, col] : = 9; n: = n + 1;

end;

until (n = NM);
// для кожної клітини обчислимо // к-ть хв в сусідніх клітках

for row: = 1 to MR do

for col: = 1 to MC do
if (Pole [row, col] <> 9) then

begin k: = 0;
if Pole [row-l, col-l] = 9 then k = k + 1;
if Pole [row-1, col] = '9 then k = k + 1;
if Pole [row-1, col + 1] = 9 then k = k + 1;
if Pole [row, col-1] = 9 then k = k + 1;
if Pole [row, col + 1] = 9 then k = k + 1;
if Pole [row + 1, col-1] = 9 then k = k + 1;
if Pole [row + 1, col] = 9 then k = k + 1; < br>

if Pole [row + l, col + l] = 9 then k: = k + 1;

Pole [row, col] : = K;

end;
status : = 0; // початок гри

nMin : = 0; // нет виявлених хв

nFlag : = 0; // нет поставлених прапорів

end;

Після того як процедура NewGame розставить міни, процедура showPoie (її текст приведений в лістингу 15.4) виводить зображення ігрового поля.

Лістинг 15.4. Процедура ShowPole// Показує поле

Procedure ShowPoie (Canvas: TCanvas; status: integer);

var
row, col : Integer;

begin
for row: = 1 to MR do

for col: = 1 to MC do
Kletka (Canvas, row, col, status);

end;

Процедура showPoie виводить зображення поля послідовно, клітина за клітиною. висновок зображення окремої клітини виконує процедура Kletka, її текст приведений в лістингу 15.5. Процедура Kletka використовується для виведення зображення поля на початку гри, у час гри і в її кінці. На початку гри (значення параметра status = 0) процедура виводить тільки контур клітини, під час гри – кількість хв в сусідніх клітках або прапорець, а в кінці відображає початковий стан клітини і дії користувача. Інформацію про фазі гри процедура Kletka отримує через параметр status.

Лістинг 15.5. Процедура Kletka// виводить на екран зображення клітини

Procedure Kletka (Canvas: TCanvas;

row, col, status: integer);

var
x, y : Integer; // координати області виведення

begin
x : = (Col-1) * W + I; у: = (row-1) * H + 1;
if status = 0 then begin
Canvas.Brush.Color : = ClLtGray;
Canvas.Rectangle (x-1, y-1, x + W, y + H );
exit;

end;
if Pole [row, col]< 100 then

begin
Canvas.Brush.Color : = ClLtGray; // невідкриті - сірі

Canvas.Rectangle (x-1, yl, x + W, y + H);
// якщо гра завершена (status = 2), то показати міни

if (Status = 2) and (Pole [row, col] = 9)
then Mina (Canvas, x, y); exit; end;
// відкрита клітина
Canvas.Brush.Color : = ClWhite; // відкриті білі
Canvas.Rectangle (x-1, yl, x + W, y + H);
if (Pole [row, col] = 100)
then exit; // клітина відкрита, але вона порожня
if (Pole [row, col]> = 101)

and (Pole [row, col] < = 108)

then begin // в сусідніх клітках є міни
Canvas.Font.Size : = 14;
Canvas.Font.Color : = ClBlue;
Canvas.TextOut (x + 3, y + 2, IntToStr (Pole [row, col ] -100));
exit;

end;
if (Pole [row, col] > = 200)

then Flag (Canvas, x, y);
if (Pole [row, col] = 109)

then // на цій міні підірвалися!

begin
Canvas.Brush.Color : = ClRed;

Canvas.Rectangle (x-1, y-1, x + W, y + H );
end;
if ((Pole [row, col] mod 10) = 9)

and (status = 2) then
Mina (Canvas, x, y);

end;