日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

013 自动吃药功能的设计和实现

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 自动吃药功能的设计和实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。