創作內容

3 GP

[程式設計] 戰鬥流程管理設計 for 雙陣營

作者:夜下月│2013-03-08 17:46:43│巴幣:6│人氣:419

無聊寫的小東西  是以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 f
SearchRange = 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);
}
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=1927873
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:程式設計|C++

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

3喜歡★ponderzs 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:[程式設計]C++ Pr... 後一篇:[遊戲] 模擬城市5 購...

追蹤私訊切換新版閱覽

作品資料夾

d88931122所有巴友
歡迎諸君來參觀老僧的小屋,內含Steam與Google Play遊戲、3D角色模組、Line貼圖看更多我要大聲說昨天20:54


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】