cocos2d x游戏开发系列教程 坦克大战游戏之敌方坦克AI的编写

本文详细介绍了如何构建敌方坦克的人工智能(AI),包括敌方坦克的生成、行为控制和射击逻辑。通过控制坦克数量、移动方向及射击频率,实现了基本的坦克AI功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

在上篇我们完成了子弹和地图碰撞的检测,在这篇我们将完成敌方坦克AI的编写。

具体思路是屏幕中保持有四个敌方坦克,然后坦克随机方向运动,并且子弹消失后1秒发射一次

1.我们新建一个敌方坦克的AI类来控制地方坦克AI行为:

static const char* enemyTankType[] = { "normalU.png", "speedU.png", "armor1U.png"};class EnemyAI{public: EnemyAI(); ~EnemyAI(); static EnemyAI* createEnemyAIWithTank(Tank* tank)void initEnemyAIWithTank(Tank* tank)void update(float delta);privatevoid addTank(float delta)void tankAction(float delta);private: CCArray* mEnemyTanks; Tank* mTank; TileMapInfo* mTileMapInfo; //出现地点 CCPoint bornPoint[3];};
上面目前只添加三种类型的敌方坦克,

在成员变量中,mEnemyTanks存放了所有的坦克,

mTank存放了玩家坦克,最后mTileMapInfo存放了地图信息。

bornPoint存放了敌方坦克出身的三个位置。


2.先实现void EnemyAI::initEnemyAIWithTank(Tank* tank)来初始化我们的EnemyAI类:

void EnemyAI::initEnemyAIWithTank(Tank* tank){ mTank = tank; mTileMapInfo = tank->getTileMapInfo(); mEnemyTanks = CCArray::createWithCapacity(4); mEnemyTanks->retain(); //初始化出现地点 CCSize mapSize = mTileMapInfo->getTileMap()->getContentSize(); CCSize tileSize = mTileMapInfo->getTileMap()->layerNamed("layer_0")->getMapTileSize(); bornPoint[0] = ccp(tileSize.width, mapSize.height - tileSize.height); bornPoint[1] = ccp(mapSize.width / 2, mapSize.height - tileSize.height); bornPoint[2] = ccp(mapSize.width - tileSize.width, mapSize.height - tileSize.height);}
在上面我们初始化了敌方坦克出身的三个地点,然后创建了一个容量为4的数组mEnemyTanks来存放敌方坦克对象。

3.再实现静态方法返回EnmeyAI类指针:

EnemyAI* EnemyAI::createEnemyAIWithTank(Tank* tank){ EnemyAI* enemyTank = new EnemyAI(); enemyTank->initEnemyAIWithTank(tank); return enemyTank;}

4.实现void EnemyAI::addTank(float delta):

其中delta是每一帧调用之间的事件间隔

void EnemyAI::addTank(float delta){ static float deltaTimes = 0.0f; deltaTimes += delta; if (deltaTimes >= 2.0f) {  deltaTimes = 0.0f;  int count = mEnemyTanks->count();  if (count < 3//先从固定位置添加三个坦克  {   Tank* enemyTank = Tank::createTankWithTankType(enemyTankType[count], mTileMapInfo);   enemyTank->setPosition(bornPoint[count]);   enemyTank->setRotation(180.0f);   mEnemyTanks->addObject(enemyTank);  }  else if (count == 3//第四个坦克随机添加  {   int tankTypeIndex = (int)(CCRANDOM_0_1() * 4) % 3;   Tank* enemyTank = Tank::createTankWithTankType(enemyTankType[tankTypeIndex], mTileMapInfo);   enemyTank->setPosition(bornPoint[tankTypeIndex]);   enemyTank->setRotation(180.0f);   mEnemyTanks->addObject(enemyTank);  } }}

可以看到deltaTimes累加时间,超过2秒就开始添加坦克,初始三个坦克从固定位置添加,

然后第四个坦克随机位置添加。


5.实现void EnemyAI::tankAction(float delta),来控制坦克行为:

void EnemyAI::tankAction(float delta){ CCObject* pObj; CCARRAY_FOREACH(mEnemyTanks, pObj) {  Tank* tank = (Tank*)pObj;  //坦克自动移动,碰到墙壁自动换方向  int Rotation = tank->getRotation();  if (!tank->command((enumOrder)(Rotation / 90 + 1)))  {   int n = (int)(CCRANDOM_0_1() * 5) % 5;   if (n != 0)    tank->command((enumOrder)n);  }  //每隔一秒开一次火  tank->setBulletDelta(tank->getBulletDelta() + delta);  if (tank->getBulletDelta() > 0.5)  {   //开火后,如果子弹在飞行中,归零计时   if (tank->command(cmdFire))   {    tank->setBulletDelta(0.0);   }  } }}
从mEnemyTanks中遍历坦克对象,然后向固定方向移动,遇到墙壁则随机换方向移动。

在下面,子弹消失后,隔0.5秒再次发射子弹。


6.最后实现我们的void EnemyAI::update(float delta),它会在每一帧切换的时候被调用。

void EnemyAI::update(float delta){ //坦克不足4个,补充坦克 addTank(delta); //坦克行为控制 tankAction(delta);}

可以看到,简单的调用添加坦克函数和控制坦克行为函数。


7.下面我们把敌人的AI类整合到CityScene场景中:

bool  CityScene::init(){ CCLayer::init(); //初始化地图信息 char szRound[260]; sprintf(szRound, "Round%d.tmx", mRound); TileMapInfo* tileMapInfo = TileMapInfo::createMapInfoWithFile(szRound); CCTMXTiledMap* tmxTileMap = tileMapInfo->getTileMap(); this->addChild(tmxTileMap); //在已有的地图上,创建玩家坦克 mPlayerTank[0] = Tank::createTankWithTankType("player2U.png", tileMapInfo); //放到地图中初始化位置 CCSize tileSize = tmxTileMap->getTileSize(); CCSize mapSize = tmxTileMap->getContentSize(); mPlayerTank[0]->setPosition(ccp(mapSize.width / 2 - tileSize.width * 3, tileSize.height)); //添加虚拟手柄的显示 mLayerPanel = Panel::create(); addChild(mLayerPanel, 3); //创建敌人坦克的AI mEnemyAI = EnemyAI::createEnemyAIWithTank(mPlayerTank[0]); return true;}

 //创建敌人坦克的AI
 mEnemyAI = EnemyAI::createEnemyAIWithTank(mPlayerTank[0]);

可以看到最后面创建了我们的AI。


8.我们在场景的update中调用AI的update函数

void CityScene::update(float delta){ CCLayer::update(delta); //将控制面板中的mLayerPanel获取的命令传给坦克 if (mPlayerTank[0] != NULL)  mPlayerTank[0]->command(mLayerPanel->getOrder()); //调用敌人AI的update mEnemyAI->update(delta);}

到这里基本的坦克AI构建完成,我们运行下看看效果:



完整代码下载地址:

http://download.youkuaiyun.com/detail/yincheng01/6764095

           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值