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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2012, 20:53   #1
kventin_zhuk
БНТУ ФИТР
Форумчанин
 
Аватар для kventin_zhuk
 
Регистрация: 20.05.2012
Сообщений: 315
По умолчанию Змейка, с++

Всем привет. Вот решил написать игру, для того чтобы понять что это такое и с чем это едят. Пока остановился на игре змейка, решил пока без opengl, а тупо в консоли. Готовых понятных змеек в консоли не нашёл, поэтому решил писать с нуля. Подумал, составил алгоритм:
- По моему алгоритму поле - двумерный массив символов, змейка перемещается по этому полю

Сначала решил написать передвижение символа по нажатию стрелочек. Вот пример одной функции,движение в лево(всего их 4(право лево верх низ)):
Код:
void Csnake::left(void)
{
	field();// функция вывода массива на экран.
	mass[x][y-1]='*';
	mass[x][y]=' ';
	y--;
	return;
}
Ну и в функции main обрабатываю вызов функции соответственно нажатию клавиши клавиатуры. по итогу получилось вот что.snake.rar


Т.е всё банально, при каждом сдвиге змейки(символа) я очищаю окно доса и вывожу массив заново. Из-за этого границы поля постоянно моргают. Дописывать таким образом программу смысла не имеет( Подскажите что я сделал не так, может изначальная концепация неправильная? Спасибо за внимание.
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты
kventin_zhuk@live.com
kventin_zhuk вне форума Ответить с цитированием
Старый 21.07.2012, 22:11   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

А вы не очищайте! Просто устанавливайте каретку в самое начало и выводите все по новой. Таким образом старые данные затрутся новыми.
Kostia вне форума Ответить с цитированием
Старый 21.07.2012, 22:31   #3
kventin_zhuk
БНТУ ФИТР
Форумчанин
 
Аватар для kventin_zhuk
 
Регистрация: 20.05.2012
Сообщений: 315
По умолчанию

Цитата:
Сообщение от Kostia Посмотреть сообщение
А вы не очищайте! Просто устанавливайте каретку в самое начало и выводите все по новой. Таким образом старые данные затрутся новыми.
Вот!!!!! большое спасибо!!!!! а я тут голову ломаю))) ещё бы подсказали как установить каретку на начало, ну да ладно сейчас нагуглим.
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты
kventin_zhuk@live.com

Последний раз редактировалось kventin_zhuk; 21.07.2012 в 23:36.
kventin_zhuk вне форума Ответить с цитированием
Старый 21.07.2012, 23:48   #4
kventin_zhuk
БНТУ ФИТР
Форумчанин
 
Аватар для kventin_zhuk
 
Регистрация: 20.05.2012
Сообщений: 315
По умолчанию

Цитата:
Сообщение от Kostia Посмотреть сообщение
А вы не очищайте! Просто устанавливайте каретку в самое начало и выводите все по новой. Таким образом старые данные затрутся новыми.
Как я понял, возврат каретки это \r. или есть специальная function, устанавливающая её? переделал с \r тупо выводит в столбец каждый раз новое поле.

\r возвращает курсор в начало строки, но я вывожу поле как 2х мерную таблицу, после вывода каждой строки у меня перевод на следующую, вот такой цикл для вывода:
Код:
for(int i=0;i<20;i++)
	{
		for(int j=0;j<50;j++)
			printf("%c",mass[i][j]);
		printf("\n");
	}
Как тут быть -не знаю(
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты
kventin_zhuk@live.com

Последний раз редактировалось kventin_zhuk; 22.07.2012 в 00:34.
kventin_zhuk вне форума Ответить с цитированием
Старый 22.07.2012, 00:28   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Есть борландовская gotoxy, также можно сделать ее аналог для других компиляторов через WinAPI. К примеру, гугль выдал такой вариант: (не проверял, хотя должно работать)
Код:
void gotoxy(int xpos, int ypos)
{
  COORD scrn;    
  HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
  scrn.X = xpos; scrn.Y = ypos; 
  SetConsoleCursorPosition(hOuput,scrn);
}
В принципе добиваться тут идеального результата необязательно, поскольку вариант чисто учебный, в реальных задачах вы вряд ли будете рисовать ASCII графикой с приличной скоростью обновления.
Как сделаете игру с такой графикой - советую посмотреть в сторону рисования примитивами - например через тот же GDI (часть WinAPI). Какая-никакая, а графика. Хотя и тут тоже не стоит надолго останавливаться, после примитивов можно уже рисовать нормальными движками.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 22.07.2012, 00:54   #6
kventin_zhuk
БНТУ ФИТР
Форумчанин
 
Аватар для kventin_zhuk
 
Регистрация: 20.05.2012
Сообщений: 315
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
Есть борландовская gotoxy, также можно сделать ее аналог для других компиляторов через WinAPI. К примеру, гугль выдал такой вариант: (не проверял, хотя должно работать)
Код:
void gotoxy(int xpos, int ypos)
{
  COORD scrn;    
  HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
  scrn.X = xpos; scrn.Y = ypos; 
  SetConsoleCursorPosition(hOuput,scrn);
}
В принципе добиваться тут идеального результата необязательно, поскольку вариант чисто учебный, в реальных задачах вы вряд ли будете рисовать ASCII графикой с приличной скоростью обновления.
Как сделаете игру с такой графикой - советую посмотреть в сторону рисования примитивами - например через тот же GDI (часть WinAPI). Какая-никакая, а графика. Хотя и тут тоже не стоит надолго останавливаться, после примитивов можно уже рисовать нормальными движками.
нормальные движки это что??? про winAPI слышал от препода, но по его словам это прошлый век и вообще не стоит туда лезть.
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты
kventin_zhuk@live.com
kventin_zhuk вне форума Ответить с цитированием
Старый 22.07.2012, 19:22   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Нормальные движки - это уже в точности то, что выдает гугль по запросу "графический движок".
Что касается WinAPI, то в само по себе оно едва ли устареет пока существует винда, хотя сейчас существует огромное количество более высокоуровневых средств, гораздо более простых в обращении.
Само собой, что в серьезном проекте вы едва ли найдете графику, реализованную на чистом WinAPI. Но и рисование символами в серьезных проектах, скажем так, редкость. Про рисование примитивами на WinAPI я говорил в том ключе, что это один из возможных следующих шагов после ASCII - это уже ближе к полноценной графике. WinAPI; TCanvas в билдеровской VCL - рисовать кружочки и прямоугольники везде просто, но при этом уже можно немного пощупать работу с графикой на уровне, приближенном к профессиональном.
Не обязательно выбирать WinAPI, все равно это будет чисто переходный тренировочный этап.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 23.07.2012, 21:43   #8
monster-bonster
Пользователь
 
Аватар для monster-bonster
 
Регистрация: 27.06.2012
Сообщений: 38
По умолчанию

Цитата:
Сообщение от kventin_zhuk Посмотреть сообщение
Всем привет. Вот решил написать игру, для того чтобы понять что это такое и с чем это едят. Пока остановился на игре змейка, решил пока без opengl, а тупо в консоли. Готовых понятных змеек в консоли не нашёл, поэтому решил писать с нуля. Подумал, составил алгоритм:
- По моему алгоритму поле - двумерный массив символов, змейка перемещается по этому полю

Сначала решил написать передвижение символа по нажатию стрелочек. Вот пример одной функции,движение в лево(всего их 4(право лево верх низ)):
Код:
void Csnake::left(void)
{
	field();// функция вывода массива на экран.
	mass[x][y-1]='*';
	mass[x][y]=' ';
	y--;
	return;
}
Ну и в функции main обрабатываю вызов функции соответственно нажатию клавиши клавиатуры. по итогу получилось вот что.Вложение 52634


Т.е всё банально, при каждом сдвиге змейки(символа) я очищаю окно доса и вывожу массив заново. Из-за этого границы поля постоянно моргают. Дописывать таким образом программу смысла не имеет( Подскажите что я сделал не так, может изначальная концепация неправильная? Спасибо за внимание.
Этот метод реализации игры очень часто всречается у начинающих (я
тоже когда писал свою первую змейку, пошел точно таким путем).
Скажу вам прямо, этот метод никуда не годится.
Лучше всего представить тело змейки как массив структуры.

Код:
struct snake_type {
int x, y;
int d;
};
При каждом движении коотдинаты головы змеи меняются
смотря какое направление вы ей дали.
А старые коотдинаты головы присваиваются следующей
части его тела. Координаты следующей части змеи присваиваются позаследующей части. И так до хвоста. И тогда получится что
змея как-бы ползет.
А точнее

Код:
void move_snake(struct snake_type * snake, int dir, int tail)
{
   // значене dir это направление движения змеи
   // tail индекс хвоста

   //                 tail
   //                   |
   //                   V
   // 11111111111100000000000
   for (i = tail; i > 0; i--) {
      snake[ i ] = snake[ i-1 ];
   }
   switch (dir) {
      case 0 : // допустим 0 означает вверх
         snake[ i ].x--;
         break;
      case 1 :
         snake[ i ].x++;
         break;
      case 2 :
         snake[ i ].y--;
         break;
      case 3 :
         snake[ i ].y++;
         break;
   }
}
По моему это все что вам нужно, чтобы дальше самому закончить
игру.
Вы ведь используете conio.h ?
Мне вас жаль, советую wincurses.h.
Это точный аналог ncurses в линукс. И в ней
есть классная функция, с помощью которой
можно определить размер экрана. Так что при
запуске проги ваша консоль не уменьшится в
80x25 как в conio.

http://www.baldwin.cx/~john/projects/WinCurses.html
monster-bonster вне форума Ответить с цитированием
Старый 23.07.2012, 22:05   #9
monster-bonster
Пользователь
 
Аватар для monster-bonster
 
Регистрация: 27.06.2012
Сообщений: 38
По умолчанию

И все же если у вас не получается, так
как я ужасно объясняю, то
вот моя игра, прочтите код и все станет
ясно.
Правда эта игра написана на Линуксе,
используйте вместо ncurses, wincurses
Удачи!!!
Вложения
Тип файла: zip snake.zip (2.2 Кб, 76 просмотров)

Последний раз редактировалось monster-bonster; 23.07.2012 в 22:08.
monster-bonster вне форума Ответить с цитированием
Старый 24.07.2012, 13:08   #10
kventin_zhuk
БНТУ ФИТР
Форумчанин
 
Аватар для kventin_zhuk
 
Регистрация: 20.05.2012
Сообщений: 315
По умолчанию

Цитата:
Сообщение от monster-bonster Посмотреть сообщение
И все же если у вас не получается, так
как я ужасно объясняю, то
вот моя игра, прочтите код и все станет
ясно.
Правда эта игра написана на Линуксе,
используйте вместо ncurses, wincurses
Удачи!!!
Cпасибо за помощь, обязательно посмотрю. У меня уже у самого стали возникать мысли, что мой алгоритм никуда не годится. Сделал метод движения вправо-влево, и даже продумал кормление, но вот с поворотами что-то совсем не клеится. Буду пробовать сначала.
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты
kventin_zhuk@live.com
kventin_zhuk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Змейка Yellowboy Паскаль, Turbo Pascal, PascalABC.NET 0 06.01.2012 13:36
Змейка в C++ Neo151 Помощь студентам 1 12.08.2011 12:59
Змейка zamaevac Gamedev - cоздание игр: Unity, OpenGL, DirectX 20 01.07.2010 19:19
змейка =) romiccccc Помощь студентам 0 12.05.2010 11:08
ЗМЕЙКА(((( mizantrop32 Общие вопросы C/C++ 2 07.04.2010 17:10