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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2011, 14:45   #1
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию Змейка. Движение змейки. Обработка клавиш.

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

Как сделать чтобы каждые 0.5 сек символ(питон) передвигался ?
И чтобы когда происходило нажатие он повернул в нужном направление и продолжил движение?
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 30.12.2011, 15:59   #2
Maksimall89
Пользователь
 
Аватар для Maksimall89
 
Регистрация: 10.11.2010
Сообщений: 59
По умолчанию

На вход у тебя код нажатой клавиши (стрелки), дальше распознаешь его (в какую сторону надо идти) и сдвигаешься.
Всё запихиваешь в один цикл в while и двигаешься, а задержку с помощью функций Delay или Sleep можно реализовать.
Maksimall89 вне форума Ответить с цитированием
Старый 31.12.2011, 01:27   #3
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

не могу понять как надо сделать чтобы питон передвигался, может отрисовывать каждый раз в цикле поле с новыми координатами питона ? но как тогда сделать, чтобы питон двигался в определенном направлении ?

нажатие клавиш написал..
Код:
void whatKeyPress (int &key)
{
        if(key==0){
                key=getch();
                switch(key){
                case 72:{cout<<"UP"<<endl; break;}
                case 80:{cout<<"DOWN"<<endl; break;}
                case 75:{cout<<"LEFT"<<endl; break;}
                case 77:{cout<<"RIGHT"<<endl; break;}
                default :{cout<<"any key"<<endl; break;}
                }
        }
}
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 31.12.2011, 02:35   #4
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Ну да, перерисовывать. Храни поле для змейки в виде двумерного массива. В каждой ячейке единица (змейка ползёт по этой ячейке) или нолик (змейки здесь нет). Так же, нужно помнить координаты головы и хвоста: 2 переменных.

Когда стрелку нажали - высчитаваем новую голову, отмечаем её в матрице. Потом удаляем хвост из матрицы (значение в ноль) и высчитываем новый хвост. Перерисовываем это всё дело.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 31.12.2011, 03:06   #5
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Да, интереснее реализовать питона в виде списка. Тогда каждый элемент будет указывать на следующий и помнить свои координаты. Хвост известен, голова известна. Просмотреть все элементы и сдвинуть их в зависимости от координат предыдущего. Потом проверить на пересечения и т.д. В общем, задача будет решаться проще)
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 31.12.2011, 12:07   #6
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Спасибо!

хм.. а как это в виде списка?
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 31.12.2011, 12:39   #7
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

если пишешь на с++ советую посмотреть в сторону vector
onewho вне форума Ответить с цитированием
Старый 31.12.2011, 12:45   #8
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Либо так: http://ru.wikipedia.org/wiki/%D0%A1%...8%D0%BA%D0%B0)


Каждый элемент - структура, которая хранит свои данные и указатель на следующий элемент.

Либо, как написал onewho, с помощью уже готового vector.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 31.12.2011, 13:32   #9
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Спасибо, господа!
Наверное буду пробовать без vector'a, немного позже разберусь с vector'om.

Вот только мне не понятно как должно осуществляться обработка клавиш.
А то, что у меня есть, оно ждет нажатия клавиши. а мне надо чтобы оно двигало к примеру '*' в одном направление постоянно, а не ждало нажатия клавиши, и чтобы когда была нажата клавиша, то реагировало.

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

вот нашел похожий пост, но не могу разобрать его..
http://programmersforum.ru/showthrea...t=%E8%E3%F0%E0
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 31.12.2011, 17:26   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

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

Смысл идеи: создать отдельный механизм, отвечающий за клавиатуру, мышку, и окошко, и работать с ним.

Особенности механизма: он тестировался только в консольном приложении, под Windows.

Здесь сам механизм: http://liveworkspace.org/code/b85f46...8e93ba1015d992

Здесь материал, откуда была взята сама идея механизма:
http://vsokovikov.narod.ru/New_MSDN_...le/conevnt.htm


Код:
//Пример использования:
#include "TWinKeyborad.h"

int main()
{
     SNone outDev;                   //устройство вывода
     TWinKeyborad<SNone> inDev(&outDev); //устройство ввода

     std::string dst; //сюда будут записаны символы нажатых клавишь
     inDev.Wait_InKeyString(dst); //ждем, пока пользователь не введт всю строчку, и не нажмет enter
     std::cout << "пользователь ввел: "<<dst<<std::endl;
}

Последний раз редактировалось _Bers; 31.12.2011 в 17:30.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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