На початку гри потрібно розставити міни, потім для кожної клітини поля підрахувати, скільки хв знаходиться в сусідніх клітках. Процедура 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;