неплохо неплохо.. вот рандомная трасса + пояснения

program race01;
var
{Наверное также сделаны подобные игрушки, я не разбирался... но если нет, то ставьте мой копирайт ;)}
n1 :array[0..99]of integer;
n2 :array[0..10]of image;
n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16:integer;
begin
{programming by arT (c). e-mail: ironWoodcutter@bk.ru}
///////////////////////////////////
for n3:=0 to 60 do n1[n3]:=random(3)-1; ////создаем трассу
///////////////////////////////////
for n3:=0 to 10 do n2[n3]:=loadimage('/'+n3+'.png'); ////грузим в масив рисунки (10) из res\
n4:=getwidth;
n6:=n4 div 2;
n5:=getheight;
n8:=0;
n9:=n6;
n16:=0;
n7:=0;
repeat
setcolor(0,255,0); ////нижнюю половину
fillrect(0,99,n4,n5-99); ////прорисовываем зеленым
n12:=n9;
for n11:=n5-1 downto 99 do ////строим дорогу
begin
n12:=n12+((n5-n11)div 16)*n1[(n8+((n5-1)-n11)*8)div 256];
n13:=n12-(n11-60);
n14:=n12+(n11-60);
if n13<0 then n13:=0;
if n14>n4 then n14:=n4;
setcolor(60,40,30);
while n13<n14 do begin plot(n13,n11);n13:=n13+1;end; ////рисуем дорогу
n13:=n12-((n11-99)div 8);
n14:=n12+((n11-99)div 8);
if n13<0 then n13:=0;
if n14>n4 then n14:=n4;
n15:=(n8+((n5-1)-n11)*8)and $ff;
if ((n15>=0)and (n15<=40))or ((n15>=80)and (n15<=120))or ((n15>=160)and (n15<=200))then
begin
setcolor(255,255,255);
while n13<n14 do begin plot(n13,n11);n13:=n13+1;end; ////рисуем разметку
end;
end;
drawimage(n2[0],-((255-n12)and $ff),0); ////вставляем небо
n15:=3-n7;
if (n8 and 12)<>0 then n15:=n15+5;
drawimage(n2[n15],n6-23,n5-30); ////вставляем тачку
setcolor(255,255,255);
drawtext('x:'+n8+' y:'+n9+' spd:'+n16+' cnt:'+n12,0,0); ////инфа вверху
repaint;
n10:=keytoaction(getkeypressed);////управление
if (n10=ga_up)then if (n16<30)then n16:=n16+2;
if (n10=ga_down)then if (n16>0)then n16:=n16-2;
if (n10=ga_right)then if (n7<2)then n7:=n7+1;
if (n10=ga_left)then if (n7>-2)then n7:=n7-1;
if n16>0 then
begin
n8:=n8+(n16 div 2);
if n8>(56*256)then n8:=0;//restart
n9:=n9-n7+(1+(n16 div 8))*n1[(n8+128)div 256];
if n9<0 then n9:=0;
if n9>n4 then n9:=n4;
if (n9<=0)or (n9>=n4)then if (n16>3)then n16:=n16-3;
if (n16>60)then
if (n7>0)then n7:=n7-1
else if (n7<0)then n7:=n7+1;
end;
delay(10);
until n10=ga_fire;
end.