uses crt,graph; const gr_x0=19; gr_x1=621; gr_y0=19; gr_y1=461; var p:array[1..20]of pointer; i:integer; { INIT_GRAPH } PROCEDURE init_graph; var drv,mode:integer; BEGIN drv:=VGA; mode:=VGAHI; initgraph(drv,mode,'c:\bp\bgi'); END; PROCEDURE save_img; const c1=1; c2=5; c3=14; c4=4; var size,a,b:word; BEGIN setfillstyle(1,10); {фон} bar(0,0,getmaxX,getmaxY); {--- голова вправо ---} setfillstyle(1,c1); bar(1,1,3,3); bar(4,4,9,9); bar(1,7,3,9); setfillstyle(1,c2); bar(1,4,3,6); {--- голова влево ---} setfillstyle(1,c1); bar(23,1,25,3); bar(17,4,22,9); bar(23,7,25,9); setfillstyle(1,c2); bar(23,4,25,6); {--- голова вниз ---} setfillstyle(1,c1); bar(30,1,38,3); bar(30,4,35,9); setfillstyle(1,c2); bar(33,1,35,3); {--- голова вверх ---} setfillstyle(1,c1); bar(40,10,42,12); bar(43,4,48,9); bar(46,10,48,12); setfillstyle(1,c2); bar(43,10,45,12); {--- хвост вправо ---} setfillstyle(1,c1); bar(53,7,58,9); bar(59,4,64,9); {--- хвост влево ---} setfillstyle(1,c1); bar(72,7,77,9); bar(66,4,71,9); {--- хвост вниз ---} bar(82,1,84,6); bar(82,7,87,12); {--- хвост вверх ---} bar(98,7,100,12); bar(95,1,100,6); {--- еда ------------} setfillstyle(1,c4); bar(108,1,110,9); bar(105,4,113,6); setfillstyle(1,c3); bar(108,4,110,6); {--- тело горизонтальное ---} setfillstyle(1,c1); bar(53,17,64,22); setfillstyle(1,c2); bar(59,17,61,19); bar(56,20,58,22); {--- тело вертикальное ---} setfillstyle(1,c1); bar(69,14,74,25); setfillstyle(1,c2); bar(69,17,71,19); bar(72,20,74,22); {--- изгиб вверх-вправо ---} setfillstyle(1,c1); bar(85,17,90,22); bar(82,20,87,25); setfillstyle(1,c2); bar(85,20,87,22); {--- изгиб вправо-вниз ---} setfillstyle(1,c1); bar(92,17,97,22); bar(95,20,100,25); setfillstyle(1,c2); bar(95,20,97,22); {--- изгиб влево-вверх ---} setfillstyle(1,c1); bar(108,14,113,19); bar(111,17,116,22); setfillstyle(1,c2); bar(111,17,113,19); {--- изгиб вниз-влево ---} setfillstyle(1,c1); bar(121,14,126,19); bar(118,17,123,22); setfillstyle(1,c2); bar(121,17,123,19); {***** сохранение *******} a:=0; b:=0; for i:=1 to 20 do begin if i=10 then begin a:=0;b:=13;end; size:=imagesize(1+a,1+b,12+a,12+b); getmem(p[i],size); getimage(1+a,1+b,12+a,12+b,p[i]^); a:=a+13; end; END; PROCEDURE fon; BEGIN setfillstyle(1,0); bar(0,0,getmaxX,getmaxY); setfillstyle(1,10); bar(gr_x0,gr_y0,gr_x1,gr_y1); setcolor(10); rectangle(gr_x0,gr_y0,gr_x1,gr_y1); END; PROCEDURE start_game; var d:array[1..500]of record x,y:word; m:byte; end; max_d:word; {максимальное количество элементов} flag_exit,flag_eda:boolean; k:char; tmp_m,speed:longint; eda_x,eda_y:word; s:integer; ts:string; BEGIN s:=0; randomize; speed:=10000; max_d:=4; for i:=max_d downto 1 do begin d[i].x:=gr_x0+1+12*(i-1); d[i].y:=gr_y0+1; d[i].m:=1; end; flag_eda:=false; flag_exit:=false; {*****************************************************************} repeat {---- отобразить еду -------------------------------------} if flag_eda=false then begin repeat flag_eda:=false; eda_x:=gr_x0+1+12*random(round((gr_x1-gr_x0)/19)); eda_y:=gr_y0+1+12*random(round((gr_y1-gr_y0)/19)); for i:=max_d downto 1 do if (d[i].x=eda_x)and(d[i].y=eda_y) then flag_eda:=true until flag_eda=false; putimage(eda_x,eda_y,p[9]^,normalput); flag_eda:=true; end; {---------------------------------------------------------} {----- клава ---------------------------------------------} if keypressed then case readkey of #0: begin k:=readkey; if (k=#77)and(d[1].m<>2) then d[1].m:=1; if (k=#80)and(d[1].m<>4) then d[1].m:=3; if (k=#75)and(d[1].m<>1) then d[1].m:=2; if (k=#72)and(d[1].m<>3) then d[1].m:=4; end; #27: flag_exit:=true; end; delay(speed); {---------------------------------------------------------} {----- изменение позиций (данные) ------------------------} for i:=max_d downto 2 do d[i]:=d[i-1]; case d[1].m of 1: if d[1].x+2>gr_x1-12 then d[1].x:=gr_x0+1 else d[1].x:=d[1].x+12;{вправо} 3: if d[1].y+2>gr_y1-12 then d[1].y:=gr_y0+1 else d[1].y:=d[1].y+12;{вниз } 2: if d[1].x-2