Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2022, 14:53   #71
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 117
По умолчанию

Немного изменил программу.Правильно ли.А как сделать чтобы противник убегал?
Код:
do
  {
  do
	{
	 k=rand()%2;
	 if(k==0)
	 {
	 bx=j;
	 by=i;
	 }
	 else if(k==1)
	 {
	  bx=rand()%M;
	  by=rand()%N;
	 }
	}
	 while((j2==bx&&i2==by)||m[by][bx]=='.');
	}while(!lee(j2,i2,bx,by));

Последний раз редактировалось BDA; 04.08.2022 в 08:09.
Timurkh77 вне форума Ответить с цитированием
Старый 04.08.2022, 08:36   #72
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,849
По умолчанию

В принципе правильно. Но второй if можно убрать, так как вариантов всего два. В таком виде противник станет заметно "хуже" гоняться за игроком. Поэкспериментируйте:
Код:
k = rand() % 10;
if (k > 2)
{
    bx = j;
    by = i;
}
else
{
    bx = rand() % M;
    by = rand() % N;
}
Для убегания противника можно, например, сделать новую функцию на основе волнового алгоритма: пустить волну от игрока к противнику, когда волна достигнет противника, то выбрать любую свободную (BLANK) клетку вокруг противника для его хода.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 07.08.2022, 13:39   #73
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 117
По умолчанию

Написал так,работает неправильно.Пустил волну от игрока к противнику.
Код:
k=rand()%2;
if(k==0&&a==false)
{
a=false;
if(s>d)
 {


  do
  {
	 bx=j;
	 by=i;
	 /*else if(k==2)
		 {
		  bx=j-10;
		  by=i-10;
		 }*/
	}while(!lee(j2,i2,bx,by));

	s=1;
	a=true;
	m=0;
  }

  j2=px[s];
  i2=py[s];

  s++;

  bitmapEnemy.x=j2*20+2;
  bitmapEnemy.y=i2*20+2;

  }

else if(a==true)
 {
  a=true;
  if(m==0)
  {
  do
  {
  bx=j2;
  by=i2;

  ax=j-10;
  ay=i-10;
  }while(!lee(ax,ay,bx,by));
  m=d;
  a=false;
  }
  j2=px[m];
  i2=py[m];
  m--;
  bitmapEnemy.x=j2*20+2;
  bitmapEnemy.y=i2*20+2;
Вложения
Тип файла: rar pacman4.rar (59.0 Кб, 2 просмотров)

Последний раз редактировалось BDA; 07.08.2022 в 23:18.
Timurkh77 вне форума Ответить с цитированием
Старый 09.08.2022, 05:07   #74
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,849
По умолчанию

Нельзя так делать (если пути между противником и игроком нет, то будет зацикливание):
Код:
do
{
    bx = j;
    by = i;
} while (!lee(j2, i2, bx, by));
Нужно переменную "a" тоже делать static, иначе второй if никогда не будет выполняться. И в таком виде это не убегание, просто строится кратчайший путь не от противника к игроку, а от игрока к противнику, а потом делается шаг противником по этому пути с другого конца. Я имел ввиду другое. Когда будет строиться путь от игрока к противнику, то матрица grid будет заполнена волной. Когда волна достигнет противника, то для его хода выбрать любую ближайшую свободную клетку (BLANK) в матрице grid, потому что занятые клетки это или стены, или ближе к игроку. Сам же путь не нужно строить, как это делается в функции lee. Хотя такое убегание от волны игрока может зажать противника в какой-нибудь угол или стену, наверное. А еще не надо менять режимы преследования и убегания на каждом тике таймера.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 10.08.2022, 00:33   #75
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 117
По умолчанию

Сделал так противник убегает , но почему-то не идет на встречу?
Код:
#include<owl\applicat.h>
#include<owl\framewin.h>
#include<owl\gdiobject.h>
#include<owl\dc.h>
#include<mmsystem.h>
#include<stdio.h>
#include<dos.h>


  //void sound(unsigned frequency);
 //void delay(unsigned milliseconds);
 //void nosound(void);


 class TMyWin : public TFrameWindow
 {
  TBitmap *pbitmap1,*pbitmap2,*pbitmap3,*pbitmap4,*pbitmap5,*pbitmap6,*pbitmap7,*pbitmap8,*gem1,*pbitmap10,*pbitmap11,*pbitmap12;
  public:
		 TMyWin():TFrameWindow(0,"Pacman")
		  {
	          }
private:
		 void SetupWindow();
		 void Animate_BOB();
		 void Animate_BOB2();
		 void Paint(TDC&,BOOL,TRect&);
		 void EvKeyDown(UINT key,UINT repeatCount,UINT flags);
		 void EvTimer(UINT);
		 bool lee(int ax,int ay,int bx,int by);
		 bool lee2(int ax,int ay,int bx,int by);

DECLARE_RESPONSE_TABLE(TMyWin);
};

  DEFINE_RESPONSE_TABLE1(TMyWin,TFrameWindow)
	EV_WM_KEYDOWN,
	EV_WM_TIMER,
  END_RESPONSE_TABLE;

void TMyWin::SetupWindow()
{

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

 /*for(i=0;i<N;i++)
	for(j=0;j<M;j++)
	  {
		grid[i][j]=g[i][j];
	  }*/
 do
  {
	i=rand()%N;
	j=rand()%M;
  }while(m[i][j]!=' ');
  STATE=NORTH;
  bitmap.x=j*20+2;
  bitmap.y=i*20+2;
  bitmap.f=0;
  i2=14;j2=19;
  STATE2=NORTH;
  bitmapEnemy.x=j2*20+2;
  bitmapEnemy.y=i2*20+2;
  SetTimer(1,90);
  Invalidate();
}

void TMyWin::EvTimer(UINT)
{
//static int i2=14;
//static int j2=19;

static int s=0;
static int m=0;
static bool a=false;
int k;

int ax,ay,bx,by;


k=rand()%2;
if(k==0&&a==false)
{
a=false;
if(s>d)
 {


  do
  {
	 bx=j;
	 by=i;
	 /*else if(k==2)
		 {
		  bx=j-10;
		  by=i-10;
		 }*/
	}while(!lee(j2,i2,bx,by));

	s=1;
	a=true;
	m=0;
  }

  j2=px[s];
  i2=py[s];

  s++;

  bitmapEnemy.x=j2*20+2;
  bitmapEnemy.y=i2*20+2;

  }

else if(a==true)
 {
  a=true;
  if(m==0)
  {
  do
  {
  bx=j2;
  by=i2;

  ax=j;
  ay=i;
  }while(!lee2(ax,ay,bx,by));
  m=d;
  a=false;
  }

  bitmapEnemy.x=j2*20+2;
  bitmapEnemy.y=i2*20+2;
  }

  Animate_BOB2();
  Invalidate(FALSE);
}


bool TMyWin::lee(int ax,int ay,int bx,int by)
{
 const int WALL=-1;
 const int BLANK=-2;

 int grid[N][M];

 int dx[4]={1,0,-1,0};
 int dy[4]={0,1,0,-1};

 int x,y,k;
 int len;

 bool stop;

 for(y=0;y<N;++y)
  for(x=0;x<M;++x)
	grid[y][x]=(m[y][x]=='.')?WALL:BLANK;



 d=0;
 grid[ay][ax]=0;
 do
  {
	stop=true;
	for(y=0;y<N;++y)
	 for(x=0;x<M;++x)
	  if(grid[y][x]==d)
		{
		 for(k=0;k<4;++k)
		  {
			int iy=y+dy[k];
			int ix=x+dx[k];

			if(iy>=0&&iy<N&&ix>=0&&ix<M&&grid[iy][ix]==BLANK)
			  {
				stop=false;
				grid[iy][ix]=d+1;
			  }
			}
		  }
		 d++;
	}
	 while(!stop&&grid[by][bx]==BLANK);

if(grid[by][bx]==BLANK) return false;

len=grid[by][bx];
x=bx;
y=by;
d=len;

while(len>0)
{
 px[len]=x;
 py[len]=y;
 len--;

 for(k=0;k<4;++k)
  {
	int iy=y+dy[k],ix=x+dx[k];

	if(iy>=0&&iy<N&&ix>=0&&ix<M&&grid[iy][ix]==len)
	 {
	  x=x+dx[k];
	  y=y+dy[k];
	  break;
	 }
	}
 }

px[0]=ax;
py[0]=ay;

return true;

}

bool TMyWin::lee2(int ax,int ay,int bx,int by)
{
 const int WALL=-1;
 const int BLANK=-2;

 int grid[N][M];

 int dx[4]={1,0,-1,0};
 int dy[4]={0,1,0,-1};

 int x,y,k;
 int len;

 bool stop;

 for(y=0;y<N;++y)
  for(x=0;x<M;++x)
	grid[y][x]=(m[y][x]=='.')?WALL:BLANK;



 d=0;
 grid[ay][ax]=0;
 do
  {
	stop=true;
	for(y=0;y<N;++y)
	 for(x=0;x<M;++x)
	  if(grid[y][x]==d)
		{
		 for(k=0;k<4;++k)
		  {
			int iy=y+dy[k];
			int ix=x+dx[k];

			if(iy>=0&&iy<N&&ix>=0&&ix<M&&grid[iy][ix]==BLANK)
			  {
				stop=false;
				grid[iy][ix]=d+1;
				 if(grid[by][bx]==BLANK)
				  {i2=by;j2=bx;}
			  }
			}
		  }
		 d++;
	}
	 while(!stop&&grid[by][bx]==BLANK);

if(grid[by][bx]==BLANK) return false;

len=grid[by][bx];
x=bx;
y=by;
d=len;

while(len>0)
{
 px[len]=x;
 py[len]=y;
 len--;

 for(k=0;k<4;++k)
  {
	int iy=y+dy[k],ix=x+dx[k];

	if(iy>=0&&iy<N&&ix>=0&&ix<M&&grid[iy][ix]==len)
	 {
	  x=x+dx[k];
	  y=y+dy[k];
	  break;
	 }
	}
 }

px[0]=ax;
py[0]=ay;

return true;

}

void TMyWin::Animate_BOB()
{
 bitmap.f=!bitmap.f;

 //MessageBeep(MB_OK);
 sndPlaySound((LPSTR)"BEEP0.wav",SND_ASYNC);
 //sndPlaySound((LPSTR)"MENUITEM.wav",SND_ASYNC);
 //Beep(247,500);
 //Beep(497,500);
 //Sleep(500);
 //Beep(497,500);
 //sound(7);
 //delay(1000);
 //nosound();
 Invalidate(FALSE);
 /*bitmap.f=!bitmap.f;
 Invalidate();*/
}

void TMyWin::Animate_BOB2()
{
int i;
bitmapEnemy.f=!bitmapEnemy.f;

sndPlaySound((LPSTR)"BEEP1.wav",SND_ASYNC);

}

void TMyWin::EvKeyDown(UINT key,UINT /*repeatCount */,UINT /* flags */)
{

}

void TMyWin::Paint(TDC& dc,BOOL,TRect&)
{
 TRect rect;
 int i,j;

 TMemoryDC memDC(dc);


 for(i=0;i<N;i++)
  for(j=0;j<M;j++)
	{
	 if(m[i][j]=='.')
	  {
		TBrush brGreen(TColor::LtGreen);
		dc.FillRect(j*20,i*20,j*20+20,i*20+20,brGreen);
	  }
	 if(m[i][j]==' ')
	  {
		TBrush brBlack(TColor::Black);
		dc.FillRect(j*20,i*20,j*20+20,i*20+20,brBlack);
	  }
	  if(m[i][j]=='*')
		{
		 //TBrush brBlack(TColor::Black);
		 //dc.FillRect(j*10,i*10,j*10+10,i*10+10,brBlack);
		 memDC.SelectObject(*gem1);
		 dc.StretchBlt(j*20,i*20,20,20,memDC,127,80,36,36,SRCCOPY);
		}
	 }

	if((bitmap.x==bitmapEnemy.x)&&(bitmap.y==bitmapEnemy.y))
	 {
	  life=false;
	  }
	if(!life)
	{
	 lives--;
	 life=true;
	 memDC.SelectObject(*pbitmap12);
	 dc.StretchBlt(bitmap.x-1,bitmap.y-1,20,20,memDC,0,1,306,258,SRCCOPY);
	 sndPlaySound((LPSTR)"ammopu.wav",SND_ASYNC);

//	 SetTimer(1,50);

	 if(lives<=0)
	  {
		exit(1);
	  }
		else
		{
		i2=14;j2=19;
		d=-1;
		bitmapEnemy.x=j2*20+2;
		bitmapEnemy.y=i2*20+2;
		SetTimer(1,90);
		}

	 }
	
	wsprintf(buf,"LIVES=%d",lives);
	dc.TextOut(400,600,buf);

	wsprintf(buf,"score=%d",score);
	dc.TextOut(400,700,buf);

 }


 class TMyApp : public TApplication
 {
  public:
		 TMyApp():TApplication(){};
  private:
		 void InitMainWindow()
			{
			 MainWindow=new TMyWin();
			}
  };

 int OwlMain(int,char*[])
 {
 TMyApp app;
 return app.Run();
 }

Последний раз редактировалось BDA; 12.08.2022 в 06:29.
Timurkh77 вне форума Ответить с цитированием
Старый 12.08.2022, 07:36   #76
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,849
По умолчанию

Перечитал тему. Странно, что противник догонял быстро - я упустил из виду, что маршрут строился один раз до игрока, а потом противник шел по маршруту, пока не дойдет до этого старого места, а если игрок шевелился, то это не учитывается. Последний код не запускал, но не пойму, как lee2 может помочь противнику убегать, ведь, грубо говоря, позиция противника просто остается исходной.
Цитата:
Сообщение от Timurkh77 Посмотреть сообщение
почему-то не идет на встречу?
Может быть шанс 50%, что он пойдет на встречу, маловат? А еще lee2 в текущем виде "портит" значения d и px, так что при возврате к стратегии преследования игрока обязательно нужно опять вызвать lee. И зачем переключать стратегии преследования/убегания на каждом тике таймера?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с загрузкой звука в игре типа 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