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

Статистика

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


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

Друзья сайта
IT юмор - развлечения
Заработать в интернете - легко!Просто сиди и кликай.
Воскресенье, 15.07.2018, 20.02.29
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход
Урок №12 "Сапёр урок №3"
В этом уроке доведём приложение до ума.Для начала заменим эту строку

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); //Здесь можно убедиться, что код работает нормально 

На эту 

for i:=0 to 5 do     
  for
k:=0 to 5 do
    begin
      if
(kletka[i+1,k+1]>-1) and (kletka[i+1,k+1]<10) then DrawText(''+kletka[i+1,k+1]+'', i*20+8, k*20+8);
      if kletka[i+1,k+1]=10 then DrawText('!', i*20+8, k*20+8);
    end;

Теперь при установке флажка мины, в клетке будет показывать "!".
Дальше добавим строку проверки нажатия на "0" после чего будет устанавливаться флаг мины.

if Key=48 then if kletka[((xcursor-6+1)/20)+1,((ycursor-6)/20)+1]=10 then kletka[((xcursor-6+1)/20)+1,((ycursor-6)/20)+1]:=-1 else kletka[((xcursor-6+1)/20)+1,((ycursor-6)/20)+1]:=10  // 48 - это код клавиши "0" во всех мобильных устройствах

Дальше добавим в процедуру "Open" строку которая после попадания на мину закрывает приложение показывая на экране надпись "Конец игры"

   end else
      begin
        for
i:=1 to 6 do
          for
k:=1 to 6 do
            if
mine[i,k]=true then  //Если на этой клетке естьмина то
              begin
                DrawText('!!', i*20-12, k*20-12); //Если здесь была мина то рисуем "!!"
              end else if kletka[i,k]=10 then DrawText('x', i*20-12, k*20-12); //Если на клетке без мины поставили флажок, то ставим знак "х" сверху
        SetColor(0,150,0);
        s:='Игра закончилась';
        DrawText(s,(GetWidth-GetStringWidth(s))/2, 50); //Выводем текст проиграша на экран 
        Repaint;
        Delay(5000);
        Halt; //Закрыть приложение
      end;

теперь сделаем процедуру котороя будет проверять, всё правильно открыто или нет

Procedure testwin;
var r:integer;
begin
  fo
r i:=1 to 6 do
    for
k:=1 to 6 do
      if
mine[i,k]=true then
        begin

          if kletka[i,k]=10 then r:=r+1;
        end else if (kletka[i,k]>-1) and (kletka[i,k]<10) then r:=r+1;
  if r=36 then
    begin

      SetColor(0,150,0);
      s:='Вы победили';
      DrawText(s,(GetWidth-GetStringWidth(s))/2, 50);
      Repaint;
      Delay(5000);
      Halt;
    end;
end;

Теперь код игры должен выглядеть, так: 

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

Procedure testwin;
var r:integer;
begin
  fo
r i:=1 to 6 do
    for
 k:=1 to 6 do
      if
 mine[i,k]=true then
        begin

          if kletka[i,k]=10 then r:=r+1;
        end else if (kletka[i,k]>-1) and (kletka[i,k]<10) then r:=r+1;
  if r=36 then
    begin

      SetColor(0,150,0);
      s:='Вы победили';
      DrawText(s,(GetWidth-GetStringWidth(s))/2, 50);
      Repaint;
      Delay(5000);
      Halt;
    end;
end;

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 Key=48 then if kletka[((xcursor-6+1)/20)+1,((ycursor-6)/20)+1]=10 then kletka[((xcursor-6+1)/20)+1,((ycursor-6)/20)+1]:=-1 else kletka[((xcursor-6+1)/20)+1,((ycursor-6)/20)+1]:=10  // 48 - это код клавиши "0" во всех мобильных устройствах
  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
      begin
        if (kletka[i+1,k+1]>-1) and (kletka[i+1,k+1]<10) then DrawText(''+kletka[i+1,k+1]+'', i*20+8, k*20+8); //Здесь можно убедиться, что код работает нормально 
        if kletka[i+1,k+1]=10 then DrawText('!', i*20+8, k*20+8);
      end;
  if KeyToAction(Key)=Ga_Fire then Open(((xcursor-6+1)/20)+1,((ycursor-6)/20)+1);
  repaint; // перерисовка экрана
 until false;
end.
Всё поздравляю, вы сделали свою первую игру.Дальше ваша фантазия и домыслы помогут доделать её.В следующих уроках вы научитесь работать с различными библмотеками
← Урок №11Урок №13 →
Если вы нашли ошибки/очепятки в тексте то сообщите о них на форуме
А также можете заказать программу/игру на этой странице

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