Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Змейка


Автор: fellix 5.12.2005, 20:27
всех здравствуйте...
есть задача: нарисовать (желательно на С++ Builder) змейку, которая сначала появляется из одной клетки, потом растет на длину 4-ех клеток, затем начинает двигать. Затем на поле произвольным образом появляется пища, она ее ест и растет...
так вот ворос: с чего начать, какой способ решения можно здесь применить и => какой алгоритм придумать?
всем спасибо заранее...

Автор: mr.DUDA 5.12.2005, 22:16
Что такое змейка: это массив из координат сегментов змейки, плюс координаты головы змейки и направление движение головы. Координаты выражаются в целых числах. Например, лабиринт у нас состоит из 16 столбиков на 16 строк, тогда змейка может состоять, к примеру, из 4-х сегментов, каждый из которых имеет координаты (x,y). При передвижении змейки с предыдущего положения на следующее, достаточно просто взять положение "головы" и сместить на 1 в сторону, в которую повёрнута "голова". Все предыдущие сегменты нужно переместить на 1 вперёд, т.е. тот сегмент, который был сразу перед головой, становится вместо головы; сегмент перед ним - становится на его позицию, и т.д., до самого последнего сегмента. Собственно, сегмент можно рассматривать как "кусок змеи", занимающий участок свободного пространства 1x1. Всё просто, и всё логично.

Автор: powerfox 11.12.2005, 14:04
Я использовал другой алгоритм: требуется только знать про первый сегмент и последний. При передвижении первый передвигается(new coord += direct*width, где direct -1, 0 или 1), а последний сегмент затирается. В итоге происходит движение. Единственно, что следует сохранять - точки поворота головы, чтобы хвост знал, где повернуть.
Движок:
Код

void check_for_reverce();
const int width = 60;        //width of the each segment of the snake
Snake first = Snake(180, 0, 1, 0);   //first part of the snake
Snake lost = Snake(60,0, 1, 0);     //the lost part of the snake    
std::vector<Snake>point_of_reverce(500);
int i=0;                //count_of_points;
int curr_point=0;            //the nearest point of reverce
/*=============================================================================================
check vor reverce, make direction of moving of the lost part
*/
void check_for_reverce(){
            // check vor reverce, make direction of moving of the lost part
 if(lost.xpos == point_of_reverce[curr_point].xpos && lost.ypos == point_of_reverce[curr_point].ypos){
    lost.x_direct = point_of_reverce[curr_point].x_direct;
    lost.y_direct = point_of_reverce[curr_point].y_direct;
    curr_point++;
    //std::cout<<"Reverced!\n";
        }
}
//////////////////////////////////////////////////////////////////////////////////////////////////
        case SDLK_UP:{
            first.y_direct = -1;
            first.x_direct = 0;
            point_of_reverce[i] = Snake(first.xpos, first.ypos, 0, -1);
            i++;
            break;}
        case SDLK_DOWN:{
            first.y_direct = 1;
            first.x_direct = 0;
            point_of_reverce[i] = Snake(first.xpos, first.ypos, 0, 1);
            i++;
            break;}
        case SDLK_LEFT:{
            first.x_direct = -1;
            first.y_direct = 0;
            point_of_reverce[i] = Snake(first.xpos, first.ypos, -1, 0);
            i++;
            break;}
        case SDLK_RIGHT:{
            first.x_direct = 1;
            first.y_direct = 0;
            point_of_reverce[i] = Snake(first.xpos, first.ypos, 1, 0);
            i++;
            break;}
 first.xpos += first.x_direct*width;
 first.ypos += first.y_direct*width;
 DrawMove(&first,&lost); 
 check_for_reverce();
 lost.xpos += lost.x_direct*width;
 lost.ypos += lost.y_direct*width;
 

Автор: UnDe@D 6.10.2007, 16:09
а можна ту же змейку тока в коде на C#???

Автор: powerfox 6.10.2007, 19:03
Цитата(UnDe@D @  6.10.2007,  17:09 Найти цитируемый пост)
а можна ту же змейку тока в коде на C#??? 

А что там переписывать то? Совсем чуть чуть - и будет на С#.

Автор: UnDe@D 7.10.2007, 12:51
Цитата(powerfox @  6.10.2007,  17:03 Найти цитируемый пост)
А что там переписывать то? Совсем чуть чуть - и будет на С#. 

проблема в том что я С++ впервые вижу!

Автор: Trojian 18.10.2007, 10:33
Уважаемый powerfox, 
А можно выложить весь исходник змейки. Желательно с комментариями какой код и что он делает. Заранее спасибо  smile  smile 

Автор: powerfox 18.10.2007, 12:12
Цитата(Trojian @  18.10.2007,  11:33 Найти цитируемый пост)
А можно выложить весь исходник змейки. Желательно с комментариями какой код и что он делает. Заранее спасибо  smile  smile 

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

Автор: powerfox 18.10.2007, 12:12
С пустым фоном.

Автор: arilou 18.10.2007, 16:58
powerfox, спасибо  smile 


Автор: powerfox 18.10.2007, 18:56
Цитата(arilou @  18.10.2007,  17:58 Найти цитируемый пост)
powerfox, спасибо  smile 

Не за что. Может скоро выложу powersnake-1.0 smile На нормальном С++.


Чтобы скачать архив, нужно сохранить ту кракозябру, что открывается в браузере, отбросив ".txt". Потом разархивировать.

Добавлено через 1 минуту и 20 секунд
В zip. Чтобы без хитростей с сохранением.

Автор: Trojian 19.10.2007, 13:26
 powerfoxспасибо

Автор: T0ohtik 3.11.2008, 16:08
Подскажите, а как лучше рисовать саму змейку имеется в виду, полигоны, просто выводить картинками или как то по другом. Возможно применение OpenGL

Автор: powerfox 3.11.2008, 16:28
Цитата(T0ohtik @  3.11.2008,  17:08 Найти цитируемый пост)
Подскажите, а как лучше рисовать саму змейку имеется в виду, полигоны, просто выводить картинками или как то по другом. Возможно применение OpenGL 

Разницы принципиальной нет: сделайте и так, и так smile

Автор: fil88 5.6.2009, 16:23
Привет всем! Помогите плиз с запиской по курсовому "Змейка"

Автор: arilou 5.6.2009, 18:07
fil88, вам в раздел "центр помощи"

Автор: Disa15031992 22.11.2011, 20:08
мой вариант змейки на c#

http://depositfiles.com/files/6ijs5om34?redirect

Автор: Alex33R 23.5.2012, 18:02
Disa15031992, ссылка не работает=(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)