?? 關于掉物品的算法設計.txt
字號:
關于掉物品/金錢的算法
==========================================================
冷紫龍 2003-11-13
功能要求:
========
1、每種怪都有可能掉某些特定類型的物品,掉每種物品都有特定的概率;
2、怪物掉物品可以有普通、小爆、中爆、大爆等幾種方式,具體的每種方式如何掉物品、掉多少物品需要與策劃討論確認
數據庫表要求:
============
1、修改cq_monstertype表
1)將drop_money和drop_itemtype字段分別改為:
drop_money_min //所掉金錢的下限
drop_money_max //所掉金錢的上限
★爆怪的時候如果有掉錢,則掉的金錢為正常的1.6倍
2)增加字段
drop_money_chance //掉錢的概率 ——需要確認是否與掉物品一起處理
drop_item_chance //掉物品的概率 掉1個物品
explode_item_chance1 //小爆的概率 掉2 - 5個物品
explode_item_chance2 //中爆的概率 掉6 - 9個物品
explode_item_chance3 //大爆的概率 掉10 - ?個物品
drop_item_rule //掉物品的規則組id
★★掉(爆)物品的數量如何計算?固定值還是某個固定范圍內浮動(如上↑)
用于計算掉金錢的概率以及掉多少錢,避免大量的零碎銀子產生
drop_item_chance 用于計算是否掉物品,如果drop_item_rule存在并且計算出來掉物品,才執行掉物品函數
drop_item_rule 指向DropItemRule表中的某個規則組
2、增加cq_dropitemrule表
cq_dropitemrule表結構:
---------------------------------------------------------------------------------------------------------
| 字段名 | 類型 | 說明 |
---------------------------------------------------------------------------------------------------------
| id | INT(4) UNSIGNED zerofill NOT NULL | 規則組ID |
| RuleId | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | 規則ID |
| Chance | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0001' | 掉寶概率(1 / Chance) |
| Item0 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | 物品類別id |
| Item1 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item2 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item3 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item4 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item5 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item6 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item7 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item8 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item9 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item10 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item11 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item12 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item13 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
| Item14 | INT(4) UNSIGNED zerofill NOT NULL DEFAULT '0000' | |
---------------------------------------------------------------------------------------------------------
PRIMARYKEY(id, RuleId)
該表中記錄了若干組掉物品的規則,cq_monstertype表中每個記錄可以對應最多一個規則組,每組規則由若干條規則(記錄)組成,每條記錄包括掉寶的概率以及最多15個ItemType(若同一種掉寶幾率對應的不止15種物品,可以分多條記錄保存,處理的時候統一處理)。
★★可以有一個默認的規則組:規則組id=0,不掉任何物品
算法設計:
========
掉物品概率計算:
1、根據monstertype表的drop_item_chance、explode_item_chance1、explode_item_chance2、explode_item_chance3字段值計算是否掉物品、掉幾個物品,如果計算結果不掉,或者drop_item_rule不存在,則退出;
2、根據dropitemrule表的Probability字段,按照概率從低到高計算是否掉物品,如果計算出來掉落某條規則的物品,則從該規則的物品列表中隨機選擇一個,重復以上步驟直到找到足夠數量的物品(爆的時候物品數大于1)。
★★按照掉物品的概率從低到高計算,會導致降低高概率物品的實際概率值。
例如:某個規則組有10%和50%兩個概率的規則,則50%的規則實際概率為(100 - 10)% * 50% = 45%
內存中規則的存儲格式:
應該以規則組id為鍵存儲規則組,每個規則組又分別以規則id存儲各自的規則
★★??是否考慮把所有概率相同的規則合并為一條
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -