⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ai.cpp

📁 坦克大战的源代码~做的很好~很适合研究~~不错~
💻 CPP
字号:
// Ai.cpp: implementation of the CAi class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Ai.h"
#include "常数定义.h"
#include<stdlib.h>
#include<time.h>
#include "Tank.h"
#include "Player.h"
#include "Control.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


CAi::CAi()
{
    goback=false;
}

CAi::~CAi()
{

}

bool CAi::HitWallTest(POINT &ScreenXY , short &way , int n)
{
	SetHit(ScreenXY, way);
	
   int X1,Y1,X2,Y2,X3,Y3;  
   X1 =( p1.x -GAMET_X)/ 16;                  
   Y1 =( p1.y)/ 16;  
   X2 =( p2.x -GAMET_X)/ 16;                  
   Y2 =( p2.y)/ 16; 
   X3 =( p3.x -GAMET_X)/ 16;                  
   Y3 =( p3.y)/ 16; 
   if(Map[X1][Y1]==1 || Map[X1][Y1]==2){return  true;}
   if(Map[X2][Y2]==1 || Map[X2][Y2]==2){return  true;}
   if(Map[X3][Y3]==1 || Map[X3][Y3]==2){return  true;}
   if(Map[X1][Y1]==4 || Map[X1][Y1]==5)
   {
	   if(tank[n].OnShip){return  false;}
	   else{return  true;}
   }
   if(Map[X2][Y2]==4 || Map[X2][Y2]==5)
   {
	   if(tank[n].OnShip){return  false;}
	   else{return  true;}
   }
   if(Map[X3][Y3]==4 || Map[X3][Y3]==5)
   {
	   if(tank[n].OnShip){return  false;}
	   else{return  true;}
   }
	return  false;
}

short CAi::GetWay(POINT &ScreenXY , short way , int n)
{	
	POINT  EP;
	EP.x=ScreenXY.x+16;
	EP.y=ScreenXY.y+16;

	if(HitWallTest(ScreenXY,way,n))  //撞墙时追踪玩家
	{
		Back(ScreenXY , way , n);
	    if(n!=0)
        {
			way=Rando(way);
			return Scout(EP,g_Center,way);  
		}  
	}

	if(HitSharpTest(way, n))  
	{	
	    if(n!=0)
        {
			tank[0].ScreenXY.x=ScreenXY.x;
			tank[0].ScreenXY.y=ScreenXY.y;
			Back(ScreenXY, way , n);
			return Rando(way);
		} 

	}

    if(ddraw.StartDoopTest)
	{
		if(HitDoopTest()){ddraw.StartDoopTest=false;}
	}


    short f=way;

	return  f;
}

short CAi::Scout(POINT Eheat ,POINT Pheart,short &way)
{
	short f=way;

    if(Eheat.x<Pheart.x && Eheat.y<Pheart.y)  //敌方在我方左上
	{
		if(Pheart.x-Eheat.x<16){f=1;}
		if(Pheart.y-Eheat.y<16){f=2;}
		if(Pheart.x-Eheat.x>16 && Pheart.y-Eheat.y>16){f=2;}
	}  
    if(Eheat.x<Pheart.x && Eheat.y>Pheart.y)  //敌方在我方左下
	{
		if(Pheart.x-Eheat.x<16){f=3;}
		if(Eheat.y-Pheart.y<16){f=2;}
		if(Pheart.x-Eheat.x>16 && Eheat.y-Pheart.y>16){f=2;}
	}
    if(Eheat.x>Pheart.x && Eheat.y>Pheart.y)  //敌方在我方右下
	{
		if(Eheat.x-Pheart.x<16){f=3;}
		if(Eheat.y-Pheart.y<16){f=4;}
		if(Eheat.x-Pheart.x>16 && Eheat.y-Pheart.y>16){f=4;}
	}
    if(Eheat.x>Pheart.x && Eheat.y<Pheart.y)  //敌方在我方右上
	{
		if(Eheat.x-Pheart.x<16){f=1;}
		if(Pheart.y-Eheat.y<16){f=4;}
		if(Eheat.x-Pheart.x>16 && Pheart.y-Eheat.y>16){f=4;}
	}
	
	return  f;
}

short CAi::Rando(short &way)
{
	 short r;
     srand((unsigned)time(NULL));    //产生随机数种子            
     do
	 {
        r=rand() % 4+1;             //r的范围在1~4间
	 }while(r==way);
     return r;
}

void CAi::Back(POINT &ScreenXY, short &way ,short n)
{
	if(tank[n].MoveStop){return;}
   switch (way) 
   {
   case 1:
       ScreenXY.y-=tank[n].MoveSpeed;
	   break;
   case 2:
       ScreenXY.x-=tank[n].MoveSpeed;
	   break;
   case 3:
       ScreenXY.y+=tank[n].MoveSpeed;
	   break;
   case 4:
       ScreenXY.x+=tank[n].MoveSpeed;
	   break;
	default :
		break;
   }
}

bool CAi::HitSharpTest(short &way, int n)
{
	RECT RT,rc;
    rc=tank[0].m_rect=player.GetTankRect();

	for(i=1;i<11;i++)
	{
		if(i==n ){continue;} //自己不检测
		if(!tank[i].dead)
		{
			tank[i].GetTankRect();
			if(IntersectRect(&RT,&tank[i].m_rect,&tank[n].m_rect)!=0)
			{return  true;}	
		}
	}
	if(IntersectRect(&RT,&tank[n].m_rect,&rc)!=0)
	{return  true;}	


	return  false;
}

void CAi::SetHit(POINT ScreenXY,short way)
{
   switch (way) //决定碰撞点(缩小碰撞点范围)
   {
   case 1:
       p1.x=ScreenXY.x+4  ,  p1.y=ScreenXY.y+28;
	   p2.x=ScreenXY.x+28 ,  p2.y=p1.y;
	   p3.x=ScreenXY.x+16 ,  p3.y=p1.y;
	   break;
   case 2:
       p1.x=ScreenXY.x+28 ,  p1.y=ScreenXY.y+28;
	   p2.x=p1.x  ,          p2.y=ScreenXY.y+4;
	   p3.x=p1.x  ,          p3.y=ScreenXY.y+16;
	   break;
   case 3:
       p1.x=ScreenXY.x+28 ,  p1.y=ScreenXY.y+4;
	   p2.x=ScreenXY.x+4  ,  p2.y=p1.y;
	   p3.x=ScreenXY.x+16 ,  p3.y=p1.y;
	   break;
   case 4:
       p1.x=ScreenXY.x+4  ,  p1.y=ScreenXY.y+4;
	   p2.x=p1.x  ,          p2.y=ScreenXY.y+28;
	   p3.x=p1.x  ,          p3.y=ScreenXY.y+16;
	   break;
   }
}

bool CAi::HitDoopTest()
{
	RECT RT,rc;
    if(ddraw.PutDoop==0){return false;}
	else if(ddraw.PutDoop==2)
	{
		for(j=0;j<20;j++)
		{
			rc.left=ddraw.doops[j].x;
			rc.top=ddraw.doops[j].y;
			rc.right=rc.left+48;
			rc.bottom=rc.top+48;
			if(IntersectRect(&RT,&tank[0].m_rect,&rc)!=0)
			{
                tank[0].blood-=8;
				if(tank[0].blood==0)
				{
					tank[0].dead=true;
					tank[0].BoomNow=true;
				}
                return  true;
			}
		}
	}
	else
	{
		for(i=1;i<11;i++)
		{
			if(!tank[i].dead)
			{
				tank[i].GetTankRect();
				for(j=0;j<20;j++)
				{
					rc.left=ddraw.doops[j].x;
                    rc.top=ddraw.doops[j].y;
					rc.right=rc.left+48;
					rc.bottom=rc.top+48;
					if(IntersectRect(&RT,&tank[i].m_rect,&rc)!=0)
					{
					    tank[i].blood-=8;
				        if(tank[i].blood==0)
						{
					        tank[i].dead=true;
					        tank[i].BoomNow=true;
						}
                        return  true;
					}	
				}
			}
		}	
	}

	return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -