Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.047 c
15-1272517480
Анна
2010-04-29 09:04
2010.08.27
Запрос, MSSQL2000


15-1270102589
AlexDan
2010-04-01 10:16
2010.08.27
Думаю поспамить


2-1275731880
REX
2010-06-05 13:58
2010.08.27
Дата/Время


15-1270645124
Andrey O.
2010-04-07 16:58
2010.08.27
Небольшая рекламация для пользователей Firefox


15-1265957349
@!!ex
2010-02-12 09:49
2010.08.27
Хоть что нибудь из OpenSource будет работать из коробки??