Skip to Content

Начало игры

Начало игры

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

Листинг 15.3. Процедура NewGame

  1. // новая игра — генерирует новое поле
  2.  
  3. procedure NewGame ();
  4.  
  5. row,col : integer; // координаты клетки (индексы массива)
  6. n : integer; // количество поставленных мин
  7. k : integer; // кол-во мин в соседних клетках
  8.  
  9. begin
  10.  
  11. // Очистим эл-ты массива, соответствующие клеткам
  12. // игрового поля
  13.  
  14. for row :=1 to MR do
  15.  
  16. for col :=1 to MC do Pole[row,col] := 0;
  17.  
  18. // расставим мины
  19.  
  20. Randomize О; // инициализация ГСЧ
  21. n := 0; // кол-во мин
  22.  
  23. repeat
  24.  
  25. row := Random(MR) + 1;
  26. col := Random(MC) + 1;
  27.  
  28. if (Pole[row,col] <> 9) then
  29. begin
  30.  
  31. Pole[row,col] := 9;
  32. n := n+1;
  33.  
  34. end;
  35.  
  36. until (n = NM);
  37.  
  38. // для каждой клетки вычислим // кол-во мин в соседних клетках
  39.  
  40. for row := 1 to MR do
  41.  
  42. for col := 1 to MC do
  43.  
  44. if (Pole[row,col] <> 9) then
  45. begin
  46.  
  47. k :=0 ;
  48.  
  49. if Pole[row-l,col-l] = 9 then
  50. k = k + 1;
  51.  
  52. if Pole[row-1,col] = 9 then
  53. k = k + 1;
  54.  
  55. if Pole[row-1,col+1] = 9 then
  56. k = k + 1;
  57.  
  58. if Pole[row,col-1] = 9 then
  59. k = k + 1;
  60.  
  61. if Pole[row,col+1] = 9 then
  62. k = k + 1;
  63.  
  64. if Pole[row+1,col-1] = 9 then
  65. k = k + 1;
  66.  
  67. if Pole[row+1,col] = 9 then
  68. k = k + 1;
  69.  
  70. if Pole[row+l,col+l] = 9 then
  71. k := k + 1;
  72.  
  73. Pole[row,col] := k;
  74.  
  75. end;
  76.  
  77. status := 0; // начало игры
  78. nMin := 0; // нет обнаруженных мин
  79. nFlag := 0; // нет поставленных флагов
  80.  
  81. end;

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

Листинг 15.4. Процедура ShowPole

  1. // Показывает поле
  2.  
  3. Procedure ShowPoie(Canvas : TCanvas; status : integer);
  4. var
  5.  
  6. row,col : integer;
  7.  
  8. begin
  9.  
  10. for row := 1 to MR do
  11.  
  12. for col := 1 to MC do
  13.  
  14. Kletka(Canvas, row, col, status);
  15.  
  16. end;

Процедура showPoie выводит изображение поля последовательно, клетка за клеткой. Вывод изображения отдельной клетки выполняет процедура Kletka, ее текст приведен в листинге 15.5. Процедура Kletka используется для вывода изображения поля в начале игры, во время игры и в ее конце. В начале игры (значение параметра status = 0) процедура выводит только контур клетки, во время игры — количество мин в соседних клетках или флажок, а в конце отображает исходное состояние клетки и действия пользователя. Информацию о фазе игры процедура Kletka получает через параметр status.

Листинг 15.5. Процедура Kletka

  1. // выводит на экран изображение клетки
  2.  
  3. Procedure Kletka(Canvas : TCanvas;
  4. row, col, status : integer);
  5. var
  6.  
  7. x,y : integer; // координаты области вывода
  8.  
  9. begin
  10.  
  11. x := (col-1)* W + I;
  12. у := (row-1)* H + 1;
  13.  
  14. if status = 0 then
  15. begin
  16.  
  17. Canvas.Brush.Color := clLtGray;
  18. Canvas.Rectangle(x-1,y-1,x+W,y+H);
  19. exit;
  20.  
  21. end;
  22.  
  23. if Pole[row,col] < 100 then
  24. begin
  25.  
  26. Canvas.Brush.Color := clLtGray; // неоткрытые — серые
  27. Canvas.Rectangle(x-1,y-l,x+W,y+H);
  28.  
  29. // если игра завершена (status = 2), то показать мины
  30.  
  31. if (status = 2) and (Pole[row,col] = 9) then
  32. Mina(Canvas, x, y) ; exit;
  33.  
  34. end;
  35.  
  36. // открытая клетка
  37.  
  38. Canvas.Brush.Color := clWhite; // открытые белые
  39. Canvas.Rectangle(x-1,y-l,x+W,y+H);
  40.  
  41. if (Pole[row,col] = 100) then
  42. exit; // клетка открыта, но она пустая
  43.  
  44. if (Pole[row,col] >= 101) and (Pole[row,col] <= 108) then
  45. begin // в соседних клетках есть мины
  46.  
  47. Canvas.Font.Size := 14;
  48. Canvas.Font.Color := clBlue;
  49. Canvas.TextOut(x+3,y+2,IntToStr(Pole[row,col] -100));
  50. exit;
  51.  
  52. end;
  53.  
  54. if (Pole[row,col] >= 200) then
  55. Flag(Canvas, x, y);
  56.  
  57. if (Pole[row,col] = 109) then // на этой мине подорвались!
  58. begin
  59.  
  60. Canvas.Brush.Color := clRed;
  61. Canvas.Rectangle(x-1,y-1,x+W,y+H);
  62.  
  63. end;
  64.  
  65. if ((Pole[row,col] mod 10) = 9) and (status = 2) then
  66. Mina(Canvas, x, y);
  67.  
  68. end;



Delphi Для профессионалов &1   |    Delphi Для профессионалов &2   |    Delphi Для профессионалов &3   |    Иллюстрированный самоучитель &1   |    Иллюстрированный самоучитель &2