📄 ai.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 + -