013 自动吃药功能的设计和实现
文章目錄
- 功能設計
- 藥品表設計
- 代碼實現
- 補充
之前我們已經完成了自動打怪和自動技能的功能,但是會存在一個問題,當技能釋放多了以后,MP就不夠了。這個時候我們就需要通過自動吃藥的功能,給前兩個功能持續輸出動力。
功能設計
自動吃藥的邏輯和自動技能的邏輯思想一樣,都是通過建表的思想,判斷各種條件,篩選出當前最適合的一個藥品,然后調用吃藥call。
現在假設有三種藥
藥1 回血100 1級 藥2 回血500 10級 藥3 回血1000 20級當角色在1-10級的時候只需要使用藥1即可;在10-20級的時候,優先使用藥2,藥1的優先級低于藥1;在20-30級的時候,藥3的優先級大于藥2大于藥1
1-10級 藥1 10-20級 藥2和藥1 20-30級 藥3和藥2和藥1根據上面設計的方法,就可以按照角色等級,當前的HP和MP來對藥品設計一個權值
角色等級1-10級 藥1 HP 0-40% 權值50角色等級11-20 藥2 HP 0-40% 權值60 藥1 HP 30-60% 權值50角色等級21-30 藥3 HP 0-40% 權值70 藥2 HP 30-50% 權值60 藥1 HP 50-60% 權值50這里就可以在血量多的時候先吃小的藥,然后在血量少的時候吃大的藥,然后再將這套方法用代碼實現即可。
藥品表設計
首先新建一個UseItemManager類
//藥品使用詳情 struct _stuItemUseInfo {//藥品名字wstring m_name;//藥品類型EmDrugType m_drugtype;//權值int m_weight;//需求//自身條件 MP范圍_stuValRange m_MpRange;//等級范圍_stuValRange m_LevelRange; };接著創建一個藥品使用詳情結構體
enum EmDrugType {Em_回血,Em_回藍 };//范圍屬性 struct _stuValRange {//最小值int MinValue;//最大值int MaxValue; };還有藥品類型的宏定義,和范圍屬性結構體
//藥品管理 extern UseItemManager g_UserItemManager;接著在GlobalData.h中引入藥品管理的全局變量。
//藥品管理 UseItemManager g_UserItemManager;GlobalData.cpp中聲明
//藥品表 vector<_stuItemUseInfo> g_ItemList = {{/* 藥品名字*/L"魔法藥(小量)",/*藥品類型*/Em_回藍,/* 權重*/60,/*HP范圍*/{-1,-1},/*MP范圍*/{10,800},/*等級范圍*/{-1,-1}},{/* 藥品名字*/L"魔法藥(中量)",/*藥品類型*/Em_回藍,/* 權重*/70,/*HP范圍*/{-1,-1},/*MP范圍*/{10,700},/*等級范圍*/{0,0}},{/* 藥品名字*/L"強效魔法藥",/*藥品類型*/Em_回藍,/* 權重*/80,/*HP范圍*/{-1,-1},/*MP范圍*/{10,600},/*等級范圍*/{0,0}},{/* 藥品名字*/L"金創藥(小量)",/*藥品類型*/Em_回血,/* 權重*/60,/*HP范圍*/{50,150},/*MP范圍*/{-1,-1},/*等級范圍*/{-1,-1}},{/* 藥品名字*/L"金創藥(中量)",/*藥品類型*/Em_回血,/* 權重*/70,/*HP范圍*/{40,130},/*MP范圍*/{-1,-1},/*等級范圍*/{-1,-1}},{/* 藥品名字*/L"強效金創藥",/*藥品類型*/Em_回血,/* 權重*/80,/*HP范圍*/{30,100},/*MP范圍*/{-1,-1},/*等級范圍*/{-1,-1}}, };然后設計一個全局的藥品表,-1表示不判斷條件。
代碼實現
UseItemManager.h
class UseItemManager {//設置藥品數據void SetDrugData(vector<_stuItemUseInfo> drugdata);//獲取最優的使用的技能 傳入自身數據和目標數據_stuObj GetTheBestUseDrug(_stuObj role, _stuObj obj, _stuObjs druglist);public://藥品的使用數據表vector<_stuItemUseInfo> m_DrugList; };UseItemManager.cpp
#include "pch.h" #include "UseItemManager.h"void UseItemManager::SetDrugData(vector<_stuItemUseInfo> drugdata) {m_DrugList = drugdata; }_stuObj UseItemManager::GetTheBestUseDrug(_stuObj role, _stuObj obj, _stuObjs druglist) {//符合條件的藥品列表vector<_stuItemUseInfo> DataList;//遍歷技能列表 篩選出符合條件的技能for (auto &item : m_DrugList){//通過藥品名字返回技能對象auto DrugObj = druglist.GetDataByName(item.m_name);//技能名稱為空 跳過if (DrugObj.m_Name == L""){continue;}//-1表示不判斷if (item.m_HpRange.MinValue!=-1&& item.m_HpRange.MaxValue!=-1){//判斷血量是否在設置的范圍內if (!(role.m_Obj_HP > item.m_HpRange.MinValue&&role.m_Obj_HP < item.m_HpRange.MaxValue)){continue;}}//-1表示不判斷if (item.m_MpRange.MinValue != -1 && item.m_MpRange.MaxValue != -1){//判斷藍量是否在設置的范圍內if (!(role.m_Obj_MP > item.m_MpRange.MinValue&&role.m_Obj_MP < item.m_MpRange.MaxValue)){continue;}}//把符合的藥品存放到表里DataList.push_back(item);}//篩選出權重最高的藥品int NowValue = 0;_stuItemUseInfo ChooseDrug;for (auto drug : DataList){if (drug.m_weight > NowValue){//記錄當前藥品權重NowValue = drug.m_weight;//保存當前藥品對象ChooseDrug = drug;}}//返回權值最高的藥品return druglist.GetDataByName(ChooseDrug.m_name); }代碼和自動技能差不多,自動吃藥的邏輯也相對很簡單,就是循環判斷當前是否有符合條件的藥品,如果有,那么說明角色血量和藍量掉到了一定程度,就可以調用吃藥call進行補充了。一共也就幾行代碼,這里就不寫了。
這個游戲技能和藥品都沒有CD的概念,如果換到了別的游戲,則需要將CD的數據和條件考慮進去。
補充
最后,這個設計其實還有一個不完美的地方,就是判斷的血值范圍是用具體的數字,這樣每次人物等級提升的時候都需要重新修改,最好的方式是修改成百分比,這樣就不需要一直修改了。這個問題修改起來并不難,相信各位都可以自己完成。
Github:https://github.com/TonyChen56/GameReverseNote
完整代碼:https://download.csdn.net/download/qq_38474570/79498815
總結
以上是生活随笔為你收集整理的013 自动吃药功能的设计和实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 012 背包二叉树遍历分析和代码编写
- 下一篇: 014 怪物过滤的设计和实现