MIDlet Pascal
Поиск по сайту
Форма входа

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


Яндекс.Метрика

Друзья сайта
IT юмор - развлечения
Заработать в интернете - легко!Просто сиди и кликай.
Воскресенье, 23.09.2018, 01.44.56
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход
Урок №11 "Сапёр урок №2"
Продолжаем делать сапёра.Для начала давайте объявим квадратный массив mine:array[1..6,1..6] of boolean;, а теперь добавим 5 мин на поле.Для этого создадим процедуру

Procedure RandomMine(w:integer); // w-количество мин
var c1,c2,s:integer;
begin
  repeat
    c1:=Random(5)+1;  //Первое случайное число от 1-о до 6-и
    c2:=Random(5)+1;  //Второе случайное число от 1-о до 6-и
    if mine[c1,c2]=false then  //Если на этой клетке ещё нет мины, то 
      begin
        mine[c1,c2]:=true; //Ставим флажок "Здесь мина"
        s:=s+1; //Даём знать что поставили флажок
      end;
  until s=w; //цикл будет повторяться пока не поставит w мин
end;

Вызываем эту процедуру перед вечным циклом RandomMine(5), указывая количество мин.Теперь объявим переменную, которя будет показывать состояние клетки.Например
Клетку ещё не откыли "-1";
На клетке поставили флажок "10";
Клетка пустая "0";
Возле клетки определённое количество мин "1","2"..., "7", "8".
Для этого также потребуется квадратный массив, но теперь типа integer.По этому вписываем kletka:array[1..6,1..6] of integer;.Теперь делаем процедуру для открытия этих самых клеток.

Procedure Open(x,y:integer); //номер массива клетки например [3,4]
begin
  i:=0;
  if mine[x,y]=false then //проверяем, есть ли на этой клетке мина
    begin //Если нет, то считаем количество мин вокруг открытой клетки
      if (x-1>0) and (y-1>0) then if mine[x-1,y-1]=true then i:=i+1;// Если есть мина в этой клетке, то обновляем информацию об клетке
      //и так дальше
      if y-1>0 then if mine[x,y-1]=true then i:=i+1;
      if (x+1<7) and (y-1>0) then if mine[x+1,y-1]=true then i:=i+1;
      if x-1>0 then if mine[x-1,y]=true then i:=i+1;
      if x+1<7 then if mine[x+1,y]=true then i:=i+1;
      if (x-1>0) and (y+1<7) then if mine[x-1,y+1]=true then i:=i+1;
      if y+1<7 then if mine[x,y+1]=true then i:=i+1;
      if (x+1<7) and (y+1<7) then if mine[x+1,y+1]=true then i:=i+1;
      kletka[x,y]:=i; //Записываем в клетку
      if i=0 then //Если нету пососедству мин то вызываем рекурсию.
        begin
          if (x-1>0) and (y-1>0) then if kletka[x-1,y-1]=-1 then Open(x-1,y-1);
          if y-1>0                then if kletka[x,y-1]=-1 then Open(x,y-1);
          if (x+1<7) and (y-1>0) then if kletka[x+1,y-1]=-1 then Open(x+1,y-1);
          if x-1>0                then if kletka[x-1,y]=-1 then Open(x-1,y);
          if x+1<7                then if kletka[x+1,y]=-1 then Open(x+1,y);
          if (x-1>0) and (y+1<7) then if kletka[x-1,y+1]=-1 then Open(x-1,y+1);
          if y+1<7                then if kletka[x,y+1]=-1 then Open(x,y+1);
          if (x+1<7) and (y+1<7) then if kletka[x+1,y+1]=-1 then Open(x+1,y+1);
        end;
    end;
end;

Вызываем процедуру с помощью команды if KeyToAction(Key)=Ga_Fire then Open(((xcursor-6+1)/20)+1,((ycursor-6)/20)+1);
Теперь код игры выглядеть должен, вот так :

var i,k,key,xcursor, ycursor:integer; //переменные
    mine:array[1..6,1..6] of boolean;
    kletka:array[1..6,1..6] of integer;

Procedure Open(x,y:integer); //номер массива клетки например [3,4]
begin
  i:=0;
  if mine[x,y]=false then //проверяем, есть ли на этой клетке мина
    begin //Если нет, то считаем количество мин вокруг открытой клетки
      if (x-1>0) and (y-1>0) then if mine[x-1,y-1]=true then i:=i+1;// Если есть мина в этой клетке, то обновляем информацию об клетке
      //и так дальше
      if y-1>0 then if mine[x,y-1]=true then i:=i+1;
      if (x+1<7) and (y-1>0) then if mine[x+1,y-1]=true then i:=i+1;
      if x-1>0 then if mine[x-1,y]=true then i:=i+1;
      if x+1<7 then if mine[x+1,y]=true then i:=i+1;
      if (x-1>0) and (y+1<7) then if mine[x-1,y+1]=true then i:=i+1;
      if y+1<7 then if mine[x,y+1]=true then i:=i+1;
      if (x+1<7) and (y+1<7) then if mine[x+1,y+1]=true then i:=i+1;
      kletka[x,y]:=i; //Записываем в клетку
      if i=0 then //Если нету пососедству мин то вызываем рекурсию.
        begin
          if (x-1>0) and (y-1>0) then if kletka[x-1,y-1]=-1 then Open(x-1,y-1);
          if y-1>0                then if kletka[x,y-1]=-1 then Open(x,y-1);
          if (x+1<7) and (y-1>0) then if kletka[x+1,y-1]=-1 then Open(x+1,y-1);
          if x-1>0                then if kletka[x-1,y]=-1 then Open(x-1,y);
          if x+1<7                then if kletka[x+1,y]=-1 then Open(x+1,y);
          if (x-1>0) and (y+1<7) then if kletka[x-1,y+1]=-1 then Open(x-1,y+1);
          if y+1<7                then if kletka[x,y+1]=-1 then Open(x,y+1);
          if (x+1<7) and (y+1<7) then if kletka[x+1,y+1]=-1 then Open(x+1,y+1);
        end;
    end;
end;

Procedure RandomMine(w:integer); // w-количество мин
var c1,c2,s:integer;
begin
  repeat
    c1:=Random(5)+1;  //Первое случайное число от 1-о до 6-и
    c2:=Random(5)+1;  //Второе случайное число от 1-о до 6-и
    if mine[c1,c2]=false then  //Если на этой клетке ещё нет мины, то 
      begin
        mine[c1,c2]:=true; //Ставим флажок "Здесь мина"
        s:=s+1; //Даём знать что поставили флажок
      end;
  until s=w; //цикл будет повторяться пока не поставит w мин
end;

begin
 xcursor:=6;
 ycursor:=6;
 RandomMine(5);
 for i:=1 to 6 do 
    for k:=1 to 6 do
      kletka[i,k]:=-1;
 repeat // вечный цикл, в котором процедура Delay не очень и нужна 
  Key:=GetKeyClicked;
  SetColor(255,255,255); 
  FillRect(0,0,128,128);//Стёрли всё с экрана
  SetColor(0,0,0);
  if KeyToAction(Key)=Ga_Left then xcursor:=xcursor-20; //Обрабатываем нажатые клавиши
  if KeyToAction(Key)=Ga_Right then xcursor:=xcursor+20;
  if KeyToAction(Key)=Ga_Up then ycursor:=ycursor-20;
  if KeyToAction(Key)=Ga_Down then ycursor:=ycursor+20;
  if xcursor<6 then xcursor:=106;  //Обрабатываем поля для курсора
  if xcursor>106 then xcursor:=6;
  if ycursor<6 then ycursor:=106;  
  if ycursor>106 then ycursor:=6;
  DrawRect(xcursor,ycursor,16,16);
  for i:=0 to 6 do //цикл горизонтальных линий
    DrawLine(4, (i*20)+4, 124, (i*20)+4); //Рисуем линию
  for k:=0 to 6 do  //цикл вертикльных линий
    DrawLine((k*20)+4, 4, (k*20)+4, 124); //Рисуем линию
  //возникает вопрос.Откуда взялись такие конкретные цифры?
  //Ответ: 20=120 пикселей поделить на 6 клеток, 4= (128 пикселей минус 120 пикселей) поделить на 2
  for i:=0 to 5 do     for k:=0 to 5 do      if kletka[i+1,k+1]>-1 then DrawText(''+kletka[i+1,k+1]+'', i*20+8, k*20+8); //Здесь можно убедиться, что код работает нормально 
  repaint; // перерисовка экрана
 until false;
end.

В следующем уроке доделаем эту игру
← Урок №10Урок №12 →
Если вы нашли ошибки/очепятки в тексте то сообщите о них на форуме
А также можете заказать программу/игру на этой странице

www.parkflyer.ru - радиоуправляемые модели, радиоуправляемые модели самолетов, магазин радиоуправляемых моделей
Роспись стен, скульптуры на заказ
Wladymyr © 2012-2018
Создать бесплатный сайт с uCoz