加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
AI.cpp 3.37 KB
一键复制 编辑 原始数据 按行查看 历史
SadLava 提交于 2022-05-08 17:08 . first update
/* 生存模式下AI */
inline void AI1( role & tr, role player )
{
const int wc = 2; /* 误差,越小难度越大 */
float ar;
if ( tr.type == PLANET )
return;
if ( !tr.blasting ) {
if ( tr.type == LOVE ) {
tr.r -= PI / 180 * 2;
return;
}
ar = calcR( tr.x, tr.y ) + (random( wc ) - (wc - 1) * 2) * PI / 180;
if ( fabs( tr.x - pX ) * fabs( tr.x - pX ) + fabs( tr.y - pY ) * fabs( tr.y - pY ) < (min( getwidth(), getheight() ) / 2) * min( getwidth(), getheight() ) / 2 ) {
tr.subV();
if ( tr.v < 0 )
tr.v = 0;
tr.addBullet();
} else {
tr.move();
tr.addV();
}
if ( tr.r < ar )
tr.turnL();
else
tr.turnR();
tr.getnew();
}
}
enum AIStates {
AIRAND,//随机移动
AIFIND,//收到信息,开始寻找玩家
AIRUNAWAY,//逃跑
AICATCH,//发现并追逐玩家
};
/* 标准模式下AI(智能AI) */
int AItW = 0;
bool AIFind=false;//玩家是否被发现
int fX,fY;//玩家被发现时的位置
inline void AI2( role & tr, role player )
{
float ar;
//普通AI
if ( tr.type == PLANET || tr.type == CLOUD)
return;
if ( tr.type == LOVE ) {
tr.r -= PI / 180 * 2;
return;
}
//复杂AI
if ( !tr.blasting ) {
//更新AI状态
if(AIFind) {
tr.AIState=AIFIND;
}
if ( ( tr.x - pX ) * ( tr.x - pX ) + ( tr.y - pY ) * ( tr.y - pY ) < AISR * AISR ) {
/* 发现 */
if ( tr.life < SDATA.life[tr.type]/5 ) {
/* 打不过,逃跑 */
tr.AIState=AIRUNAWAY;
} else {
tr.AIState=AICATCH;
}
} else {
tr.AIState=AIRAND;
}
if(player.mV) tr.AIState=AIRUNAWAY;
//执行AI
switch(tr.AIState) {
case AIRAND: {
/* 随机移动 */
if ( AItW == 0 ) {
if ( random( 100 ) > 50 ) {
AItW = 50;
} else AItW = -50;
}
if ( AItW > 0 ) {
tr.turnL();
AItW--;
} else {
tr.turnR();
AItW++;
}
tr.move( (random( 2 ) == 0) );
tr.v = SDATA.maxV[tr.type] / 4;
tr.getnew();
break;
}
case AIFIND: {
ar=calcR(fX-tr.x+pX,fY-tr.y+pY);
if ( tr.r < ar )
tr.turnL( );
else
tr.turnR( );
tr.move();
tr.addV();
break;
}
case AIRUNAWAY: {
ar = calcR( tr.x, tr.y );
if ( tr.r < ar )
tr.turnR( 1 );
else
tr.turnL( 1 );
tr.move(1);
tr.addV();
break;
}
case AICATCH: {
//汇报消息
AIFind=true;
fX=pX;
fY=pY;
tr.addBullet();
ar = calcR( tr.x, tr.y );
if ( tr.r < ar )
tr.turnL( );
else
tr.turnR( );
tr.addV();
tr.move(1);
break;
}
}
tr.getnew();
}
}
//非战斗机型AI
inline void AI3( role & tr, role player )
{
const int wc = 0; /* 误差,越小难度越大 */
float ar;
if ( tr.type == PLANET )
return;
if ( !tr.blasting ) {
if ( fabs( tr.x - pX ) * fabs( tr.x - pX ) + fabs( tr.y - pY ) * fabs( tr.y - pY ) < max( getwidth(), getheight() ) * max( getwidth(), getheight() ) ) {
/* 打不过,逃跑 */
if ( AItW < 150 ) {
tr.turnL( 1 );
AItW++;
} else if ( AItW > 150 ) {
tr.turnR( 1 );
AItW--;
}
tr.move( 1 );
} else {
/* 随机移动 */
if ( AItW == 0 ) {
if ( random( 100 ) > 50 ) {
AItW = 50;
} else AItW = -50;
}
if ( AItW > 0 ) {
tr.turnL();
AItW--;
} else {
tr.turnR();
AItW++;
}
tr.move( (random( 2 ) == 0) );
tr.v = SDATA.maxV[tr.type] / 4;
tr.getnew();
}
tr.getnew();
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化