Текущий архив: 2010.08.27;
Скачать: CL | DM;
ВнизАлгоритм змейки Найти похожие ветки
← →
Woriors (2007-08-23 12:11) [0]Срочно нужен алгоритм, исходник змейки. Где вожно скачать или почитать...
← →
@!!ex © (2007-08-23 12:39) [1]Алгоритм чего?
Как змейка движеться?
← →
homm © (2007-08-23 13:00) [2]> [1] @!!ex © (23.08.07 12:39)
Видимо это какой-то украинский программист. :)
← →
Pa5ha © (2007-08-23 17:01) [3]Я вчера э**л баран
сейчас пишу я на фортран :) (башорг)
Я делал свою змейку так: есть поле х на у размером. Каждая ячейка - байт. 0-3 - значит, что в ней находится сегмент змеи, причом циферь - направление движения этого сегмента, т.е. 0 - влево, 1- вниз, 2- вправо, 3- вверх. Все остальное - 4-255 - разные препятствия, бонусы и т.п. И ещё есть две переменные. В одной храница положение головы, во второй хвоста. В результате все это работает так: ищем ячейку в которой находица голова. Достаем оттуда значение и смотрим куда пойдет голова. Проверяем и переносим голову в то место. Смотрим где у нас хвост, смотрим куда он поползет. Чистим старую ячейку. Все.
← →
@!!ex © (2007-08-23 18:04) [4]> [3] Pa5ha © (23.08.07 17:01)
А зафига направление для клеток хранить?
Достаточно знать голову, длину и у части тела - направление на следующую.
ТОгда все считается элементарно.
Двигаем голову.
Туловище перемещаем на место головы, в качестве направления указываем направление на старую позицию, проходимся так до конца и все...
← →
Pa5ha © (2007-08-23 18:56) [5]@!!ex, для вышеописанного врянта надо ещё делать массив для частей тела змеи. А у меня змея длинной хоть со все поле может быть ип ри этом без использования лишней памяти. И для перемещения надо всего лишь два сегмента передвинуть, а не гулять по массиву туда сюда в поисках хвоста.
← →
@!!ex © (2007-08-23 19:22) [6]> [5] Pa5ha © (23.08.07 18:56)
Зачем массив? :) Только положение головы хранить надо. Голова указывает на 1 кусок, 1 кусок - на второй и т.д.
← →
Pa5ha © (2007-08-23 20:00) [7]ну тада получаеца все храница все равно на поле, как у меня ) Но у мя положение хвоста храница отдельно, чтоб не искать хвост по полю. Вот тада и все различие получаеца.
← →
Efir © (2007-08-23 20:01) [8]Тут кода-то с гулькин нос. Вот основной кусок:
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;
← →
antonn © (2007-08-23 21:39) [9]Конкурс № 011 - Python
http://code.darthman.com/downloads.php?cat_id=1&download_id=3 (1,7Мб)
← →
Woriors (2007-08-24 01:09) [10]Посмотрите вот сегодня писал.
У меня такой баг в игре.
Почему при старте игры длина змейки равно 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.
Страницы: 1 вся ветка
Текущий архив: 2010.08.27;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.06 c