Можно вот так:
Program snakeGAME;
uses GraphABC, ABCObjects;
var i, k, xhead, yhead, z, appleX,appleY, longintSnake, PreviousStep: integer;
apple, head: CircleABC;
snake: array[1..50] of CircleABC;//массив звеньев змейки
score, GameOver:TextABC;//надписи Счета и ГеймОвера
procedure KeyDown(key: integer);
begin
//определение направления движения
if(key=vk_Right) then z:=1; xhead:=xhead+40;
if(key=vk_Left) then z:=2; xhead:=xhead-40;
if(key=vk_Up) then z:=3; yhead:=yhead-40;
if(key=vk_Down) then z:=4; yhead:=yhead+40;
end;
begin
randomize;
longintSnake:=2;
//создание клеток для визуализации работы змейки
for i:=0 to 12 do
line(0, 40*i, windowWidth, 40*i);
for i:=0 to 16 do
line(40*i, 0, 40*i, windowHeight);
//координаты головы змейки и ее создание
xhead:=3*40-20;
yhead:=2*40-20;
head := CircleABC.Create(xhead, yhead, 20, clPurple);
for i:=1 to longintSnake do begin
Snake[i] := CircleABC.Create(xhead, yhead+40*i, 20, clpurple)
end;
appleX:=6*40-20;
appleY:=3*40-20;
apple:=circleABC.Create(appleX, appleY, 20, clRed);
//Счет в игре
Score:=TextABC.Create(0,0,20,'0', clGreen);
{longintSnake:=4;
PreviousStep:=4;}
//игровой цикл, действует через каждые 150 милисекунд
while (true) do begin
onKeyDown:=KeyDown;
//движение всех звеньев начиная с последнего до первого
if (z<>0) then begin
for k:=longintSnake downto 2 do begin
Snake[k].MoveTo(snake[k-1].position.X, snake[k-1].Position.Y);
end;
snake[1].MoveTo(xhead-20, yhead-20);
end;
//определение направления змейки
if(z=1) then xhead:=xhead+40
else if(z=2) then xhead:=xhead-40
else if(z=3) then yhead:=yhead-40
else if(z=4) then yhead:=yhead+40;
//конец игры в случае достижения этих условий
if xhead>windowWidth then begin GameOver:=TextABC.Create(80, 200, 60, 'GAME OVER' ,clBlack); Exit; end;
if xhead<0 then begin GameOver:=TextABC.Create(80, 200, 60, 'GAME OVER' ,clBlack); Exit; end;
if yhead>windowHeight then begin GameOver:=TextABC.Create(80, 200, 60, 'GAME OVER' ,clBlack); Exit; end;
if yhead<0 then begin GameOver:=TextABC.Create(80, 200, 60, 'GAME OVER' ,clBlack); Exit; end;
//цикл яблока(появление и счет очков)
if ((xhead=applex) and(yhead = appley)) then begin
applex:=random(1, 16)*40-20;
appley:=random(1, 12)*40-20;
apple.MoveTo(appleX-20, appleY-20);
score.Text:=((score.Text).ToInteger + 1).ToString();
longintSnake:=longintSnake + 1;
Snake[longintSnake] := CircleABC.Create(xhead, yhead+40*i, 20, clpurple)
end;
//движение головы змейки
head.MoveTo(xhead-20, yhead-20);
sleep(150);
end;
end.