В продолжение предыдущего поста Игра Сокобан – текстовая реализация на 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.



хм, а я круче написал! с зашибенным интерфейсом!
kak zapustit i kakaimi klaviwami igrat’??????????????????????????????????????????????
Free Pascal выдает ошибку на строке
{проверяет свободна ли клетка и не выходит ли она за границы поля}
function CheckNext(x:integer; y:integer):boolean;
var
isset: Boolean; {флаг проверки занятости клетки или выхода за границы поля}
i: integer;
begin
isset := True; <=== ВОТ ТУТ
пардон, не туда запостил, сорри )))))