-
Срочно нужен алгоритм, исходник змейки. Где вожно скачать или почитать...
-
Алгоритм чего? Как змейка движеться?
-
> [1] @!!ex © (23.08.07 12:39)
Видимо это какой-то украинский программист. :)
-
Я вчера э**л баран сейчас пишу я на фортран :) (башорг)
Я делал свою змейку так: есть поле х на у размером. Каждая ячейка - байт. 0-3 - значит, что в ней находится сегмент змеи, причом циферь - направление движения этого сегмента, т.е. 0 - влево, 1- вниз, 2- вправо, 3- вверх. Все остальное - 4-255 - разные препятствия, бонусы и т.п. И ещё есть две переменные. В одной храница положение головы, во второй хвоста. В результате все это работает так: ищем ячейку в которой находица голова. Достаем оттуда значение и смотрим куда пойдет голова. Проверяем и переносим голову в то место. Смотрим где у нас хвост, смотрим куда он поползет. Чистим старую ячейку. Все.
-
> [3] Pa5ha © (23.08.07 17:01)
А зафига направление для клеток хранить? Достаточно знать голову, длину и у части тела - направление на следующую. ТОгда все считается элементарно. Двигаем голову. Туловище перемещаем на место головы, в качестве направления указываем направление на старую позицию, проходимся так до конца и все...
-
@!!ex, для вышеописанного врянта надо ещё делать массив для частей тела змеи. А у меня змея длинной хоть со все поле может быть ип ри этом без использования лишней памяти. И для перемещения надо всего лишь два сегмента передвинуть, а не гулять по массиву туда сюда в поисках хвоста.
-
> [5] Pa5ha © (23.08.07 18:56)
Зачем массив? :) Только положение головы хранить надо. Голова указывает на 1 кусок, 1 кусок - на второй и т.д.
-
ну тада получаеца все храница все равно на поле, как у меня ) Но у мя положение хвоста храница отдельно, чтоб не искать хвост по полю. Вот тада и все различие получаеца.
-
Тут кода-то с гулькин нос. Вот основной кусок:
const Nx = 30; //размер поля по оси Х Ny = 20; //размер поля по оси Y
var Field:array [0..Nx-1,0..Ny-1] of byte; //поле Snake:array of TPoint; //змейка Image,Head,Body,Tail:TBitmap; //части змейки d:TPoint; //шаг змейки Counts:integer; //счётчик шагов
//проверка на столкновение function Collision(x,y:integer):boolean; var i:integer; begin Result:=true; if (x<0) or (x>Nx-1) or (y<0) or (y>Ny-1) then exit; for i:=1 to High(Snake) do if (Snake[i].X=Snake[0].X) and (Snake[i].Y=Snake[0].Y) then exit; Result:=false; end;
procedure TMainForm.TimerTimer(Sender: TObject); var i,pX,pY:integer; begin pX:=Snake[0].X+d.X; pY:=Snake[0].Y+d.Y; if Collision(pX,pY) then begin Timer.Enabled:=false; ShowMessage('Неудача'); end; if Field[pX,pY]=1 then begin SetLength(Snake,High(Snake)+2); Field[pX,pY]:=0; end; for i:=High(Snake) downto 1 do Snake[i]:=Snake[i-1]; Snake[0]:=Point(pX,pY); DrawSnake; if Counts=10 then begin Randomize; Field[Random(30),Random(20)]:=1; Counts:=0; end; inc(Counts); end;
-
-
Посмотрите вот сегодня писал. У меня такой баг в игре. Почему при старте игры длина змейки равно 8 snakelength := 8;
На екране появляется 8 квадратиков (спрайтов частей змейки) А при нажатии стрелок. Змейка становится длиной в 1 квадратик. Не знаю почему. Думаю что проблема где то в
procedure MoveSnake;
Незнаю как там правильно сделать. Подскажите пожалуйста.
CODE: __________________________________________________________ unit SNAKE_GAME;
interface
uses Windows, Messages, OpenGL, ENGINE, UTILITS, DRAW2D, INPUT, LOG, SPRITE, TEXTURES, COLLISIONS, CFG, CAMERA_2D;
type directiontype = (none,sdown,sleft,sup,sright);
const GAST_LOADING = 0; GAST_GAME = 1; GAST_RECORD = 2; GAST_EXIT = 3;
var Game_Active_State: integer;
Loading_Interval : integer; Loading_Proc : integer;
loading_img : uint; snake_part_img : uint; game_field_img : uint;
x: integer; score: integer; // Очки level: integer; // Уровень snakelength: integer; // Длина змейки snakegrowth: integer; applepresent: boolean; // есть ли яблочко direction: directiontype; // направление snakex: array of integer; // змейка по X snakey: array of integer; // змейка по Y var applex,appley:integer; // координаты яблока по X по Y
// ГЛАВНЫЕ ПРОЦЕДУРЫ procedure Init_Game; // <- процедура инициализации игры procedure Begin_Game; // <- процедура старта игры function End_Game: Boolean; // <- процедура завершения игры procedure Update_Game; // <- процедура обновления игры
implementation
procedure Init_Game; begin finished := false; // Разрешить СТАРТУ ИГРЫ Game_Active_State := GAST_LOADING;
Loading_Interval := 1; Loading_Proc := 1;
setlength(snakex,1000); // Установить максимальную длину змейки по X setlength(snakey,1000); // Установить максимальную длину змейки по Y snakelength := 8; snakegrowth := 8; for x := (snakelength-1) downto 0 do begin; snakex[x] := 132 - (x*9); snakey[x] := 159; end; score:= 0; // Обнулить очки level := 1; // Установить уровень applepresent := false; // direction := none; // Нет направления
LoadTexture('data\pic\loading.tga', loading_img, false); end;
procedure Game_Loading; begin glColor3ub(255,255,255); // установить белый цвет
Loading_Proc := Loading_Proc + Loading_Interval;
sprite.Draw(150,200,320,240,Loading_img);
if Loading_Proc = 500 then begin LoadTexture('data\pic\field.tga', game_field_img, false); LoadTexture('data\pic\snake_part.tga', snake_part_img, false); end; if Loading_Proc = 510 then begin Loading_Proc := 0; Loading_Interval := 0; Game_Active_State := GAST_GAME; end; end;
procedure MoveSnake; begin For x:= snakelength-1 downto 1 do begin snakex[x] := snakex[x - 1]; snakey[x] := snakey[x - 1]; end;
case direction of sdown: begin snakex[0] := snakex[1]; snakey[0] := snakey[1] + 1; end; sleft: begin snakex[0] := snakex[1] - 1; snakey[0] := snakey[1]; end; sup: begin snakex[0] := snakex[1]; snakey[0] := snakey[1] - 1; end; sright: begin snakex[0] := snakex[1] + 1; snakey[0] := snakey[1]; end; end; end;
procedure Game_Play; begin glColor3ub(255,255,255); // установить белый цвет sprite.Fill(0,0,800,600,game_field_img);
if direction <> none then Movesnake;
for x := 0 to snakelength-1 do begin // Draw(x, y, w, h: Integer; TexID: Cardinal); sprite.Draw(snakeX[x],snakeY[X],20,20,snake_part_img); end;
end;
procedure Begin_Game; begin draw2d.ANSORO_RENDERING_BEGIN; draw2d.ANSORO_BEGIN_2D;
case Game_Active_State of GAST_LOADING : Game_Loading ; GAST_GAME : Game_Play; GAST_RECORD : ; GAST_EXIT : engine.Quit; end;
draw2d.ANSORO_END_2D; draw2d.ANSORO_RENDERING_END; end;
procedure Update_Game; begin // Выбор направление движения змейки if Input.Keys[vk_down] then if direction <> sdown then direction := sup; if Input.Keys[vk_left] then if direction <> sright then direction := sleft; if Input.Keys[vk_up] then if direction <> sup then direction := sdown; if Input.Keys[vk_right] then if direction <> sleft then direction := sright; end;
function End_Game: Boolean; begin result := finished; end;
end.
|