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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Змея-следующий ход. Второй год делаю. 
:(
    Опции темы
Voker57
Дата 23.6.2003, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть такая игра - змея. Она ещё бывает на тетрисах и сотовых. Там змейка ползает и ест яблоки. Съест-увеличивается. Так может кто знает как сделать так чтобы если не нажата НИ ОДНА кнопка змея двигалась в текущем направлении? VC 6.0 ++


--------------------
Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности
Судить об этом не имею никакой возможности.
При следующем свидании вы сами выйдете из тупика.
Ну, до свидания, пока. :-)
Д.И. Хармс
Самый радиоактивно загрязненный сайт 2004
PM MAIL WWW ICQ YIM   Вверх
DENNN
Дата 23.6.2003, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



Ну ты же знаешь направление змеи? Вот и прибавь одну клетку в этом направлении, в чем проблема? smile.gif
PM ICQ   Вверх
Voker57
Дата 23.6.2003, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так у меня непонятно где ставить... ну в общем может тебе на мыло кинуть а то это длинная история


--------------------
Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности
Судить об этом не имею никакой возможности.
При следующем свидании вы сами выйдете из тупика.
Ну, до свидания, пока. :-)
Д.И. Хармс
Самый радиоактивно загрязненный сайт 2004
PM MAIL WWW ICQ YIM   Вверх
DENNN
Дата 23.6.2003, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



Если кода неочень много то кидай, если строк много то быстро не обещаю-работы постоянно много.
PM ICQ   Вверх
MuToGeN
Дата 23.6.2003, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

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



У меня это решалось с помощью трехмерного массива - для каждого пикселя (блока) направление движения змеи (0, если ее там нет). Такой подход так же решает проблему, какой блок считать последним после того, как прежний "последний" исчез, и как отследить столкновение змеи с самой собой.


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
Voker57
Дата 24.6.2003, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MuToGeN @ 23.6.2003, 11:06)
У меня это решалось с помощью трехмерного массива...

Ну я как бы не очень опытный программист и на паскале я как-то и без 3D всё решал - но забыл как... biggrin.gif

2DENNN: Куда кидать-то?


Это сообщение отредактировал(а) Voker57 - 24.6.2003, 16:01


--------------------
Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности
Судить об этом не имею никакой возможности.
При следующем свидании вы сами выйдете из тупика.
Ну, до свидания, пока. :-)
Д.И. Хармс
Самый радиоактивно загрязненный сайт 2004
PM MAIL WWW ICQ YIM   Вверх
MuToGeN
Дата 25.6.2003, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

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



Цитата
я как-то и без 3D всё решал - но забыл как...
Глючу я... Отоспался одну ночь - вспомнил, что и как...
Не было там никакого трехмерного массива, обычный двухмерный, и не более...
Решение достаточно простое, кстати. Как для применения, так и для понимания. И быстрое, и памяти лишней не жрет... Если что, кидай на [email protected] свой код


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
Voker57
Дата 25.6.2003, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я тут кое-что выяснил:
Вот что мне реально надо: как отследить если в единицу времени не произошло ничего?


--------------------
Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности
Судить об этом не имею никакой возможности.
При следующем свидании вы сами выйдете из тупика.
Ну, до свидания, пока. :-)
Д.И. Хармс
Самый радиоактивно загрязненный сайт 2004
PM MAIL WWW ICQ YIM   Вверх
&-ray
Дата 25.6.2003, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 406
Регистрация: 15.4.2003
Где: Казахстан, г Аста на

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



Я делал змейку на Делфях так:
игровое поле - двумерный массив (заполняешь его, определенное значение - определенная "штучка" на игровом поле);
сама змея - одномерный динамический массив - туда записываем последовательность всех составляющих змейки;
глобальная переменная - 1 - змейка движется вверх, 2 - вниз и т.д.
при нажатии на стрелки клавиатуры изменяем эту переменную, исходя из того, какая стрелка была нажата;
по таймеру обрабатываем значение этой переменной и двигаем змейку в нужном направлении, исходя из координат ее головы и хвоста



--------------------
"Совсем неважно от чего помрешь, ведь куда важнее - для чего родился..." С.Б.

--------------------
И снова мышь беру я в руки
Куда иду? - Конечно в сруки!
PM MAIL WWW   Вверх
Дрон
Дата 25.6.2003, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

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



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

Я, когда писал змейку, то просто устанавливал таймер, который
генерировал сообщение WM_TIMER через небольшие интервалы времени (~100 мс), и
по этим сообщениям изменял положение змейки и перерисовывал экран.

А ещё есть другой вариант, если ты пишешь без MFC, то есть на "чистом" Win32 API
то в WinMain() вместо чего-то такого:

while (GetMessage (&msg, NULL, 0, 0)){
TranslateMessage (&msg);
DispatchMessage (&msg);
}

можно написать что-то другое, вроде:

while(1){
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage (&msg);
DispatchMessage (&msg);
if(msg.message==WM_QUIT) break;
}
NextFrame(); // твоя функция двигающая змею, перерисовывающая экран и т.п.
}

Дело в том что GetMessage() ждёт появления сообщения, а PeekMessage() -- нет.
Поэтому цикл будет крутиться без остановок, и ты получишь максимально возможную
частоту кадров в игре.

Кстати, я змейку в своё время за 2 дня написал. smile.gif



--------------------
Да. Именно так.
PM   Вверх
Voker57
Дата 26.6.2003, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
...устанавливал таймер, который
генерировал сообщение WM_TIMER через небольшие интервалы времени (~100 мс), и
по этим сообщениям изменял положение змейки и перерисовывал экран.

А как это? Напиши код,если не трудно
Цитата
Кстати, я змейку в своё время за 2 дня написал. smile.gif 

А я пишу уже 2 года butbut.gif



--------------------
Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности
Судить об этом не имею никакой возможности.
При следующем свидании вы сами выйдете из тупика.
Ну, до свидания, пока. :-)
Д.И. Хармс
Самый радиоактивно загрязненный сайт 2004
PM MAIL WWW ICQ YIM   Вверх
Дрон
Дата 27.6.2003, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

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



Код говоришь... Я-то напишу, только я так и не понял, с использованием чего ты пишешь, поэтому приведу два варианта (они, в общем-то, похожи).

Первый.
Application using MFC.
(Не силён я в этом, если честно...)

Будем считать, что мастер создал за тебя основу твоего приложения.
И пусть, есть у тебя функция StartGame(), которая начинает новую игру. В ней ты инициализируешь переменные, обнуляешь счётчик очков и т.д. И в ней же ты создаёшь таймер, примерно так:

Код
void StartGame(){
...
theApp.m_pMainWnd->SetTimer(123,100,TimerProc);
...
}


Где theApp - твоё приложение,
m_pMainWnd - главное окно.

Здесь:
123 - идентификатор таймера, чтобы отличать, если их несколько
100 - время в миллисекундах, через которые будет срабатывать таймер
TimerProc - имя функции-обработчика

Функция-обработчик, естественно, должна быть описана заранее:
Код
void _stdcall TimerProc(
   HWND hwnd,   // handle of window for timer messages
   UINT uMsg,   // WM_TIMER message
   UINT idEvent, // timer identifier
   DWORD dwTime  // current system time
  )
{
// А вот тут ты и делаешь всё, что тебе надо. Двигаешь змейку например.
// Лень всё переводить на русский :)
}


А когда тебе нужно удалить таймер (игра окончена) пишешь так:
Код
void EndGame(){
...
theApp.m_pMainWnd->KillTimer(123);
// 123 - идентификатор таймера
...
}


Кажется так.
Если кто-нибудь увидел здесь что-нибудь неправильное, то я с вами заранее полностью согласен smile.gif , т.к. никогда не писал с MFC.

А теперь второй способ.
Application NOT using MFC. Просто Win32 Application

Пусть:
Код
HWND MainWnd //это HWND твоего окна с игрой
int  MyTimer //an integer identifying the new timer

void StartGame(){
MyTimer=SetTimer(123,100,TimerProc);
}


TimerProc() точно такая же.

Код
void EndGame(){
KillTimer(MyTimer);
}


Вот так. Это как-то к сердцу ближе smile.gif

Ты спросишь, а где здесь WM_TIMER? Лучше забудь... А ещё лучше почитай документацию. Хотя бы Microsoft® Win32® Programmer's Reference.

P.S.
Надеюсь, не слишком утомил? smile.gif


--------------------
Да. Именно так.
PM   Вверх
Voker57
Дата 27.6.2003, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо!!!!!!!!!


--------------------
Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности
Судить об этом не имею никакой возможности.
При следующем свидании вы сами выйдете из тупика.
Ну, до свидания, пока. :-)
Д.И. Хармс
Самый радиоактивно загрязненный сайт 2004
PM MAIL WWW ICQ YIM   Вверх
Voker57
  Дата 4.7.2003, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Чё-то не выходит...
Я объявил эту функцию и вызываю SetTimer так:
Код
HWND hwnd;
theApp.m_pMainWnd->SetTimer(123,100,TimerProc(hwnd, 1, 123,2400));

Две ошибки:
Цитата
C:\Program Files\Microsoft Visual Studio\MyProjects\The winsnake\TwsView.cpp(15) : error C2370: 'THIS_FILE' : redefinition; different storage class
        c:\program files\microsoft visual studio\myprojects\the winsnake\the winsnake.cpp(16) : see declaration of 'THIS_FILE'
C:\Program Files\Microsoft Visual Studio\MyProjects\The winsnake\TwsView.cpp(108) : error C2664: 'SetTimer' : cannot convert parameter 3 from 'void (struct HWND__ *,unsigned int,unsigned int,unsigned long)' to 'void (__stdcall *)(struct HWND__ *,uns
igned int,unsigned int,unsigned long)'
        None of the functions with this name in scope match the target type



--------------------
Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности
Судить об этом не имею никакой возможности.
При следующем свидании вы сами выйдете из тупика.
Ну, до свидания, пока. :-)
Д.И. Хармс
Самый радиоактивно загрязненный сайт 2004
PM MAIL WWW ICQ YIM   Вверх
Дрон
Дата 4.7.2003, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

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



Я уж и забыл было...

Первая ошибка - это не ко мне. tounge.gif

А со второй дело такое:
Твоё сообщение об ошибке не соответсвует приведённому коду. mad.gif

Если написать код так, как у тебя то выскакивает вот такое:

Код

error C2664: 'SetTimer' : cannot convert parameter 3 from 'void' to 'void (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,unsigned long)'
Expressions of type void cannot be converted to other types


И это справедливо.
Ведь тебе же надо передать в SetTimer третьим параметром указатель на функцию TimerProc, и записывается он именем функции без круглых скобок.
А в твоей записи будет вызвана функция TimerProc, а потом то значение, которое она вернёт (а она вообще-то void smile.gif ) будет передано третьим параметров в вызове SetTimer. А это, простите, чушь.
Короче, должно быть просто:
Код
theApp.m_pMainWnd->SetTimer(123,100,TimerProc);


Как я и писал в прошлый раз smile.gif

Твоё сообщение об ошибке - это случай, если бы у тебя TimerProc был объявлен без _stdcall, а вот вызов SetTimer был правильный. Посмотри внимательно.

В общем, что-то ты напутал. А у меня всё правильно было написано.

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


--------------------
Да. Именно так.
PM   Вверх
Voker57
Дата 5.7.2003, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хмм. Щас проверю.


--------------------
Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности
Судить об этом не имею никакой возможности.
При следующем свидании вы сами выйдете из тупика.
Ну, до свидания, пока. :-)
Д.И. Хармс
Самый радиоактивно загрязненный сайт 2004
PM MAIL WWW ICQ YIM   Вверх
Voker57
Дата 5.7.2003, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это таймер.
Код
theApp.m_pMainWnd->SetTimer(123,100,TimerProc);
А это объявление
Код
void __stdcall  TimerProc (HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
ЗЫ Обрати внимание что я этот THIS_FILE вообще не трогал


--------------------
Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности
Судить об этом не имею никакой возможности.
При следующем свидании вы сами выйдете из тупика.
Ну, до свидания, пока. :-)
Д.И. Хармс
Самый радиоактивно загрязненный сайт 2004
PM MAIL WWW ICQ YIM   Вверх
Voker57
Дата 6.7.2003, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если кто не понял то ошибка так и осталась!!!!!


--------------------
Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности
Судить об этом не имею никакой возможности.
При следующем свидании вы сами выйдете из тупика.
Ну, до свидания, пока. :-)
Д.И. Хармс
Самый радиоактивно загрязненный сайт 2004
PM MAIL WWW ICQ YIM   Вверх
Дрон
Дата 6.7.2003, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

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



Странно это как-то...

Слушай, товарищ, пришли мне исходник, конечно, если он не является коммерческой тайной, -- я его посмотрю. И всё тебе объясню.

Мыло: [email protected] и тему напиши: "Змейка", чтоб со спамом не спутать...


--------------------
Да. Именно так.
PM   Вверх
Дрон
Дата 6.7.2003, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

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



Блин!
Я-то сначала на форум, а потом только мыло проверяю. smile.gif

Но всё равно мне бы кусочек кода побольше...


--------------------
Да. Именно так.
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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