Поиск:

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


Новичок



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

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



У меня родилась идея как сделать. Компилируется, работает, но само не двигается. вообще. только нажатием кнопки...


Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int x;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if(Key==VK_RIGHT)
{Shape1->Left++; x=1;}
if(Key==VK_LEFT)
{Shape1->Left--; x=2;}
if(Key==VK_UP)
{Shape1->Top--; x=3;}
if(Key==VK_DOWN)
{Shape1->Top++; x=4;}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (x=1) Shape1->Left++;
else return;
if (x=2) Shape1->Left--;
else return;
if (x=3) Shape1->Top++;
else return;
if (x=4) Shape1->Top--;
else return;

}

PM MAIL   Вверх
Anikmar
Дата 8.10.2009, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Lehon @  8.10.2009,  18:52 Найти цитируемый пост)
if (x=1) Shape1->Left++;
else return;
if (x=2) Shape1->Left--;
else return;
if (x=3) Shape1->Top++;
else return;
if (x=4) Shape1->Top--;
else return;

 Оххх. Еще бы вам немного синтаксис языка изучить....
В Cи операция сравнения на равенство кодируется как ==



PM MAIL ICQ   Вверх
Lehon
Дата 8.10.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо ) Заработало )
PM MAIL   Вверх
Lehon
Дата 11.10.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет! У меня опять вопрос )

Вот код. Проблема в последнем блоке. Вроде как синтаксическая ошибка, хотя не понимаю почему, вроде как взял инфу из книги...
Ошибки выделил жирным.
Что я пытался сделать? Создать случайное число от 0  до 9 (к сож не знаю как сделать от 1 до 9 (ну это только для сотен) - если кто знает тоже подскажите плз), и к нему прибавить 0, ну, т.е. из допустим 3х сделать 30, т.к. мне нужны десятки и сотни. Но! Есть еще момент который я не реализовал - десятки мне нужны через 20. т.е. 00, 20, 40, 60, 80. 
Все это должно перемещать яблоко по случайным координатам. И еще момент - у меня яблоко перемещается каждые n секунд и быстро скрывается из виду. Да, это из за того что я все вписал в таймер, но нигде больше перемещение не работает. Может как то можно создать отдельное событие о пересечении координат головы змеи и яблока?


Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <stdlib.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int x;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if(Key==VK_RIGHT)//Çàäàåì óïðàâëåíèå êëàâèøàìè íàïðàâëåíèåì äâèæåíèÿ
{x=1;}
if(Key==VK_LEFT)
{x=2;}
if(Key==VK_UP)
{x=3;}
if(Key==VK_DOWN)
{x=4;}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (x==1) Shape1->Left=Shape1->Left+20; //Êàæäûå n ñåêóíä øåéï ñäâèãàåòñÿ íà 20 ïèêñåëåé.
else 0;
if (x==2) Shape1->Left=Shape1->Left-20;
else 0;
if (x==3) Shape1->Top=Shape1->Top-20;
else 0;
if (x==4) Shape1->Top=Shape1->Top+20;
else 0;
Label3->Caption=Shape1->Left; //Ïîêàçûâàåì êîîðäèíàòû øåéïà ïîëüçîâàòåëþ â ëåéáëàõ.
Label4->Caption=Shape1->Top;
Label9->Caption=Shape2->Left;
Label10->Caption=Shape2->Top;

int u=Shape1->Left;
int i=Shape2->Left;
int l=Shape1->Top;
int d=Shape2->Top;

int o;
int s;
int e;

int a;
int c;
int r;
int r1;
int r2;
int f;

r=rand ()%9;
r1=rand ()%9;
c=rand ()%9;
r2=r1+"0"+; // çíà÷åíèÿ îò 0 äî 90
a=r+r2+"00"+; // çíà÷åíèÿ îò 000 äî 900 + r2
f=c+r2+"00"+;


Label11->Caption=r;

if (u==i, l==d) {Shape2->Top=Shape2->Top+a; Shape2->Left=Shape2->Left+f;}
}
//---------------------------------------------------------------------------



[C++ Error] Unit1.cpp(74): E2188 Expression syntax
[C++ Error] Unit1.cpp(75): E2188 Expression syntax
[C++ Error] Unit1.cpp(76): E2188 Expression syntax
Дальше варнинги о обьявленых но неиспользованных переменных.

Это сообщение отредактировал(а) Lehon - 11.10.2009, 11:23
PM MAIL   Вверх
Usper
Дата 11.10.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А что вы пытаетесь сделать в этих строках? Фактически получается прибавление строки к числу. А это недопутимо. Да ещё и знак "+" зачем-то перед ";" стоит. Нужно справа добавить нулей к числу? Можно просто умножить число на 10^n, где n - необходимое число нулей.


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Lehon
Дата 11.10.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Умножить на 10? Не подумал даже... действительно простейший выход )
Да, я хотел к числу которое выдал рандом добавить нули.
А ошибка как я понял в том что я не написал StrToFloat.
Попробую умножением... А что насчет других вопросов?
PM MAIL   Вверх
Lehon
Дата 11.10.2009, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Получилось, но с ошибочкой. Все вроде как верно, но! Посмотрите на код:

if (u==i, l==d) {Shape2->Top=a; Shape2->Left=f;};

Когда по Топ перемещаемся, все норм работает, но когда пересекаем Лефт, на котором лежит яблоко, оно перемещается - хотя я до него еще и не доехал.
Т.е. Если я иду к яблоку по Топ, то оно перемещается когда совпадают обе координаты, а когда по Лефт, то сразу. И вот я не пойму в чем дело... Может где ошибка, или я не так указал? Нужно ведь что бы if выполнялся когда совпадают ОБА условия.
PM MAIL   Вверх
Anikmar
Дата 11.10.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Может надо
if ((u==i)&& (l==d)) 
PM MAIL ICQ   Вверх
Lehon
Дата 11.10.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо! Начало работать. И у меня еще вопросы назрели )))

Вот я создаю новый шейп, такой же как и голова змеи, прямо рядом с ней. Все хорошо, но! С какой бы я стороны не зашел, голова змеи при сьедании яблока меняет свое направление на "вниз", и новый сегмент змеи образуется так же только с одной стороны.  И конечно же главный вопрос - как сделать так что бы сегменты перемещались за головой, новый возникали за последними сегментами, и повторяли движение головы по очереди?




Код


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <stdlib.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int x;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if(Key==VK_RIGHT)//Çàäàåì óïðàâëåíèå êëàâèøàìè íàïðàâëåíèåì äâèæåíèÿ
{x=1;}
if(Key==VK_LEFT)
{x=2;}
if(Key==VK_UP)
{x=3;}
if(Key==VK_DOWN)
{x=4;}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (x==1) Shape1->Left=Shape1->Left+20; //Êàæäûå n ñåêóíä øåéï ñäâèãàåòñÿ íà 20 ïèêñåëåé.
else 0;
if (x==2) Shape1->Left=Shape1->Left-20;
else 0;
if (x==3) Shape1->Top=Shape1->Top-20;
else 0;
if (x==4) Shape1->Top=Shape1->Top+20;
else 0;
Label3->Caption=Shape1->Left; //Ïîêàçûâàåì êîîðäèíàòû øåéïà ïîëüçîâàòåëþ â ëåéáëàõ.
Label4->Caption=Shape1->Top;
Label9->Caption=Shape2->Left;
Label10->Caption=Shape2->Top;

int u=Shape1->Left;
int i=Shape2->Left;
int l=Shape1->Top;
int d=Shape2->Top;

int o;
int s;
int e;

int a;
int c;
int r;
int r2;

int f;
int t1;

r=rand ()%9;

t1=rand ()%4;

if (t1=0) r2=00;
if (t1=1) r2=20;
if (t1=2) r2=40;
if (t1=3) r2=60;
if (t1=4) r2=80;

c=rand ()%8;
a=r*100+r2; // çíà÷åíèÿ îò 000 äî 900 + r2
f=c*100+r2;

Label11->Caption=f;

if ((u==i)&& (l==d))  {
Shape2->Top=a; Shape2->Left=f; // Çàäàåì íîâûå êîîðäèíàòû ÿáëîêà.

TShape *shp;  // Ñîçäàåì íîâûé øåéï ê ãîëîâå çìåè.
  for (int m = 0; m < 1; m ++)
       {
          shp = new TShape (this);
          shp->Parent = Panel1;
          shp->Width = 20;
          shp->Height = 20;
          shp->Shape=stRoundRect;
          shp->Brush->Color=clMoneyGreen;


         if (x=1) shp->Top=Shape1->Top+20;  // óêàçûâàåì êîîðäèíàòû íîâîãî øåéïà.
         if (x=2) shp->Top=Shape1->Top-20;
         if (x=3) shp->Left=Shape1->Left+20;
         if (x=4) shp->Left=Shape1->Left-20;





       }

};

if (Shape1->Left<=0) Shape1->Left=980; // Змея при столкновении с левым краем, перемещается в правый.


}
//---------------------------------------------------------------------------



Билдер выдает на этот код много варнингов такого вида: 
[C++ Warning] Unit1.cpp(94): W8060 Possibly incorrect assignment
Хотя, к счастью, ни одного еррора.
PM MAIL   Вверх
xvr
Дата 12.10.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Правильно выдает - у тебя опять куча присваиваний в if'ах, вместо сравнений  smile 

PM MAIL   Вверх
Lehon
Дата 12.10.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хы, ну да ) Исправил, теперь голова продолжает движение в заданном направлении при сьедании яблока. Но новые сегменты змеи стелятся по верхнему и левому краю ) И опять же, неясно что делать что бы образовывалась змейка а не набор разбросаных шейпов )
PM MAIL   Вверх
xvr
Дата 12.10.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Для 'змейки' у тебя неправильная логика всей программы. Тело змейки состоит из НАБОРА шейпов, которые надо хранить (например в std::deque). На каждом шаге перемещения создается новая голова змеи на основе координат старой головы (при этом надо вычислять И top И left координаты, а не одну из них). Новая голова добавляется в очередь (deque::push_front). Далее удаляется элемент из хвоста (deque::pop_back). Если змея съедает яблоко, то удаление хвоста блокируется на заданное количество 'тиков' таймера (змея при этом будет расти)
Одна оптимизация - если на данном шаге элемент хвоста должен удаляться, то его можно использовать как новую голову, что бы не удалять/создавать TShape.
 
PM MAIL   Вверх
Lehon
Дата 13.10.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Буду думать... А как создать событие которое происходит через n милисекунд (Речь о вышеописанном "блокируется на заданное количество тиков таймера").
PM MAIL   Вверх
xvr
Дата 13.10.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Lehon @ 13.10.2009,  16:04)
А как создать событие которое происходит через n милисекунд (Речь о вышеописанном "блокируется на заданное количество тиков таймера").

'Тики таймера' имеются в виду вызовы TForm1::Timer1Timer() (по 1 вызову на 1 тик)

PM MAIL   Вверх
Lehon
Дата 13.10.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не, это у меня уже есть, там описано почти все движения головы и яблока. Мне надо узнать как сделать грубо говоря
          shp->Top=Shape1->Top через 100 милисекунд;
          shp->Left=Shape1->Left через 100 милисекунд;

С очередью и хранением не разберусь никак. Есть мысль просто хранить шейпы вне поля видимости, а потом вызывать. Но, много кода получается - описывать придется каждый шейп, и не дай бог юзер сможет сьесть 100 яблок, когда я максимум предусмотрел 98...
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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