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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2012, 17:49   #1
Asante
Пользователь
 
Регистрация: 21.09.2011
Сообщений: 30
По умолчанию и снова змейка

у меня огромная просьба,задали на выходные написать змейку на С++ в Visual Sudio 2010, но очень много ограничений в плане библиотек,поэтому интернет отпадает(уже гуглил,везде то что мы не учили)сам никак не справлюсь,если не тяжело не могли бы вы мне помочь,мозг уже закипает,перемещение с одной звездочкой сделал,а как влепить 3 и двигать их не могу написать
Код:
#include<iostream>
	#include<ctime>
	#include<conio.h>
	#include<Windows.h>
	using namespace std;
	void main()
	{srand(time(0));
	const int row = 20;
	const int col = 20;
	int mass[row][col]={};
	int stx=3;
	int sty=5;
	for ( int j = 0 ; j < row ; j++ )
	{
	 for (int i = 0 ; i < col ; i++ )
	 {
	  mass[j][i] = ' ';
	 }
	}
	mass[stx][sty] = '*';
	mass[stx+1][sty] = '*';
	mass[stx-1][sty] = '*';
	int inp = 0;
	do
	{

	system("cls");
	for ( int j = 0 ; j < row ; j++ )
	 {
	  for (int i = 0 ; i < col ; i++ )
	  {  
	   cout << char (mass[j][i]) << " ";
	  }
	  cout << endl ;
	 }
	Sleep(300);
	if (_kbhit())
	{inp=_getch();
		if (inp==224)
		{
		 inp=_getch();
		}
	}
	switch (inp)
	{
	case 75://vniz
	 mass[stx][sty] = ' ';
	 mass[stx][--sty] = '*';
	 break;
	case 77://vpravo
	 mass[stx][sty] = ' ';
	 mass[stx][++sty] ='*';
	 break;
	case 72://vverx
	 mass[stx][sty] = ' ';
	 mass[--stx][sty] = '*';
	 break;
	case 80://vlevo
	 mass[stx][sty] = ' ';
	 mass[++stx][sty] = '*';
	break;
	default:
	 mass[stx][sty] = '*';
	 mass[stx+1][sty] = '*';
	 mass[stx+2][sty] = '*';
	 mass[stx-1][sty] = ' ';
	break;
	 } 
	}
	while(inp!=27);


	}
Asante вне форума Ответить с цитированием
Старый 10.08.2012, 21:08   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

-змейка - список координат звездочек.
-змейка делает ход - последний элемент удаляется и добавляется в начало.
-если кроме хода змейка что-то скушала - то в начало добавляется новый элемент, ничего не удаляется при этом.

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

А Ваш код не смотрел, он сильно ужасен.
rrrFer вне форума Ответить с цитированием
Старый 10.08.2012, 21:23   #3
Asante
Пользователь
 
Регистрация: 21.09.2011
Сообщений: 30
По умолчанию

уважаемый rrrFer,что он ужасен и так понимаю,но я только начал учится и именно поэтому прошу помощи.Чисто логически я понимаю как это должно быть,но собрать воедино не получается,понимаю что это два одномерных массива в одном запоминаются координаты положения Х во втором У при каждой итеррации,а сложить все воедино не получается.Хотя может я и не прав
Asante вне форума Ответить с цитированием
Старый 10.08.2012, 21:35   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

лучше завести 1 массив, а лучше вектор. А еще лучше дек.
Код:
struct coord {
    int x, y;
};

std ::deque< coord > pith; //это твой питон, помести в него координаты узлов так, чтобы голова питона была в начале дека,а хвост - в конце
тогда ход питона:

Код:
pith .pop_back(); //оторвал хвост
auto tmp = pith .front(); // получил координаты головы
//где-то хранишь направление движения питона, изменяешь с учетом направления координату tmp, как-то так
Код:
switch( direction ) {
    case '0': tmp .x ++; break;
    case '1': tmp .y ++; break;
    case '2': tmp .x --; break;
    case '3': tmp .y --; break;
}
проверки сам впилишь (при изменении координат надо проверять не укусил ли питон сам себя, не вышел ли за пределы поля и т.п.).

ну и добавляешь новую вершину в начало питона
Код:
pith .push_front( tmp );
rrrFer вне форума Ответить с цитированием
Старый 10.08.2012, 21:42   #5
Asante
Пользователь
 
Регистрация: 21.09.2011
Сообщений: 30
По умолчанию

не учили вектора,все ограничивается тем что есть в моем коде,в этом и проблема,так бы я в нете выискал и расписал,а тут нужен код на основе элементарных знаний
Asante вне форума Ответить с цитированием
Старый 10.08.2012, 22:48   #6
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Тогда просто сдвигайте элементы на один назад, а потом в голову (первый элемент массива/ов) добавляйте ее новые координаты.
Собственно, функция типа такого должна быть (пишу без оглядки на ваш код, там как-нибудь сами пристроите):
Код:
enum Direction {LEFT, UP, RIGHT, DOWN};
void Move(int* xarr, int* yarr, int N, Direction dir)
{
for (int i = N - 1; i >= 1; --i)
 {
 xarr[i] = xarr[i - 1];
 yarr[i] = yarr[i - 1];
 }
switch (dir)
 {
 case LEFT: (xarr[0])--; break;
 case UP: (yarr[0])--; break;
 case RIGHT: (xarr[0])++; break;
 case DOWN: (yarr[0])++; break;
 }
}
Плюс добавить проверки на выход за пределы поля (т.е. утыкание в стенку, означающее к тому же проигрыш).
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 10.08.2012, 23:00   #7
Asante
Пользователь
 
Регистрация: 21.09.2011
Сообщений: 30
По умолчанию

опять же не учили enum Direction,void Move,хотя enum приравняю к клавишам
Вот такая вот ерунда у меня с заданием
Asante вне форума Ответить с цитированием
Старый 10.08.2012, 23:23   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

enum - это перечисления. Вместо него можете использовать просто int, условившись, что значение 1 - это влево, 2 - вверх, 3 - вправо, 4 - вниз. К примеру.
Move - это функция движения змейки, которую я определил. Если функций тоже не проходили, то вникайте в сам код и переносите идею уже на ваш вариант.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 10.08.2012, 23:36   #9
Asante
Пользователь
 
Регистрация: 21.09.2011
Сообщений: 30
По умолчанию

про enum понятно,а вот Void у нас кроме Main небыло,что означает не знаю,значит использовать не могу,забракуют
Asante вне форума Ответить с цитированием
Старый 10.08.2012, 23:40   #10
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Это у меня там функция такая. Очень грубо говоря - кусок кода, записанный отдельно по тому принципу, что этот кусок выполняет какое-то конкретное отдельное действие. В принципе вы можете записать аналогичный код у себя вместе со всем прочим. Просто забудьте про строчку с void Move и так далее, изучайте то, что между теми двумя фигурными скобочками, соотносите с моими словесными фразами, потом после небольшой подгонки сможете использовать этот кусок кода у себя.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Змейка на C++ Chudik Помощь студентам 4 12.06.2012 21:01
змейка на с++ danzel1 Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 30.07.2011 09:06
змейка =) romiccccc Помощь студентам 0 12.05.2010 11:08
MDIChild снова и снова... Siber_Dec Общие вопросы Delphi 2 13.12.2009 03:24
Змейка(С++) MISHA13 Помощь студентам 1 08.02.2009 09:35