Игра змейка - Pascal ABC

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста, нужно написать игру "Змейка", как в тетрисе.

Решение задачи: «Игра змейка»

textual
Листинг программы
     program Zmeya;
Uses graphabc, events,timers;
 
const
r=5 ;
d=7;
 
type
TDirection = (None, Left, Right, Up, Down);
 
var x,t,y,i,z,xr,yr,prin1,prin2,prin3,prin4,prin5,k,s4et,prin6: integer;
  Direction :TDirection;
  xs,ys,bufx,bufy:array[1..200]of integer;
 
 
  procedure shar3;
     begin
     SetBrushColor(clYellow);
     circle(xs[k],ys[k],r);
     end;
 
procedure Circl;
begin
  SetBrushColor(clBlack);
  circle(x,y,r);
end;
 
procedure rshar ;
      begin
      xr:=Random(WindowWidth) ;
      yr:=Random( WindowHeight);
      end;
 
procedure rshar2;
       begin
       SetBrushColor(clYellow);
      circle(xr,yr,r);
      end;
 
          procedure XP(Key:integer);
            begin
                                                 case Key of
                                                 VK_Left: Direction := Left ;
                                                 VK_Right:Direction := Right ;
                                                 VK_UP:  Direction := UP ;
                                                 VK_Down: Direction :=Down ;
                                                 end;
             circle(x,y,r);
             end;
 
 
           procedure pause;
                       begin
                  for i:=1 to 1 do
                  begin
                  Circl;
                  rshar2;
                  ClearWindow;
                  rshar2  ;
                  prin1:=(xr-x+r)*(xr-x+r)+(yr-y)*(yr-y)  ;
                  prin2:=(xr-x-r)*(xr-x-r)+(yr-y)*(yr-y)  ;
                  prin3:=(xr-x)*(xr-x)+(yr-y+r)*(yr-y+r)  ;
                  prin4:=(xr-x)*(xr-x)+(yr-y-r)*(yr-y-r)  ;
                  prin5:=R*R;
                  if (prin1)<=(prin5) then begin
                                           rshar ;
                                           s4et:=s4et+1;
                                           end;
 
 
                   if (prin2)<=(prin5) then begin
                                            rshar ;
                                            s4et:=s4et+1;
                                            end;
                   if (prin3)<=(prin5) then begin
                                            rshar ;
                                            s4et:=s4et+1;
                                            end;
                   if (prin4)<=(prin5) then begin
                                            rshar ;
                                            s4et:=s4et+1;
                                            end;
 
                    case Direction of
                    Left: begin   x:=x-d; if x<=0 then x:=WindowWidth  end;
                    Up:  begin    y:=y-d; if y<=0 then y:=WindowHeight  end;
                    Right: begin  x:=x+d; if x>=WindowWidth then x:=0  end;
                    Down: begin   y:=y+d; if y>=WindowHeight then y:=0  end;
                    end;
                            xs[1]:=x;
                            ys[1]:=y;
                            for k:=1 to s4et do
                            begin
                             bufx[k]:=xs[k];
                             bufy[k]:=ys[k];
 
                            end;
                            for k:=1 to s4et do
                            begin
                            xs[k+1]:=bufx[k];
                            ys[k+1]:=bufy[k] ;
                            end;
                            for k:=2 to s4et do
                            shar3;
                           Circl;
                     end;
                end;
 begin
rshar;
s4et:=2;
 
 Direction := None;
 
 x:=WindowWidth div 2;
 y:=WindowHeight div 2;
  OnKeyDown:=XP;
  CreateTimer(150,pause);
 
end.

Объяснение кода листинга программы

Этот код написан на языке Pascal ABC и представляет собой игру Змейка. В нем используются следующие переменные:

  • x, y, z, i, j, k - координаты движения змейки
  • Direction - направление движения змейки (в данном случае используется перечисление TDirection)
  • xs, ys, bufx, bufy - массивы для хранения координат змейки
  • s4et - счетчик для обновления координат змейки Процесс игры выглядит следующим образом:
    1. Создается таймер, который вызывает процедуру pause каждые 150 миллисекунд.
    2. В процедуре pause происходит следующее:
      • Создаются два круга с радиусом r (радиус змейки)
      • Задаются начальные координаты змейки (x, y)
      • Задается направление движения змейки (в данном случае используется случайное направление)
      • Обновляются координаты змейки (x, y)
      • Вычисляется скорость змейки (в зависимости от направления движения)
      • Если скорость змейки меньше или равна скорости игрового процесса (которая задана в 150 миллисекунд), то обновляется положение змейки
      • Если скорость змейки больше скорости игрового процесса, то обновляется только положение змейки
      • Если змейка сталкивается со стеной (то есть если ее координата x или y становится отрицательной или превышает размеры окна игры), то игра заканчивается
      • Если змейка съедает свой хвост, то также игра заканчивается
      • Если змейка достигает центра поля (то есть если ее координата x или y становится равной 0), то увеличивается счетчик s4et, который используется для обновления координат змейки
    3. В процедуре XP обрабатываются нажатия клавиш на клавиатуре. В зависимости от нажатой клавиши изменяется направление движения змейки.
    4. В процедуре pause после обновления координат змейки вычисляется скорость змейки. Скорость вычисляется как среднее арифметическое между текущей скоростью змейки и предыдущей скоростью змейки. Это делается для того, чтобы скорость змейки постепенно уменьшалась по мере ее движения.
    5. В процедуре Circl создается круг с заданными координатами (x, y).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы