014 怪物过滤的设计和实现
文章目錄
- 怪物過濾的設(shè)計(jì)
之前我們已經(jīng)完成了自動(dòng)打怪,自動(dòng)技能和自動(dòng)吃藥的功能。接下來需要實(shí)現(xiàn)自動(dòng)任務(wù)。那么現(xiàn)在就會(huì)遇到這么一個(gè)問題,大部分的任務(wù)都是指定去打某些怪物,但是我們的自動(dòng)打怪都是默認(rèn)攻擊最近的怪物,這里就需要用到怪物過濾的功能了。
怪物過濾的設(shè)計(jì)
新建一個(gè)類,命名為MonsterFilter
//過濾的列表 vector<wstring> m_FilterList;首先準(zhǔn)備一個(gè)過濾的怪物列表,把不需要攻擊的怪物放到這個(gè)列表里 。
//攻擊的列表 vector<wstring> m_AttackList;然后準(zhǔn)備一個(gè)攻擊的怪物列表,把需要攻擊的怪物全部存放到這個(gè)容器里。兩個(gè)列表是互斥的,如果設(shè)置了過濾列表就不使用攻擊列表;設(shè)置了攻擊列表就不使用過濾列表。
//添加攻擊列表void AddAttackList(wstring MonsterName);//添加過濾列表void AddFilterList(wstring MonsterName);然后聲明兩個(gè)函數(shù),一個(gè)添加攻擊列表,一個(gè)添加過濾列表。
//刷新匹配的怪物void UpdateMonsters(_stuObjs& MonsterList);然后準(zhǔn)備一個(gè)函數(shù)用來刷新怪物列表,把不滿足條件的怪物 刪除。這個(gè)列表需要被實(shí)時(shí)修改,所以傳入引用。
//清空所有數(shù)據(jù) void ClearAllData();再準(zhǔn)備一個(gè)函數(shù)用來清空所有數(shù)據(jù)。MonsterFilter.h完整代碼如下:
#pragma once #include "pch.h" class MonsterFilter { public://添加攻擊列表void AddAttackList(wstring MonsterName);//添加過濾列表void AddFilterList(wstring MonsterName);//刷新匹配的怪物void UpdateMonsters(_stuObjs& MonsterList);//清空所有數(shù)據(jù)void ClearAllData();public://過濾的列表vector<wstring> m_FilterList;//攻擊的列表vector<wstring> m_AttackList; };代碼實(shí)現(xiàn)
//添加攻擊列表 void MonsterFilter::AddAttackList(wstring MonsterName) {//遍歷攻擊列表for (auto obj: m_AttackList){//如果當(dāng)前容器中已經(jīng)有需要添加的怪物 直接退出if (obj== MonsterName){return;}}//如果沒有在容器中找到需要攻擊的怪物 則添加到容器m_AttackList.push_back(MonsterName);}//添加過濾列表 void MonsterFilter::AddFilterList(wstring MonsterName) {//遍歷攻擊列表for (auto obj : m_FilterList){//如果當(dāng)前容器中已經(jīng)有需要添加的怪物 直接退出if (obj == MonsterName){return;}}//如果沒有在容器中找到需要攻擊的怪物 則添加到容器m_FilterList.push_back(MonsterName); }//清空所有數(shù)據(jù) void MonsterFilter::ClearAllData() {m_AttackList.clear();m_FilterList.clear(); }添加列表和清空列表的代碼都比較簡(jiǎn)單,關(guān)鍵在于怎么將怪物列表中不滿足條件的怪物刪除。
//判斷怪物是否需要攻擊(在攻擊列表或者不在過濾列表)BOOL CheckNeedAttack(wstring MonsterName);新增一個(gè)函數(shù),判斷當(dāng)前怪物是否需要攻擊,判斷是否需要攻擊的條件是在攻擊列表或者不在過濾列表,代碼實(shí)現(xiàn)如下:
//判斷是否是需要攻擊的怪物 BOOL MonsterFilter::CheckNeedAttack(wstring MonsterName) {//攻擊列表不存在if (m_AttackList.size()==0){//遍歷過濾列表for (auto obj:m_FilterList){//如果在過濾列表if (obj== MonsterName){//說明這個(gè)怪物是需要過濾掉的 不需要被攻擊 所以返回FALSEreturn FALSE;}}//遍歷完成 說明不存在過濾列表 返回TRUEreturn TRUE;}else{//遍歷攻擊列表 邏輯和上面相反for (auto obj : m_AttackList){if (obj == MonsterName){return TRUE;}}return FALSE;} }然后再實(shí)現(xiàn)刪除不符合要求的怪物列表
//刷新匹配的怪物 把不滿足條件的怪物刪除 void MonsterFilter::UpdateMonsters(_stuObjs& MonsterList) {for (auto it=begin(MonsterList.m_data);it!=end(MonsterList.m_data);it++){//如果不符合條件 則刪除if (CheckNeedAttack(it->m_Name)==FALSE){MonsterList.m_data.erase(it);}} }這樣我們就完成了怪物過濾的設(shè)計(jì)了。使用的時(shí)候只需要傳入任務(wù)需要攻擊的怪物,就能實(shí)現(xiàn)自動(dòng)攻擊任務(wù)怪物。
在GlobalData加一個(gè)全局的類對(duì)象
然后在自動(dòng)打怪線程過濾怪物。需要過濾的怪物我們?cè)诮尤蝿?wù)的時(shí)候去添加,這里當(dāng)前的過濾列表是空的,也不影響整個(gè)代碼流程。
下一篇我們開始找自動(dòng)任務(wù)需要的數(shù)據(jù)。
Github:https://github.com/TonyChen56/GameReverseNote
完整代碼:https://download.csdn.net/download/qq_38474570/79498815
總結(jié)
以上是生活随笔為你收集整理的014 怪物过滤的设计和实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 013 自动吃药功能的设计和实现
- 下一篇: 015 已接任务链表和任务库二叉树遍历