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

Статистика

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


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

Друзья сайта
IT юмор - развлечения
Заработать в интернете - легко!Просто сиди и кликай.
Воскресенье, 15.07.2018, 20.10.48
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход
Урок №24.6 - Игра - Крестики-нолики

Доброго времени суток!
В этом уроке мы доделаем игру.Добавляем все еще переменные:


k,j,key,setx,sety:integer;
wt,move:integer;
t:string;
map:array [0..2, 0..2] of integer;


k, j - счетчики
key - нажатие клавиши
setx, sety - положение курсорав на экране
wt - ширина одной клетки
move - хранить инфо "чья очередь ходить?"
t - вспомогательная строковая переменная
map - массив хранящий в себе информацию о поле

для начала будем инициализировать переменную wt.Что бы получить ширину одной клетки, нужно ширину экрана поделить на 3:


wt:=GetWidth/3;


Вставим эту строку в главную част кода в самое начало.
Теперь напишем функцию вывода игрового поля на экран


Procedure cls; //очистка экрана
begin
  SetColor(0,0,0);
  FillRect(0,0,GetWidth,GetHeight);
  SetColor(255,255,255);
end;

Procedure paint;//отричовка поля
var texty:integer; //переменная хранящая в сее высоту
begin
  cls;
  DrawLine(wt,0,wt,wt*3); //рисуем шесть линий
  DrawLine(wt*2, 0, wt*2, wt*3);
  DrawLine(0, wt, GetWidth, wt);
  DrawLine(0, wt*2, GetWidth, wt*2);
  DrawLine(0, wt*3, GetWidth, wt*3);
  for i:=0 to 2 do
    for
j:=0 to 2 do
      DrawFigure(map[i,j],i,j); //в звисимости от сосотояния квадрата, рисуем нужную фигуру
  if move=gamer then
    DrawRect(wt*setx+10, wt*sety+10, wt-20, wt-20); //Если ходит игрок этот игрок, рисуем курсор
  texty:=wt*3; //розчитываем высоту игрового поля
  DrawText('ID: '+id+'', 0, texty); //Выводим информацию о столе
  DrawText('Вы: '+name, 0, texty+20);
  DrawText('Противник: '+name2, 0, texty+40);
  repaint; //перерисовка
end;


Вроде ниче сложно, вот только отрисовку символов "Х" и "О" я вынес в отделюную процедуру.Вот содержимое этой процедуры


Procedure DrawFigure(typ,x,y:integer); //отрисовка "Х" или "О"
var xx,yy:integer; //положение на экране
Begin
  xx:=x*wt; //узнаем точечное положение
  yy:=y*wt;
  if typ=1 then //если "Х"
    begin //Рисуем крестик
      DrawLine(xx,yy,xx+wt,yy+wt);
      DrawLine(xx+wt,yy,xx,yy+wt);
    end;
  if
typ=2 then //Если "О"
    DrawEllipse(xx,yy,wt,wt);
end;


Ну вот, отрисовка теперь работает нормально.
Теперь сделаем процедуру приема и разшифровки состояния стола


Procedure GetTable; //Считываем состояние стола
Begin
  s:=GetHTTP('vtable.php?id='+id); //Получаем состояния стола строкой
  k:=0; //обнуляем
  for i:=0 to 2 do
    for
j:=0 to 2 do
      begin

        k:=k+1;//счетчик символов
        map[i,j]:=stringtointeger(copy(s, k-1,k)); //считаем каждый последующий символ
      end;
  move:=stringtointeger(copy(s,9,10)); //Полседний символ отвечает, за ход
end;


Ну и сама процедура игры, которая соединяет все это детище во едино


Procedure game;
begin
  setx:=0; //инициализируем положение курсора
  sety:=0;
  move:=0; //никто не ходит первым
  repeat
    if move<>gamer then GetTable; //получаем состояние стола
    paint; //отрисовка
    if TestWin then break; //проверка на победу
    if move=gamer then //если наш ход
      begin
        key:=KeyToAction(GetKeyClicked); //получаем кода нажатой клавиши
        if (key=GA_UP) and (sety>0) then sety:=sety-1; //если клавиши движения то двигаем
        if (key=GA_DOWN) and (sety<2) then sety:=sety+1;
        if (key=GA_LEFT) and (setx>0) then setx:=setx-1;
        if (key=GA_RIGHT) and (setx<2) then setx:=setx+1;
        if (key=GA_FIRE) and (map[setx,sety]=0) then //покаа не будет нажат "ОГОНЬ"
          begin //после его нажатия
            map[setx,sety]:=gamer; //записываем изменения в переменную
            t:=''; //обнуляем t
            for i:=0 to 2 do
              for j:=0 to 2 do
                t:=t+integertostring(map[i,j]); //составляем строку состояния стола
            if gamer=1 then t:=t+'2' else t:=t+'1'; //и добавляем знак что ходит противник
            move:=0;
            s:=GetHTTP('etable.php?id='+id+'&table='+t); //отправляем данные серверу
          end;
      end else
//иначе
        begin
          Delay(1000); //ждем
        end;
  until false;
  id:=''; //обнуляем id стола
end;


Вы могли заметить, что нужна еще функция TestWin которая будет тестировать поле на победоносность.


Function TestWin:boolean;
var x,o,n,win:integer;
begin
  TestWin:=false;
  if (map[0,0]=map[1,0]) and (map[1,0]=map[2,0]) then win:=map[2,0]; //проверяем все возможные случаи
  if (map[0,1]=map[1,1]) and (map[1,1]=map[2,1]) then win:=map[2,1];
  if (map[0,2]=map[1,2]) and (map[1,2]=map[2,2]) then win:=map[2,2];
  if (map[0,0]=map[0,1]) and (map[0,1]=map[0,2]) then win:=map[0,2];
  if (map[1,0]=map[1,1]) and (map[1,1]=map[1,2]) then win:=map[1,2];
  if (map[2,0]=map[2,1]) and (map[2,1]=map[2,2]) then win:=map[2,2];
  if (map[0,0]=map[1,1]) and (map[1,1]=map[2,2]) then win:=map[2,2];
  if (map[0,2]=map[1,1]) and (map[1,1]=map[2,0]) then win:=map[2,0];
  for i:=0 to 2 do
    for
j:=0 to 2 do
      if
map[i,j]=0 then n:=n+1; //проверяем возможност ьна ничью
  if (win>0) or (n=0) then  //если ничья, или чья-то победа
    begin
      TestWin:=true; //ок
      if win=gamer then s:='Ты победил!' else s:='Ты проиграл!'; //проверяем кто победил
      if (n=0) and (win=0) then s:='Ничья!';//а если никто, то ничья
      SetColor(255,255,255);
      FillRect(0,0,GetWidth,30);
      SetColor(0,0,0);
      DrawText(s,2,2); //выводим результат на экран
      repaint;
      Delay(2000);
    end;
end;


Ну вот и все!Вот видеодемонстрация работоспособности :

Если не получилос, Вы можете скачать готовые файлы проэкта: Скачать

Спасибо за внимание.Удачи в написании собственных проэктов!

Если вы нашли ошибки/очепятки в тексте то сообщите о них на форуме
А также можете заказать программу/игру на этой странице

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