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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2021, 21:27   #1
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 137
По умолчанию Интеллект с противником в игре Pacman пр

Запрограммировал движение врага в функции EvTimer(UINT).При натыкании на стену враг должен не идти,однако он проходит сквозь стену.
Код на проход врага в функции EvTimer (здесь),вся программа ниже.В функции EvKeyDown осуществляется движение колобка нашего , функция проверяет на стену,если он натыкается на стену, то ничего не происходит.

Код:
s2=0;

if(m[i2-1][j2]==' ')
  {
        stekE1[l2++]=i2-1;
	stekE2[k2++]=j2;
	s2=1;
	bitmapEnemy.y-=20;
	
  }
	else
	  if(m[i2-1][j2]=='*')
		{
			stekE1[l2++]=i2-1;
			stekE2[k2++]=j2;
			s2=1;
			bitmapEnemy.y-=20;
		}


	if(m[i2][j2-1]==' ')
	{
	 stekE1[l2++]=i2;
	 stekE2[k2++]=j2-1;
	 s2=1;
	 bitmapEnemy.x-=20;
	}
	else
		 if(m[i2][j2-1]=='*')
		  {
			stekE1[l2++]=i2;
			stekE2[k2++]=j2-1;
			s2=1;
			bitmapEnemy.x-=20;
		  }


  if(m[i2][j2+1]==' ')
	{
	  stekE1[l2++]=i2;
	  stekE2[k2++]=j2+1;
	  s2=1;
	  bitmapEnemy.x+=20;

	 }
		else
			 if(m[i2][j2+1]=='*')
			  {
			  	stekE1[l2++]=i2;
				stekE2[k2++]=j2+1;
				s2=1;
				bitmapEnemy.x+=20;
			  }

  if(m[i2+1][j2]==' ')
		{
		  stekE1[l2++]=i2+1;
		  stekE2[k2++]=j2;
		  s2=1;
		  bitmapEnemy.y+=20;
		}
		else
			 if(m[i2+1][j2]=='*')
			  {
				stekE1[l2++]=i2+1;
				stekE2[k2++]=j2;
				s2=1;
				bitmapEnemy.y+=20;
			  }
if(s2==1)
	 {
	  Invalidate(FALSE);
	  i2=stekE1[--l2];j2=stekE2[--k2];
	 }
	 else
		if(s2==0)
		 {
		  Invalidate(FALSE);
		 }
Вся программа:
Вложения
Тип файла: rar pacman12.rar (8.7 Кб, 5 просмотров)

Последний раз редактировалось BDA; 24.08.2021 в 03:10.
Timurkh77 вне форума Ответить с цитированием
Старый 15.08.2021, 23:24   #2
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 137
По умолчанию

Я осуществляю поиск свободного пути просматривая карту местности , если есть путь в соседнюю клетку , то по таймеру я в неё перемещаюсь.Например если свободна верхняя клетка:
Код:
if(m[i2-1][j2]==' ')
{
stekE1[l2++]=i2-1;
stekE2[k2++]=j2;
s2=1;
bitmapEnemy.y-=20;
}
Помещаю ее в стек и перемещаюсь вверх.Но почему-то в игре противник проходит сквозь стену , то есть если m[i2-1][j2]=='.'

Последний раз редактировалось BDA; 24.08.2021 в 03:10.
Timurkh77 вне форума Ответить с цитированием
Старый 22.08.2021, 20:24   #3
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 137
По умолчанию

По карте местности ищем пустую вершину,путь в соседнюю клетку.
if(m[i2-1][j2]==' ')

Здесь в ширину 32 клетки в каждых кавычках

Код:
char *g[N]  ={"................................",
		    "..                             .",
		    ".   .........           *      .",
		    "..       .      .... ...     . .",
		    "..*    . .         . .. *   .. .",
		    ".      . ......   .......      .",
		    ".  ... .       .               .",
		    ".      . ......     .  .       .",
		    ". .... .         ....  .       .",
		    ".    . . ......  ....      ... .",
		    ". ..                           .",
		    ". ..   ....................... .",
		    ".                               ",
		    ".      ................  ..... .",
		    ".    ..............  .......   .",
		    ".    .                     .   .",
		    ".    .      . .     *      .   .",
		    ".    .        .  *             .",
		    ".    .      . .                .",
		    ".    .      . ................ .",
		    ".    .            *            .",
		    ".    .        ............ ... .",
		    ".    .        .          . .   .",
		    ".    .        .          . .   .",
		    ".    .        .          . ... .",
		    ".    .       .... ...... .   . .",
		    "................................",
		  };

void TMyWin::SetupWindow()
{
char m[N][M];

for(i=0;i<N;i++)
	for(j=0;j<M;j++)
	  {
		m[i][j]=g[i][j];
	  }
}

void TMyWin::EvTimer(UINT)
{
if(m[i2-1][j2]==' ')
{
stekE1[l2++]=i2-1;
stekE2[k2++]=j2;
s2=1;
bitmapEnemy.y-=20;
}
}

Последний раз редактировалось BDA; 24.08.2021 в 03:10.
Timurkh77 вне форума Ответить с цитированием
Старый 29.11.2021, 21:18   #4
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 137
По умолчанию

Ichi , помоги пожалуйста.
Timurkh77 вне форума Ответить с цитированием
Старый 05.12.2021, 17:16   #5
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 138
По умолчанию

Сложно понять почему враг через стену проходит, вроде бы по коду проверки есть пересечение для пустой клетки и для жемчужины, но нет проверки пересечения для стены. Может быть в этом причина? Я не понял какую роль играет массивы стэк stekE1 и stekE2?

Последний раз редактировалось ichi; 05.12.2021 в 17:23.
ichi вне форума Ответить с цитированием
Старый 08.12.2021, 21:57   #6
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 137
По умолчанию

Враг перемещается по таймеру , если есть пустая клетка вверху ,внизу,слева,справа ,то мы перемещаемся в эту клетку: сохраняем эту вершину stekE1[l2++]=i2-1,stekE2[k2++]=j2 и если есть путь if(s2==1) , то мы делаем текущей следующую клетку i2=stekE1[--l2],j2=stekE2[--k2] и перемещаемся в нее bitmapEnemy.y-=20.В противном случае ,если стена , то ничего не делается.
Timurkh77 вне форума Ответить с цитированием
Старый 09.12.2021, 07:41   #7
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 138
По умолчанию

Могу предположить, что в массивы stekE1 и stekE2 каким-то образом, в какой-то момент, при каких-то условиях, записываются координаты стены и враг начинает гулять через стену. Надо в отладчике Borland С++ проверить.

Последний раз редактировалось ichi; 09.12.2021 в 07:44.
ichi вне форума Ответить с цитированием
Старый 09.12.2021, 07:48   #8
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

Цитата:
Сообщение от Timurkh77 Посмотреть сообщение
if(m[i2-1][j2]==' ')
{
stekE1[l2++]=i2-1;
stekE2[k2++]=j2;
а где происходит проверка на не выход за края массива ?
Алексей1153 вне форума Ответить с цитированием
Старый 09.12.2021, 23:04   #9
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 137
По умолчанию

Мы сохраняем пустую клетку
if(m[i2-1][j2]==' ')
{
stekE1[l2++]=i2-1;
stekE2[k2++]=j2;
}
Другая клетка туда попасть не может.
Timurkh77 вне форума Ответить с цитированием
Старый 10.12.2021, 00:04   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Программу не запускал. У вас в 42 строке справа дырка в карте. А стеки могут переполниться, так как можете положить 4 точки в них (свободно со всех сторон), а забираете только одну.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с загрузкой звука в игре типа Pacman Timurkh77 Gamedev - cоздание игр: Unity, OpenGL, DirectX 12 13.09.2018 05:23
Графическая ошибка в игре типа Pacman Timurkh77 Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 18.08.2018 22:08
Какие знания по php и mysql нужно иметь, что бы в игре сделать такой бой в онлайн текстовой игре jonikster Общие вопросы Web 4 15.06.2016 18:10
Интеллект компьютера в игре покер на костях Pepsy Общие вопросы C/C++ 1 06.04.2013 21:17
Зависание игры после отбивания шара (TShape) противником (Delphi) alex 2000 Помощь студентам 0 06.02.2012 13:47