Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите доделать игру "Змейка" 
V
    Опции темы
spamER
Дата 26.12.2008, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 14.11.2008

Репутация: нет
Всего: 1



Создаю змею из компонентов TShape. Тело змеи хранится в списке, изначально 3 Shape'a.Движение реализовано.Ну вообщем почти все готово, токо вот........

Вопрос:
Подскажите, как сделать, чтобы появлялась еда и змея поедала еду (едой также будет служить компонент TShape, который будет появляться в любом месте игрового поля) ???

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

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    MainMenu1: TMainMenu;
    Main: TMenuItem;
    NewGames: TMenuItem;
    N1: TMenuItem;
    Exit: TMenuItem;
    Cpravka: TMenuItem;
    About_program: TMenuItem;
    Image1: TImage;
    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 AddOfShape;
    procedure Eda;
    procedure Vpravo;
    procedure VLevo;
    procedure VVerx;
    procedure Vniz;
  end;
const
  shag = 10;

var
  Form1: TForm1;
  var
  napravlenie: string[1];
  a,b:integer;
  ItemEda:TShape;
implementation

{$R *.dfm}
procedure TForm1.CreateListOfShape();
var
   i: Integer;
   TopItem: Integer;
   Item:TShape;
begin
  TopItem:=150;
  List:= TList.Create;
  for i:=0 to 2 do
  begin
    Item:=TShape.Create(self);
    Item.Width:=10;
    Item.Height:=10;
    Item.Top:=TopItem;
    Item.Left:=150;
    TopItem:=TopItem+Item.Height;
    Item.Parent:=Form1;
    List.Add(Item);
  end;
a := 0;
b := List.Count - 1;
end;


procedure TForm1.AddOfShape();
var
 Item:TShape;
 TopItem: Integer;
begin
    Item:=TShape.Create(self);
    Item.Width:=10;
    Item.Height:=10;
    Item.Parent:=Form1;
    List.Add(Item);
    ItemEda.Destroy;
    Eda;
end;

procedure TForm1.Eda();
begin
    ItemEda:=TShape.Create(self);
    ItemEda.Width:=10;
    ItemEda.Height:=10;
    ItemEda.Top:=random(Image1.Height);
    ItemEda.Left:=random(Image1.Width);
    ItemEda.Parent:=Form1;
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 > (List.Count-1)  then a := 0;
  
if (Item.Left = ItemEda.Left) and (Item.Top = ItemEda.Top) then AddOfShape;
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 > (List.Count-1)  then a := 0;

if (Item.Left = ItemEda.Left) and (Item.Top = ItemEda.Top) then AddOfShape;
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 > (List.Count-1)  then a := 0;

if (Item.Left = ItemEda.Left) and (Item.Top = ItemEda.Top) then AddOfShape;
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 > (List.Count-1)  then a := 0;

if (Item.Left = ItemEda.Left) and (Item.Top = ItemEda.Top) then AddOfShape;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
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);
var
  i,j:Integer;
begin
  Image1.Canvas.Brush.Color:=clred;
  for i:=0 to 33 do
  for j:=0 to 38 do
    Image1.Canvas.Rectangle((i+1)*10,(j+1)*10,i*10,j*10);
CreateListOfShape;
Eda;
end;

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

end.



Пожалуйста помогите  smile , а то я вот написал был, а оно не работает. smile 

Вот прикрепил файл-исходник.

Это сообщение отредактировал(а) spamER - 24.1.2009, 14:10
PM MAIL   Вверх
Данкинг
Дата 26.12.2008, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Вот я, глядя на вас, написал: оно работает. Хотя, конечно, это мой субъективный взгляд на "змейку". smile 
Сисадмин посмотрел и сказал нечто вроде "зачем держать в штате программистов, если они всякую <цензура> пишут". smile  smile  smile 

Это сообщение отредактировал(а) Данкинг - 26.12.2008, 23:46

Присоединённый файл ( Кол-во скачиваний: 28 )
Присоединённый файл  ZMEUKA.rar 11,20 Kb


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
spamER
Дата 26.12.2008, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 14.11.2008

Репутация: нет
Всего: 1



Очень оригинально...............................А тот исходник шо вы прикрепили вообще лажа


Это сообщение отредактировал(а) spamER - 26.12.2008, 23:58
PM MAIL   Вверх
Данкинг
Дата 27.12.2008, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Цитата(spamER @  26.12.2008,  23:58 Найти цитируемый пост)
А тот исходник шо вы прикрепили вообще лажа

В каком смысле "лажа"?? smile 

Это сообщение отредактировал(а) Данкинг - 27.12.2008, 00:05


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
spamER
Дата 27.12.2008, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 14.11.2008

Репутация: нет
Всего: 1



Да просто я не правильно сказал.
В этом исходнике реализация идет через массив, а мене надо через список. Да и чет я в нем не могу разобраться - запутанный он какой то.

Мене если бы с мои помогли.
PM MAIL   Вверх
Данкинг
Дата 27.12.2008, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Цитата(spamER @  26.12.2008,  22:53 Найти цитируемый пост)
Подскажите, как сделать, чтобы появлялась еда и змея поедала еду

У меня это процедура set_korm. Еду ставишь рандомно и проверяешь: если голова попала на ту клетку, где находится еда, то, соответственно, еда съедена. Да вроде у тебя это и реализовано.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
spamER
Дата 27.12.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 14.11.2008

Репутация: нет
Всего: 1



Ну вообще то змея у меня ест ........... только вот один раз она может съесть еду. Потому что потом , при следующем появлении еды, она(еда) появляется со смещением в пару пикселей, и вот из за этого при проверке совпадают ли координаты еды и змеии, змея не может съесть еду, так как координаты еды и начала змеии не совпадают. 

Если не тяжело скачай исходник, и там оно видно, что координаты еды и начала змеии не совпадают. Если можешь , помоги, пожалуйста.
PM MAIL   Вверх
Данкинг
Дата 27.12.2008, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Цитата(spamER @  27.12.2008,  00:37 Найти цитируемый пост)
Если не тяжело скачай исходник, и там оно видно, что координаты еды и начала змеии не совпадают. 

В общем-то, твой исходник мне не более понятен, чем тебе мой. smile Но что мешает помещать еду на те же координаты, по которым и сама змея движется?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
spamER
Дата 27.12.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 14.11.2008

Репутация: нет
Всего: 1



Да вот я тоже не знаю как сделать чтобы еда появлялась в тех координатах, в которых и змея???

Может кто то подскажет???
PM MAIL   Вверх
Rpahut
Дата 27.12.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



Попробуй поменять 
Код

    ItemEda.Top:=random(Image1.Height);
    ItemEda.Left:=random(Image1.Width);

на
Код

    ItemEda.Top:=random(33+1)*10;
    ItemEda.Left:=random(38+1)*10;

Предполагается что поле размером 33х38 и клетка размером 10х10...

ЗЫ
Цитата(Данкинг)

Хотя, конечно, это мой субъективный взгляд на "змейку".

Этот код будет снится мне в кошмарах Т_Т
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
spamER
Дата 27.12.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 14.11.2008

Репутация: нет
Всего: 1



Rpahut большое спасибо.
PM MAIL   Вверх
Данкинг
Дата 27.12.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Цитата(Rpahut @  27.12.2008,  21:56 Найти цитируемый пост)
Этот код будет снится мне в кошмарах

Змейка ползёт? Ползёт. Жрёт? Жрёт. Что ещё надо от оной? smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Rpahut
Дата 27.12.2008, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



Данкинг, сам такое иногда пишу... smile Но чтоб людям показывать...
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Mazzi
Дата 8.1.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 4
Всего: 21



Цитата(spamER @ 27.12.2008,  10:08)
Да вот я тоже не знаю как сделать чтобы еда появлялась в тех координатах, в которых и змея???

Может кто то подскажет???

1) Мне кажется еда должна появляться в местах свободных от тела змеи.

2) Поясни почему тебе нужна реализация с помощью списка? Могу предложить более простую реализацию.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
spamER
Дата 9.1.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 14.11.2008

Репутация: нет
Всего: 1



Mazzi  я уже с едой разобрался.

На счет списка, просто захотелось через  списки, да и они хранят данные любых типов + легкость работы с ними (вроде).

P.S. Если не тяжело, помоги с этим http://forum.vingrad.ru/forum/topic-242618.html

Это сообщение отредактировал(а) spamER - 9.1.2009, 23:44
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0687 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.