無聊寫的小東西 是以c/c++寫出來的演算法設計
有興趣的看完可以討論
將單位 區分成兩個隊伍
然後所有單位都加入 排程管理
當其中一方隊伍人數少於判定 則分出勝負
若無則 依照優先權 攻擊 > 鎖敵 > 移動 進行活動
多陣營 跟雙陣營最基本的差異 在鎖敵(搜尋)
我們知道 A隊跟B隊的總合 會等於全部C
所以為了節省每次搜尋查找的判斷次數
可以採用兩個vector(容器)去存放A, B兩隊
並且在Unit的屬性中告知敵人是哪一隊
在搜尋時 就可以節省一半的判斷次數 加快效能
(ex:1000 vs 1000)
因為這個設計 只針對2個陣營的狀況 因此不適合多陣營
多陣營的話 請參考 另一個設計
-------------------------------------------------------------------------------------------------
vector<Unit*> vUnitGroup, vTeamA, vTeamB; //建立A, B, C的容器
Unit teamA1, teamA2, teamB1, teamB2; //產生單位
teamA1.setEnemy(&vTeamB);
//...單位 註冊敵方為何..etc
vTeamA.push_back(&teamA1);
//單位加入各自隊伍 ...etc
vUnitGroup.push_back(&teamA1);
//單位加入main loop排程管理 ...etc
while(true)
{
vector<Unit*>::iterater iter;
for(iter = vUnitGroup.begin(); iter< vUnitGroup.end();iter++)
{
Unit* pUnit = *iter;
if(pUnit->isDead())//掛了
{
vUnitGroup.earse(iter);//掛了就從排程中移除
if(vTeamA.size() == 0 || vTeamB.size() == 0 )
{
showWinLose();//戰鬥結束
break;
}
iter--;
}
else//還活著
{
if(pUnit->isAttack())//戰鬥中
{
pUnit->attackTarget();//攻擊當前目標
}
else
{
float fEnemyDis(-1);//單位與敵方的距離
Unit* pTarget(NULL);
//取得單位鎖敵範圍
float fSearchRange = pUnit->getSearchRange();
vector<Unit*> *vEnemy = pUnit->getEnemy();
for(int i=0; i<vEnemy->size(); i++)
{
float tmpDis = pUnit->getDis(vEnemy[i]);
if( tmpDis <= fSearchRange ) //目標在鎖敵範圍內
{
if(fEnemyDis < 0 || tmpDis < fEnemyDis)
{
fEnemyDis = tmpDis;
pTarget = vEnemy[i];
}
}
}
if(pTarget)//有攻擊目標
{
pUnit->setAttackTarget(pTarget);//設定攻擊目標
}
else
{
pUnit->move();//沒事 自己走自己
}
}//end 非戰鬥
}//end 還活著
}//end 排程管理
sleep(1000);
}