Этот сайт ждет реконструкции!
Обязательно зайдите к нам еще раз как-нибудь.
Если вы что-то искали и не нашли, или у вас возникли вопросы, пишите на e-mail: ivan@ignatiev.su

Игра Змейка – текстовая реализация на языке Pascal

В продолжение предыдущего поста Игра Сокобан – текстовая реализация на Pascal.

Игра Змейка

Игра Змейка - текстовая реализация на языке Pascal

Дальше текст программы

program  csnake;
uses crt;
type
 sPoint = record
  x:integer;
  y:integer;
 end; {тип для точки} 
const
 maxWidth = 40; {максимальна длинна змейки} 
var
 width: integer; {длина змейки}
 e :sPoint; {координаты еды} 
 snakebody: array [1..maxWidth] of sPoint; {массив с координатами частей тела змейки} 
 i, {считчик цикла} 
	nx, ny:integer {координаты головы змейки} ; 
 v: byte; {вектор направления головы змейки} 
 gameover: boolean; {флаг окончания игры} 
 key: char; {буфер клавиши} 
 
 {проверяет свободна ли клетка и не выходит ли она за границы поля} 
function CheckNext(x:integer; y:integer):boolean;
var
 isset: Boolean; {флаг проверки занятости клетки или выхода за границы поля} 
 i: integer;
begin
  isset := True;
  for i:=1 to width do
  begin {проверяем нет ли на места клетки змейки} 
   if (x = snakebody[i].x) and ( y = snakebody[i].y ) then
      isset := False;
  end;
  if isset then
  begin {проверяем не вышла ли голова змейки за границы поля} 
   if (x <= 0) or (y<=0) or (x>=80) or (y>=25) then isset := False;
  end;
  CheckNext := isset;
end;
 
{создает еду на поле} 
procedure NewEat;
begin
 e.x := random(78) + 2;
 e.y := random(23) + 2; {генерируем координаты еды} 
 
 {если место занято, генерируем еще раз, и так пока не найдем свободное} 
 while (not CheckNext(e.x, e.y)) do
 begin
  e.x := random(78) + 2;
  e.y := random(23) + 2;
 end;
end;
 
{перемещает змейку}
procedure MoveSnake(x,y:integer);
var
 i:integer; {счетчик цикла} 
begin
 for i:=1 to width do
 begin
  snakebody[i] := snakebody[i+1]; 
 end; {перещаем все состовляющие змеки, на место соседнего} 
 
 snakebody[width].x := x;
 snakebody[width].y := y; {голове змейки присваиваем новые координаты} 
 
 if (x = e.x) and (y = e.y) then {если голова нашла еду} 
 begin
  width := width + 1; {добавляем еще 1 клетку к змейке} 
  snakebody[width].x := x;
  snakebody[width].y := y;
  NewEat; {создаем новую еду} 
 end;
end;
 
begin
 gameover := false;
 {выстраиваем начальное тело змейки} 
 width := 4;
 
 snakebody[1].x := 1;
 snakebody[1].y := 1;
 
 snakebody[2].x := 2;
 snakebody[2].y := 1;
 
 snakebody[3].x := 3;
 snakebody[3].y := 1;
 
 snakebody[4].x := 4;
 snakebody[4].y := 1;
 
 clrscr;
 v  := 1;
 
 Randomize;
 
 NewEat; {создаем еду} 
 
 while(width < maxWidth) do {пока длина змейки меньше заданной} 
 begin
 
   if (KeyPressed) then {если была нажата клавиша} 
   begin
     key:=Readkey; {считываем её} 
     case key of
      'w': begin if v = 4 then continue; v := 3;  end; {вверх}  
      's': begin if v = 3 then continue; v := 4;  end; {вниз} 	  
      'a': begin if v = 1 then continue; v := 2;  end; {влево} 
      'd': begin if v = 2 then continue; v := 1;  end; {впправо} 
      #27: break; {выход} 
     end;
   end;
 
   clrscr;
 
   {поеределение направления движения головы змейки}
   case v of
    1: begin nx := snakebody[width].x + 1;  ny := snakebody[width].y; end; {вправо}
    2: begin nx := snakebody[width].x - 1;  ny := snakebody[width].y; end; {влево}
    3: begin nx := snakebody[width].x;  ny := snakebody[width].y - 1; end; {вверх}
    4: begin nx := snakebody[width].x;  ny := snakebody[width].y + 1; end; {вниз}
   end;
 
   {если впереди граница или препятствие} 
   if (not CheckNext(nx,ny)) then
   begin
    gameover := true; {заканчиваем игру с поражением пользователя}
    break;
   end;
 
   MoveSnake(nx, ny); {перемещаем змейку} 
 
   gotoxy(e.x, e.y);
   write(''); {отображаем еду} 
 
 
   for i:=1 to width-1 do
    begin {отображаем тело змейки} 
     gotoxy(snakebody[i].x, snakebody[i].y);
     write('Ы');
    end; 
   gotoxy(snakebody[width].x, snakebody[width].y);
   write('+'); {отображение головы змейки} 
 
   gotoxy(80,25); {уводим курсор, чтобы не мешал} 
 
   Delay(30000); {задержка, для разных процессоров разная!}  
 end;
 
 clrscr;
 
 if (gameover) then {выводим сообщение пользователю о выйгрыше или проигрыше} 
  WriteLn('GAME OVER!')
 else
  WriteLn('YOU WIN!');
 
  WriteLn('Press Enter for exit!');
  readln;
end.

Комментарии к этой программе, такие же, как и к предыдущей.

Конечно интереснее, если сделать графическое отображение, например через модуль graph, но текстовое исполнение, добавляет немного романтики времени MS-DOS.

Tags: ,

RSS 2.0 - Узнай первым, о обновлениях в комментариях к этой записи

4 комментария

  1. программёр

    хм, а я круче написал! с зашибенным интерфейсом!

  2. kak zapustit i kakaimi klaviwami igrat’??????????????????????????????????????????????

  3. Free Pascal выдает ошибку на строке

    {проверяет свободна ли клетка и не выходит ли она за границы поля}
    function CheckNext(x:integer; y:integer):boolean;
    var
    isset: Boolean; {флаг проверки занятости клетки или выхода за границы поля}
    i: integer;
    begin
    isset := True; <=== ВОТ ТУТ

  4. пардон, не туда запостил, сорри )))))

Оставить комментарий