Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2014, 16:36   #1
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию Создание змейки.

Доброго времени суток, уважаемые эксперты. Я решил сделать игру змейка не пользуясь чужими алгоритмами и зашел в тупик. Я сделал каждый елемент змейки независимым и сам считал его координаты для прорисовки и смотрел его поворот куда идти. И змейка у меня движется нормально только в том случае, когда все ее елементы успели повернуть. Если хоть один елемент не успел повернуть, а наша змейка повернула еще раз - то этот елемент отрывается от нее. Как реализовать правильное передвижение каждого елемента змейки для моего случая? Подскажите кто что может, пожалуйста. Заранее спасибо всем!

Прилагаю исходный код и сам проект:
Код:
type

  TTelo=record
  Povorot,X,Y:integer;
  Visible:boolean;
  end;

  TZmeyka=record
  Dlina,OldPovorot:integer;
  Telo:array[1..8] of TTelo;
  end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i,j,n,x,y:integer;
uzhe:boolean;
begin

  for i:=0 to 21 do
  for j:=0 to 21 do
  Buf.Canvas.Draw(i*16,j*16,Img[ map[i,j] ]);

     uzhe:=false;
  for i:=1 to 8 do
  begin
    if Zmey.Telo[i].Visible=true then
    begin
    //risovanie
    Buf.Canvas.Draw(Zmey.Telo[i].X*16,Zmey.Telo[i].Y*16,Img[3]);

      //poedanie i next level
      if (map[Zmey.Telo[i].X,Zmey.Telo[i].Y]=1) and (Zmey.Dlina=8) then
      begin
         for n:=0 to 21 do
        for j:=0 to 21 do
        map[n,j]:=0;

        //barduri
        for n:=0 to 21 do
        begin
        map[n,0]:=2;
        map[n,21]:=2;
        map[0,n]:=2;
        map[21,n]:=2;
        end;

        for n:=1 to 8 do
        begin
        Zmey.Telo[n].Povorot:=1;
        Zmey.Telo[n].X:=10;
        Zmey.Telo[n].Y:=10;
        Zmey.Telo[n].Visible:=false;
        end;
        Zmey.Telo[1].Visible:=true;
        Zmey.Dlina:=1;

        x:=random(20)+1;
        y:=random(20)+1;
        map[x,y]:=1;
        Povernut:=false;
        timer1.Interval:=timer1.Interval-25;
      end;

      //poedanie
      if (map[Zmey.Telo[i].X,Zmey.Telo[i].Y]=1) and (Zmey.Dlina<8) then
      begin
      inc(Zmey.Dlina);
       Zmey.Telo[Zmey.Dlina].Visible:=true;
         case Zmey.Telo[Zmey.Dlina-1].Povorot of
         1:begin
           Zmey.Telo[Zmey.Dlina].Y:=Zmey.Telo[Zmey.Dlina-1].Y-1;
           Zmey.Telo[Zmey.Dlina].X:=Zmey.Telo[Zmey.Dlina-1].X;
           Zmey.Telo[Zmey.Dlina].Povorot:=Zmey.Telo[Zmey.Dlina-1].Povorot;
           end;
         2:begin
           Zmey.Telo[Zmey.Dlina].Y:=Zmey.Telo[Zmey.Dlina-1].Y+1;
           Zmey.Telo[Zmey.Dlina].X:=Zmey.Telo[Zmey.Dlina-1].X;
           Zmey.Telo[Zmey.Dlina].Povorot:=Zmey.Telo[Zmey.Dlina-1].Povorot;
           end;
         3:begin
           Zmey.Telo[Zmey.Dlina].Y:=Zmey.Telo[Zmey.Dlina-1].Y;
           Zmey.Telo[Zmey.Dlina].X:=Zmey.Telo[Zmey.Dlina-1].X+1;
           Zmey.Telo[Zmey.Dlina].Povorot:=Zmey.Telo[Zmey.Dlina-1].Povorot;
           end;
         4:begin
           Zmey.Telo[Zmey.Dlina].Y:=Zmey.Telo[Zmey.Dlina-1].Y;
           Zmey.Telo[Zmey.Dlina].X:=Zmey.Telo[Zmey.Dlina-1].X-1;
           Zmey.Telo[Zmey.Dlina].Povorot:=Zmey.Telo[Zmey.Dlina-1].Povorot;
           end;
         end;
         map[Zmey.Telo[i].X,Zmey.Telo[i].Y]:=0;
         x:=random(20)+1;
         y:=random(20)+1;
         map[x,y]:=1;
      end;
    //dvizhenie
    if Zmey.Telo[i].Povorot=1 then inc(Zmey.Telo[i].Y);
    if Zmey.Telo[i].Povorot=2 then dec(Zmey.Telo[i].Y);
    if Zmey.Telo[i].Povorot=3 then dec(Zmey.Telo[i].X);
    if Zmey.Telo[i].Povorot=4 then inc(Zmey.Telo[i].X);
      //postepenniy povorot dlya golovi i shei
      if (Zmey.Dlina>1) and (Povernut=false) then
      begin
          if (Zmey.Telo[2].Povorot<>Zmey.Telo[1].Povorot) and (uzhe=false) then
          begin
          Zmey.Telo[2].Povorot:=Zmey.Telo[1].Povorot;
          uzhe:=true;
          end;
      end;

      //postepennit povorot dlya ostalnogo tela
      if (Zmey.Dlina>2)  then
      begin

        for n:=3 to Zmey.Dlina do
        begin
        //if Zmey.Telo[n].Povorot<>
          if ((Zmey.Telo[n].Povorot<>Zmey.Telo[n-1].Povorot) and (uzhe=false))
          //or ((Zmey.Telo[n].Povorot<>Zmey.Telo[n-1].Povorot) and (Povernut=true) and (uzhe=))
          then
          begin
          Zmey.Telo[n].Povorot:=Zmey.Telo[n-1].Povorot;
          uzhe:=true;
          end;
          {
          if ((Zmey.Telo[n].Povorot<>Zmey.Oldpovorot) and (uzhe=false)) then
          begin
          Zmey.Telo[n].Povorot:=Zmey.OldPovorot;
          uzhe:=true;
          end;
          }
        end;
      end;
    end;
  end;

  if Povernut=true then Povernut:=false;
  form1.Canvas.Draw(0,0,Buf);

end;

end.
Вложения
Тип файла: rar Змейка.rar (163.8 Кб, 9 просмотров)

Последний раз редактировалось Stilet; 02.07.2014 в 16:46.
Armageddets вне форума Ответить с цитированием
Старый 02.07.2014, 21:10   #2
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию

Все уже не нужно. Я разобрался. Нужно просто все элементы ставить на место предыдущей. И не нужно вообще считать повороты, и координаты для всех элементов. Достаточно отслеживать голову.
Armageddets вне форума Ответить с цитированием
Старый 03.07.2014, 00:29   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Я бы много чего ещё мог сказать относительно данного кода, да и мысли насчёт алгоритмизации змейки тоже.
phomm вне форума Ответить с цитированием
Старый 03.07.2014, 00:35   #4
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

А я бы сделал на основе массива координат (Array of TPoint). Голова сдвинулась, массив пересчитался влево (последняя координата приняла значение предпоследней, и т.д.), змейка выросла, добавилась координата (массив двигается уже вправо). В таймере чисто отрисовка по массиву координат.

Последний раз редактировалось doktor255; 03.07.2014 в 00:42.
doktor255 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хвост змейки monchess Общие вопросы C/C++ 0 23.12.2013 01:32
Создание 3D змейки игры... VintProg Фриланс 3 01.11.2011 00:36
улучшение текстовой змейки q123Gunner Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 07.07.2011 04:22
исходник змейки fis Gamedev - cоздание игр: Unity, OpenGL, DirectX 21 31.03.2010 22:19