Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Пожалуйста помогите с едой для змеи - на Delphi.


Автор: spamER 22.12.2008, 23:53
Создаю змею из компонентов TShape. Тело змеи хранится в списке, изначально в списке 3 Shape'a.
Как сделать, что бы при съедании еды, змея увеличивалась(то есть добавлялся к телу змеи еще один Shape) и уже двигалось не 3 (как изначально), а уже 4 Shape'a , ну и тд.


Вот то что я уже написал:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Panel1: TPanel;
    Image1: TImage;
    MainMenu1: TMainMenu;
    Main: TMenuItem;
    NewGames: TMenuItem;
    N1: TMenuItem;
    Exit: TMenuItem;
    Cpravka: TMenuItem;
    About_program: TMenuItem;
    procedure Timer1Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    List:TList;

    procedure CreateListOfShape;
    procedure Vpravo;
    procedure VLevo;
    procedure VVerx;
    procedure Vniz;
  end;
const
  shag = 10;

var
  Form1: TForm1;
  var
  napravlenie: string[1];
  a,b,n,max:integer;
implementation

{$R *.dfm}

//Процедура для начального      создания тела змеии, создаю вчерез список (изначально 3 Shape'a)

procedure TForm1.CreateListOfShape();     
var
   i: Integer;
   TopItem: Integer;
   Item:TShape;
begin
  TopItem:=10;
  List:= TList.Create;
  for i:=0 to 3 do
  begin
    Item:=TShape.Create(self);
    Item.Width:=10;
    Item.Height:=10;
    Item.Top:=TopItem;
    TopItem:=TopItem+Item.Height;
    Item.Parent:=Form1.Panel1;
    List.Add(Item);
  end;

//Переменные для правильного поворота змеии при движении
a := 0;
max := 3;
b := max - 1;
n := max - 1;
end;


//Процедура для поворота вправо
procedure TForm1.VPravo();        
var
  Item:TShape;
  Item1:TShape;
begin
Item:= Form1.List[a];
Item1:= Form1.List[b];
Item.Top:=Item1.top;
Item.Left:=Item1.Left+shag;
  b := a;
  a := a + 1;
  if a > n  then a := 0;
end;

//Процедура для поворота влево
procedure TForm1.VLevo();        
var
  Item:TShape;
  Item1:TShape;
begin
Item:= Form1.List[a];
Item1:= Form1.List[b];
Item.Top:=Item1.top;
Item.Left:=Item1.Left-shag;
  b := a;
  a := a + 1;
  if a > n  then a := 0;
end;

//Процедура для поворота вверх
procedure TForm1.VVerx();         
var
  Item:TShape;
  Item1:TShape;
begin
Item:= Form1.List[a];
Item1:= Form1.List[b];
Item.Top:=Item1.top-shag;
Item.Left:=Item1.Left;
  b := a;
  a := a + 1;
  if a > n  then a := 0;
end;

//Процедура для поворота вниз
procedure TForm1.Vniz();            
var
  Item:TShape;
  Item1:TShape;
begin
Item:= Form1.List[a];
Item1:= Form1.List[b];
Item.Top:=Item1.top+shag;
Item.Left:=Item1.Left;
  b := a;
  a := a + 1;
  if a > n  then a := 0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Item:TShape;
begin
  if napravlenie = 'R' then Vpravo;
  if napravlenie = 'L' then VLevo;
  if napravlenie = 'D' then Vniz;
  if napravlenie = 'U' then VVerx;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
    vk_RIGHT: napravlenie:='R';
    VK_LEFT:  napravlenie:='L';
    vk_DOWN:  napravlenie:='D';
    VK_UP:    napravlenie:='U';
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);

begin
CreateListOfShape;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  List.Free;
end;

end.



Помогите пожалуйста.

Автор: AntonN 23.12.2008, 00:36
ну и создавай еще один Shape, как в коде
Код

Item:=TShape.Create(self);
    Item.Width:=10;
    Item.Height:=10;
    Item.Top:=TopItem;
    TopItem:=TopItem+Item.Height;
    Item.Parent:=Form1.Panel1;
    List.Add(Item);


PS там item.free не лишний?

Автор: spamER 23.12.2008, 09:41
AntonN просто не в том дело. Я пробовал был так создавать, но проблема у меня в следующем,
 
Новый Shape то появляется, но он не движется вместе с стальными. Так вот, как сделать что бы они уже все вместе двигались???



P.S. Один Item.free и действительно был лишним.

Автор: CodeMonkey 23.12.2008, 12:33
На главной напротив названия раздела форума показывается последняя тема, читаю:

Код
Разделы:                           Обновления:
Delphi: Для новичков        23.12.2008, 09:41
                                          Тема: Пожалуйста помогите с едой ...
                                          Автор: spamER


Первая мысль: кризис...

Автор: AntonN 23.12.2008, 12:57
spamER, узнавай кол-во элементов динамически, ты в n пишешь максимальное кол-во элементов (при старте), а вместо n используй list.count

Автор: spamER 23.12.2008, 13:13
Слы а когда я пишу вместо n ,  list.count , то у меня змея начинает увеличиваться без остановки.

Можеш пример привести?

Автор: AntonN 23.12.2008, 13:43
list.count-1

Автор: spamER 23.12.2008, 17:23
AntonN спс заработало.

Слы, AntonN, может подскажешь еще, как сделать что бы еда появлялась в произвольном месте и змея поедала еду??? Подскажи плз.

Автор: NewDima 23.12.2008, 19:25
ты сам будешь думать? Змею тебе фактически написали, тут помогли, еще жратву для нее писать. Может сам попробуешь, тут ничего сложного

Автор: spamER 23.12.2008, 22:31
Оки. 
Токо вот хотябы б сам алгоритм поедания змеей еды. Я не пойму как проверить что змея схавала еду???

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)