Люди, помогите написать пожалуйста змейку, обычную змейку в графическом режиме; без всяких $, ассемблеров и неизвестных вещей начинающему программисту. Вот начальный код (только это начало и в нём мнооооооооогое не осуществлено):
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 crt, graph; const N = 61; type arr = Array[0..N, 0..N] of byte; {=================} {procedure newt(var field : arr); var i, j : byte; begin Repeat i := random(N); j := random(N); if (field[i, j] <> 1) and (field[i, j] <> 2) then field[i, j] := 2 until (field[i, j] <> 1) and (field[i, j] <> 2) and (field[i, j] <> 3); end; } {=================} function st(a : longint) : String; var s : string; Begin Str(a, s); st := s; End; {=================} procedure grafika(field : arr); var i, j : byte; begin for i := 1 to N do begin for j := 1 to N do begin if field[i, j] = 0 then begin setcolor(0); setfillstyle(1, 0); bar((i - 1) * (getmaxy div N), (j - 1) * (getmaxy div N), i * (getmaxy div N), j * (getmaxy div N)); end; if field[i, j] = 1 then begin setcolor(12); setfillstyle(1, 12); bar((i - 1) * (getmaxy div N), (j - 1) * (getmaxy div N), i * (getmaxy div N), j * (getmaxy div N)); end; if field[i, j] = 2 then begin setcolor(2); setfillstyle(1, 10); bar((i - 1) * (getmaxy div N), (j - 1) * (getmaxy div N), i * (getmaxy div N), j * (getmaxy div N)); end; end; end; end; {=================} procedure playing(var esc : boolean; var dir, newdir : byte; var score : integer; speed : integer; var field : arr; ranx, rany : integer); var i, j, l, m, i1, j1 : Integer; pause : boolean; begin for i := 0 to 61 do begin for j := 0 to 61 do field[i, j] := 0; end; m := 0; l := 0; cleardevice; esc := false; dir := 1; setcolor(14); settextstyle(defaultfont, horizdir, 2); outtextxy(getmaxx div 2 - 250, getmaxy div 2, 'SELECT THE SPEED (0..9): '); repeat speed := ord(readkey) - 48; until (speed <= 9) and (speed >= 0); outtextxy(getmaxx div 2 + 185, getmaxy div 2, st(speed)); delay(30000); cleardevice; setcolor(9); 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)); setcolor(12); outtextxy(getmaxx - 150, 250, 'Press <Esc>'); outtextxy(getmaxx - 150, 265, 'for exit'); outtextxy(getmaxx-150,300,'Press <Space>'); outtextxy(getmaxx-150,315,'for pause'); i := 30; j := 30; {for l := -1 to 1 do field[i, j + l] := 1; i1 := 30; j1 := 29;} repeat {newt(field);} if keypressed then case readkey of #119 : newdir := 1; #115 : newdir := 2; #97 : newdir := 3; #100 : newdir := 4; #27 : esc := true; #32 : pause := true; end; if pause=true then begin pause := false; repeat until keypressed; end; if (newdir=1) and (dir<>2) then dir:=newdir; if (newdir=2) and (dir<>1) then dir:=newdir; if (newdir=3) and (dir<>4) then dir:=newdir; if (newdir=4) and (dir<>3) then dir:=newdir; case dir of 1: j := j - 1; 2: j := j + 1; 3: i := i - 1; 4: i := i + 1; end; {field[i, j] := 1; field[i1, j1] := 0;
if field[i1 - 1, j1] = 1 then i1 := i1 - 1 else if field[i1 + 1, j1] = 1 then i1 := i1 + 1 else if field[i1, j1 - 1] = 1 then j1 := j1 - 1 else if field[i1, j1 + 1] = 1 then j1 := j1 + 1;} grafika(field); setcolor(14); line(getmaxy, 0, getmaxy, getmaxy); for l := 0 to N do begin m := 0; If field[l, m] = 1 then esc := true; end; for l := 0 to N do begin m := N; If field[l, m] = 1 then esc := true; end; for m := 0 to N do begin l := 0; If field[l, m] = 1 then esc := true; end; for m := 0 to N do begin l := N; If field[l, m] = 1 then esc := true; end; delay(3000 - 2500 * speed div 9); until esc = true; end; {=================} var speed, score, grdriver, grmode, ranx, rany : integer; field : arr; dir, newdir : byte; esc, quit : boolean; BEGIN grDriver:=Detect; InitGraph(grDriver, grMode, ''); randomize; esc := false; playing(esc, dir, newdir, score, speed, field, ranx, rany); delay(20000); repeat setcolor(11); settextstyle(defaultfont,horizdir,4); outtextxy(getmaxx div 2 -250,getmaxy div 2,'GAME OVER'); setcolor(15); settextstyle(defaultfont,horizdir,2); outtextxy(getmaxx div 2 -250,getmaxy div 2 +100,'Play again? (y/n)...'); case readkey of #121 : playing(esc, dir, newdir, score, speed, field, ranx, rany); #110 : quit:=true; end; until quit; closegraph; END.
Скажите, пожалуйсто, как сделать, чтобы змейка стирала за собой, а не оставляла след? Как сделать, чтобы при врезании в себя, вы проигрывали? Как сделать, чтобы квадритики для собирания появлялись по одному и при их сборе змейка удлинялась? И как сделать, чтобы массив до желтой лиии был? Вроде всё правильно, а всё равно не доходит. И кодом желательно =) Заранее скажу, чтобы вы меня не осуждали, я взял оформление у одного из пользователей форума.
Скажите, пожалуйсто, как сделать, чтобы змейка стирала за собой, а не оставляла след? Как сделать, чтобы при врезании в себя, вы проигрывали? Как сделать, чтобы квадритики для собирания появлялись по одному и при их сборе змейка удлинялась? И как сделать, чтобы массив до желтой лиии был? Вроде всё правильно, а всё равно не доходит. И кодом желательно =) Заранее скажу, чтобы вы меня не осуждали, я взял оформление у одного из пользователей форума. [/quote]
Я попробовал сделать для ячеек наличае занятости в проге с роботами думаю как идея поможет