Главная страница
    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.5 MB
Время: 0.06 c
4-1233425475
Unknown user
2009-01-31 21:11
2010.08.27
Измерение времени выполнения внутри потока


2-1275245281
Semen
2010-05-30 22:48
2010.08.27
Поиск и открытие файлов


2-1273183195
Light-blr
2010-05-07 01:59
2010.08.27
Переход стрелочками между окошками


2-1269712810
ZeTToG350
2010-03-27 21:00
2010.08.27
Проблемма с окнами


15-1271933235
Den
2010-04-22 14:47
2010.08.27
Процессы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский