Конференция "Игры" » Алгоритм змейки [Delphi, Windows]
 
  • Woriors (23.08.07 12:11) [0]
    Срочно нужен алгоритм, исходник змейки. Где вожно скачать или почитать...
  • @!!ex © (23.08.07 12:39) [1]
    Алгоритм чего?
    Как змейка движеться?
  • homm © (23.08.07 13:00) [2]
    > [1] @!!ex ©   (23.08.07 12:39)

    Видимо это какой-то украинский программист. :)
  • Pa5ha © (23.08.07 17:01) [3]
    Я вчера э**л баран
    сейчас пишу я на фортран :) (башорг)

    Я делал свою змейку так: есть поле х на у размером. Каждая ячейка - байт. 0-3 - значит, что в ней находится сегмент змеи, причом циферь - направление движения этого сегмента, т.е. 0 - влево, 1- вниз, 2- вправо, 3- вверх. Все остальное - 4-255 - разные препятствия, бонусы и т.п. И ещё есть две переменные. В одной храница положение головы, во второй хвоста. В результате все это работает так: ищем ячейку в которой находица голова. Достаем оттуда значение и смотрим куда пойдет голова. Проверяем и переносим голову в то место. Смотрим где у нас хвост, смотрим куда он поползет. Чистим старую ячейку. Все.
  • @!!ex © (23.08.07 18:04) [4]
    > [3] Pa5ha ©   (23.08.07 17:01)

    А зафига направление для клеток хранить?
    Достаточно знать голову, длину и у части тела - направление на следующую.
    ТОгда все считается элементарно.
    Двигаем голову.
    Туловище перемещаем на место головы, в качестве направления указываем направление на старую позицию, проходимся так до конца и все...
  • Pa5ha © (23.08.07 18:56) [5]
    @!!ex, для вышеописанного врянта надо ещё делать массив для частей тела змеи. А у меня змея длинной хоть со все поле может быть ип ри этом без использования лишней памяти. И для перемещения надо всего лишь два сегмента передвинуть, а не гулять по массиву туда сюда в поисках хвоста.
  • @!!ex © (23.08.07 19:22) [6]
    > [5] Pa5ha ©   (23.08.07 18:56)

    Зачем массив? :) Только положение головы хранить надо. Голова указывает на 1 кусок, 1 кусок - на второй и т.д.
  • Pa5ha © (23.08.07 20:00) [7]
    ну тада получаеца все храница все равно на поле, как у меня ) Но у мя положение хвоста храница отдельно, чтоб не искать хвост по полю. Вот тада и все различие получаеца.
  • Efir © (23.08.07 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 © (23.08.07 21:39) [9]
    Конкурс № 011 - Python
    http://code.darthman.com/downloads.php?cat_id=1&download_id=3 (1,7Мб)
  • Woriors (24.08.07 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.
 
Конференция "Игры" » Алгоритм змейки [Delphi, Windows]
Есть новые Нет новых   [134464   +62][b:0][p:0]