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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.01.2012, 18:53   #31
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Ну, поле может быть.

Змейка похоже, только char вряд-ли подойдёт: нужно знать где в данный момент находится конкретный кусок змеи.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 01.01.2012, 19:04   #32
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

змейке скорее подойтет вектор точек(координат её)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.01.2012, 22:31   #33
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

для змейки подойдёт std::vector<COORD>
где COORD стандартная виндузовская структура для хранений координат.

поле я вообще делал без использования массива.
по сути тебе поле нужно только отрисовать 1 раз в начале, а потом ты всё равно перерисовывать его не будешь. ты будешь менять только определенные точки на поле.
в моём случае я задавал его парой ширина, высота:
HEIGHT,WIDTH...

этого вполне достаточно чтобы проверять валидность координат головы змейки...

в целом все довольно просто.
перемещение змейки:
все значения вектора принимаются значение i+1 -го элемента (ну идея ясна).
голову двигаем по направлению. хвост стираем из вектора.
проверить на каждом ходу не попали ли в стену или хвост... если попали в яблоко "вбросим" новое..
вообщем все довольно банально.
onewho вне форума Ответить с цитированием
Старый 02.01.2012, 01:02   #34
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

onewho, огромное спасибо Вам!
я понял как без перерисовки делать поле!
например поле это "." , питон состоит из "8", хвост питона в точке (x,y) вытерли и записали в эту точку "." ...

но почему змейка состоит только из vector <COORD> ??
как я понял питон это массив из класса примерно такого:
Код:
enum way{
        UP=0,
        DOWN=1,
        RIGHT=2,
        LEFT=3
};

class Piton{

        public:
        int x;
        int y;
        way way;
};
там же надо кроме координат указывать направление.. а направление будет храниться в way .

так ?
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 02.01.2012, 01:05   #35
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

направление важно при движении(как меняем все координаты), но сам питон не более чем кучка точек(координат, его составляющих)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.01.2012, 01:12   #36
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

по типу.. если нажата стрелочка вправо то (x+1;y+0) ??

что то не могу понять..
мне кажется питон должен хранить направление в себе, так как ему же надо в каком-то направление двигаться..
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 02.01.2012, 02:11   #37
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

нет разницы где хранить направление
onewho вне форума Ответить с цитированием
Старый 02.01.2012, 02:11   #38
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Не нужно питону хранить направление. Ему нужно знать где он находится. Направление будет задавать игрок, когда нажмёт стрелку.

Игрок нажал кнопку -> Змейка узнала куда ей ползти -> Проверила что туда ползи можно (если нельзя - игрок проиграл) -> в начало питона добавился новый блок (голова)->закрасили хвост -> удалили последний блок питона -> ждём новой команды.

можно не добавлять новую голову и удалять хвост, а менять все координаты( (x+1;y+0) )
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 02.01.2012, 08:42   #39
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Не нужно питону хранить направление.
ну как же не нужно?! Нужно!
Дело в том, что в момент изменения направления (нажата клавиша игроком) в той точке где была голова питона возникает переход (излом) и все остальные точки питона переходят через эту точку. При этом голова питона уже может двигаться в другую сторону.. и сколько будет изменений движения - столько будет точек излома в теле питона (тело будет "перетекать" через эти точки - ну, разумеется, пока длины тела будет хватать).
Как именно и где хранить эти точки перехода - не суть важно (зависит от реализации). Но их обязательно надо хранить.
сказанное позволю себе проиллюстрировать рисунком (я открыл первую попавшиюся игру "змейка" онлайн и сделал скриншот..) :
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.01.2012, 11:55   #40
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
Счастье

Хранить точки перелома? Зачем? Хотя если не хранить все координаты питона, а только изгибы, можно но будет больше хлопот,а выгода в памяти не существенна.
В векторе лежат все координаты "точек" питона. Важно хранить лишь последнее направление, чтобы его использовать, если игрок не нажимал кнопки.

Я бы это сделал так:
1) Ожидаем нажатие, если нажатия нет, используем сохраненное направление.
2) Проверяем исход хода(конец игры, движение, движение с удлинением) и Запоминаем направления.
2.1) Конец -> выход;
2.3) Запоминаем точку для удлинения.
3.1)Если сохраненная точка для удлинения == точки конца питона-> к 4.
3.2)Иначе -> Очистить на экране последнюю точку и Удаляем из вектора последний элемент.
4) Добавляем в начало вектора новые координаты.
5) Рисуем новую точку.
6) Повтор.

Для В таком случае надо хранить вектор с координатами, флаг направление и точку удлинения.
Код:
enum way{
        UP=0,
        DOWN=1,
        RIGHT=2,
        LEFT=3
};
class piton{
...
private:
vector<COORD> Pit;
way Way;
COORD eat;
};
Ну примерно так.

Ps. Runtime >40, так что мог где-то ошибится .
Ёж птица гордая, пока не пнешь не полетит.
Ezhuk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal движение змейки zhenka619 Помощь студентам 0 29.12.2011 22:45
Обработка нажатия клавиш в TButton mLight Помощь студентам 4 11.11.2011 20:53
Обработка клавиш на TListBox Melanholly Общие вопросы Delphi 2 31.10.2011 14:06
Обработка событий клавиш клавиатуры Synapse Visual C++ 2 20.10.2011 18:37
обработка нажатия клавиш VC++ консоль rest Помощь студентам 0 06.10.2009 07:53