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