Люди, помогите написать пожалуйста змейку, обычную змейку в графическом режиме; без всяких $, ассемблеров и неизвестных вещей начинающему программисту. Вот начальный код (только это начало и в нём мнооооооооогое не осуществлено):
uses crt, graph; type arr = Array[1..60, 1..60] of byte; {=================} procedure newt(var field : arr); var i, j : byte; begin randomize; i := random(60); j := random(60); if (field[i, j] <> 1) and (field[i, j] <> 2) then field[i, j] := 2; end; {=================} function st(a : longint) : String; var s : string; Begin Str(a, s); st := s; End; {=================} procedure snake(var snake : arr); var i, j : byte; begin i := 30; for j := 29 to 31 do snake[i, j] := 1; end; {=================} procedure grafika(field : arr); var i, j : byte; begin for i := 1 to 60 do begin for j := 1 to 60 do begin if field[i, j] = 0 then begin setcolor(0); setfillstyle(1, 0); bar((i - 1) * 8, (j - 1) * 8, i * 8, j * 8); end; if field[i, j] = 1 then begin setcolor(4); setfillstyle(1, 4); bar((i - 1) * 8, (j - 1) * 8, i * 8, j * 8); end; if field[i, j] = 2 then begin setcolor(2); setfillstyle(1, 10); bar((i - 1) * 8, (j - 1) * 8, i * 8, j * 8); end; end; end; end; {=================} {=================} var speed, score, grdriver, grmode : integer; field : arr; BEGIN grDriver:=Detect; InitGraph(grDriver, grMode, ''); setcolor(1); rectangle(0, 0, 480, 480); settextstyle(defaultfont, horizdir, 1); outtextxy(getmaxx - 100, 30, 'SPEED'); outtextxy(getmaxx - 40, 30, st(speed)); outtextxy(getmaxx - 100, 15, 'SCORE'); outtextxy(getmaxx - 40, 15, st(score)); grafika(field); newt(field); END.
Ещё такая проблема: если повторяю через репит вывод newt, то границы поля не отображаются, и не выводится процедура snake.
uses Sunit,crt,graph; label te; var f:text; g,m,x:integer; key:char; over:boolean; s1,s2:string; begin randomize; over:=false; g:=detect; m:=getgraphmode; initgraph(g,m,''); rectangle(10,10,160,160); OutTextXY(170,10,'Score'); key:=readkey; case key of #72 : direction:=1; #80 : direction:=2; #75 : direction:=3; #77 : direction:=4; #27 : goto te; end;
head.x:=6; head.y:=6; cl:=1;
for x:=1 to 5 do spawnapple(x);
repeat if keypressed then begin key:=readkey; case key of #72 : if direction<>2 then direction:=1; #80 : if direction<>1 then direction:=2; #75 : if direction<>4 then direction:=3; #77 : if direction<>3 then direction:=4; #27 : goto te; end; end;
updatetail; movehead(direction); drawsnake;
for x:=1 to 5 do if (apples[x].x=head.x) and (apples[x].y=head.y) then eatapple(x); if cl>1 then for x:=2 to cl-1 do if (body[x].x=head.x) and (body[x].y=head.y) then goto te; if score<50 then delay(100 - score) else delay(50); until over; te: closegraph; clrscr; assign(f,'Hiscore.txt'); reset(f); readln(f,s1); readln(f,s2); close(f); val(s2,x,g); Writeln(s1,' : ', s2); if score > x then begin writeln('New HIGHSCORE!'); Write('Enter your name: '); readln(s1); str(score,s2); rewrite(f); writeln(f,s1); writeln(f,s2); close(f); end; Writeln('Game Over!'); Writeln('Your score: ', score); readln; end.
А теперь сам модуль Sunit
unit sunit; interface uses graph; {User types} type dir=1..4; coordinate=record x,y:integer; end; {Procedures} procedure DrawApple(i:integer); procedure SpawnApple(i:integer); procedure EatApple(i:integer); procedure UpdateTail; procedure Grow; procedure MoveHead(d:dir); procedure DrawSnake; procedure UpdateScore; {Variables} var head:coordinate; body:array[1..30] of coordinate; cl:integer; apples:array[1..5] of coordinate; score:integer; s:string; direction:dir;
implementation
procedure UpdateScore; begin setfillstyle(0,0); setcolor(red); bar(170,20,210,40); str(score,s); outtextxy(170,25,s); end;
procedure SpawnApple; label loop; var x:integer; begin loop: apples[i].x:=random(14); apples[i].y:=random(14); for x:=1 to cl do if (body[x].x=apples[i].x) and (body[x].y=apples[i].y) then goto loop; drawapple(i); end;
procedure DrawApple; begin setcolor(red); circle(apples[i].x*10+15,apples[i].y*10+15,4); setfillstyle(0,red); floodfill(apples[i].x*10+15,apples[i].y*10+15,red); end;
procedure EatApple; begin score:=score+1; Grow; updatescore; spawnapple(i); end;
procedure Grow; begin if cl < 30 then cl:=cl+1; end;
procedure MoveHead; begin case d of 1: if head.y<>0 then head.y:=head.y-1 else head.y:=14;{Up} 2: if head.y<>14 then head.y:=head.y+1 else head.y:=0;{Down} 3: if head.x<>0 then head.x:=head.x-1 else head.x:=14;{Left} 4: if head.x<>14 then head.x:=head.x+1 else head.x:=0;{Right} end; end;
procedure UpdateTail; var i:integer; begin if i<>1 then for i:=cl downto 1 do begin body[i].x:=body[i-1].x; body[i].y:=body[i-1].y; end; body[1].x:=head.x; body[1].y:=head.y; end;
как откомпилируешь, в папке с игрой должен быть пустой файл Hiscore.txt, модуль Sunit.tpu, модуль EGAVGA.BGI, иначе функция сохранения рекордов корректно работать не будет. Правда есть один баг, когда поворачиваешь, невозможно повернуть сразу же ещё раз, пока змейка не пройдет минимум 1 клетку. Да и размеры клеток фиксированы (10 пикселей)