JASS随机物品系统
系统功能:
系统说明:
使用方法,先(所有数据注册完成后的任意时间)执行RandomItemSystemInitialize,然后通过函数GetRandomItemType获得随机到的物品类型。 多等级物品的等级使用二进制方法记录,通过参数Key的二进制值的每位的值(0、1)来决定是否使用某个等级。你可以使用MakeLevelKey来添加等级、或者直接自己计算出结果添加到参数里。详细内容参考演示使用。 如果不需要在多个等级中随机,只会在全部物品或某一等级的物品中随机,请使用单等级版本。运算效率会更高。 多等级版本暂时最多支持定义30个等级(没有保护,请使用者自行注意)因为一个整数的数据量有限,如果需要更多等级,请自行修改代码 关于参数的设置请参考演示或函数中的注释,特殊说明一下注释中最后的(自定数据)(结果数据)(间接数据)这三个类别。自定数据就是自己设置值的数据,间接数据是根据自定数据得到的值,比如数组使用的大小,结果数据是放置计算结果的数据,请勿修改。 两个系统最终的返回值都是物品类型(integer) 禁用物品版增加了禁用某个物品出现在随机中的功能,禁用物品请用AddBanItem添加物品类型(integer),去除禁用物品请使用RemoveBanItem,参数也是物品类型。删除错误的类型无效。具体使用方法请看演示 |
单等级版代码:
globals integer array udg_ItemTypeArray//物品类型记录数组(不必按等级排列)(自定数据) integer array udg_ItemAppearRate//对应每个物品类型物品在其等级所有物品中的出现概率(自动计算)(自定数据) integer array udg_ItemLevel//对应每个物品类型的等级 integer array udg_ItemLevelRate//所有等级中每个等级出现的概率(自动计算)(自定数据) integer array udg_ItemRateNumInLevel//每个等级的物品的概率总和(对应等级排列)(结果数据) integer array udg_ItemIndexInLevel//每个等级的物品在udg_ItemTypeArray中的第一个的序号位置(对应等级排列,为0~udg_ItemLevelNum -1)(结果数据) integer udg_ItemTypeNum//物品类型总数(间接数据) integer udg_ItemLevelNum//物品等级总数,物品等级从0级开始,依次递增到udg_ItemLevelNum - 1级,共udg_ItemLevelNum个等级 (间接数据) integer udg_ItemLevelRateNum//物品等级总概率(结果数据) endglobals function RandomItemSystemInitialize takes nothing returns nothing//随机物品系统初始化 local integer array TempItemTypeArray local integer array TempItemAppearRate local integer array TempItemLevel local integer array TempItemNum local integer TempInteger local integer i = 0 set udg_ItemLevelRateNum = 0 set udg_ItemIndexInLevel[0] = 0 loop//对于等级概率求和以及部分数据初始值设置 set udg_ItemLevelRateNum = udg_ItemLevelRateNum + udg_ItemLevelRate[i] set udg_ItemRateNumInLevel[i] = 0 set udg_ItemIndexInLevel[i] = 0 set TempItemNum[i] = 0 set i = i + 1 exitwhen i >= udg_ItemLevelNum endloop set i = 0 loop//记录临时数据以及等级内概率求和 set TempItemTypeArray[i] = udg_ItemTypeArray[i] set TempItemAppearRate[i] = udg_ItemAppearRate[i] set TempItemLevel[i] = udg_ItemLevel[i] set udg_ItemIndexInLevel[udg_ItemLevel[i] + 1] = udg_ItemIndexInLevel[udg_ItemLevel[i] + 1] + 1 set udg_ItemRateNumInLevel[udg_ItemLevel[i]] = udg_ItemRateNumInLevel[udg_ItemLevel[i]] + udg_ItemAppearRate[i] set i = i + 1 exitwhen i >= udg_ItemTypeNum endloop set i = 1 loop//对于等级概率分配以及每个等级初始位置分配 set udg_ItemLevelRate[i] = udg_ItemLevelRate[i] + udg_ItemLevelRate[i - 1] set udg_ItemIndexInLevel[i] = udg_ItemIndexInLevel[i] + udg_ItemIndexInLevel[i - 1] set i = i + 1 exitwhen i >= udg_ItemLevelNum endloop set i= 0 loop//对于物品类型数据排序 set TempInteger = udg_ItemIndexInLevel[TempItemLevel[i]] + TempItemNum[TempItemLevel[i]] set udg_ItemTypeArray[TempInteger] = TempItemTypeArray[i] set udg_ItemAppearRate[TempInteger] = TempItemAppearRate[i] set udg_ItemLevel[TempInteger] = TempItemLevel[i] set TempItemNum[TempItemLevel[i]] = TempItemNum[TempItemLevel[i]] + 1 set i = i + 1 exitwhen i >= udg_ItemTypeNum endloop set i = 1 set TempInteger = 1 loop//分配每个等级内的概率 if i != udg_ItemIndexInLevel [TempInteger] then set udg_ItemAppearRate[i] = udg_ItemAppearRate[i] + udg_ItemAppearRate[i - 1] else set TempInteger = TempInteger + 1 endif set i = i + 1 exitwhen i >= udg_ItemTypeNum endloop endfunction function GetRandomItemType takes integer Level returns integer//获得一个给定等级的随机物品当物品等级为-1时为在所有是物品中随机获得 local integer RandomRate local integer i = 0 if Level == -1 then set RandomRate = GetRandomInt(1,udg_ItemLevelRateNum) loop if udg_ItemLevelRate[i] >= RandomRate then set Level = i exitwhen true endif set i = i + 1 endloop endif set RandomRate = GetRandomInt(1,udg_ItemRateNumInLevel[Level]) set i = 0 loop if udg_ItemAppearRate[udg_ItemIndexInLevel[Level] + i] >= RandomRate then return udg_ItemTypeArray[udg_ItemIndexInLevel[Level] + i] endif set i = i + 1 endloop return udg_ItemTypeArray[0] endfunction
多等级版代码:
globals integer array udg_ItemTypeArray//物品类型记录数组(不必按等级排列)(自定数据) integer array udg_ItemAppearRate//对应每个物品类型物品在其等级所有物品中的出现概率(自动计算)(自定数据) integer array udg_ItemLevel//对应每个物品类型的等级 integer array udg_ItemLevelRate//所有等级中每个等级出现的概率(自动计算)(自定数据) integer array udg_ItemRateNumInLevel//每个等级的物品的概率总和(对应等级排列)(结果数据) integer array udg_ItemIndexInLevel//每个等级的物品在udg_ItemTypeArray中的第一个的序号位置(对应等级排列,为0~udg_ItemLevelNum -1)(结果数据) integer udg_ItemTypeNum//物品类型总数(间接数据) integer udg_ItemLevelNum//物品等级总数,物品等级从0级开始,依次递增到udg_ItemLevelNum - 1级,共udg_ItemLevelNum个等级 (间接数据) endglobals function RandomItemSystemInitialize takes nothing returns nothing//随机物品系统初始化 local integer array TempItemTypeArray local integer array TempItemAppearRate local integer array TempItemLevel local integer array TempItemNum local integer TempInteger local integer i = 0 set udg_ItemIndexInLevel[0] = 0 loop//对于部分数据初始值设置 set udg_ItemRateNumInLevel[i] = 0 set udg_ItemIndexInLevel[i] = 0 set TempItemNum[i] = 0 set i = i + 1 exitwhen i >= udg_ItemLevelNum endloop set i = 0 loop//记录临时数据以及等级内概率求和 set TempItemTypeArray[i] = udg_ItemTypeArray[i] set TempItemAppearRate[i] = udg_ItemAppearRate[i] set TempItemLevel[i] = udg_ItemLevel[i] set udg_ItemIndexInLevel[udg_ItemLevel[i] + 1] = udg_ItemIndexInLevel[udg_ItemLevel[i] + 1] + 1 set udg_ItemRateNumInLevel[udg_ItemLevel[i]] = udg_ItemRateNumInLevel[udg_ItemLevel[i]] + udg_ItemAppearRate[i] set i = i + 1 exitwhen i >= udg_ItemTypeNum endloop set i = 1 loop//对于每个等级初始位置分配 set udg_ItemIndexInLevel[i] = udg_ItemIndexInLevel[i] + udg_ItemIndexInLevel[i - 1] set i = i + 1 exitwhen i >= udg_ItemLevelNum endloop set i= 0 loop//对于物品类型数据排序 set TempInteger = udg_ItemIndexInLevel[TempItemLevel[i]] + TempItemNum[TempItemLevel[i]] set udg_ItemTypeArray[TempInteger] = TempItemTypeArray[i] set udg_ItemAppearRate[TempInteger] = TempItemAppearRate[i] set udg_ItemLevel[TempInteger] = TempItemLevel[i] set TempItemNum[TempItemLevel[i]] = TempItemNum[TempItemLevel[i]] + 1 set i = i + 1 exitwhen i >= udg_ItemTypeNum endloop set i = 1 set TempInteger = 1 loop//分配每个等级内的概率 if i != udg_ItemIndexInLevel [TempInteger] then set udg_ItemAppearRate[i] = udg_ItemAppearRate[i] + udg_ItemAppearRate[i - 1] else set TempInteger = TempInteger + 1 endif set i = i + 1 exitwhen i >= udg_ItemTypeNum endloop endfunction function MakeLevelKey takes integer Level,integer Key returns integer//将Level加入到Key中,注意不要重复添加,最大等级30 local integer i = 0 local integer TempKey = 1 loop exitwhen i == Level set TempKey = TempKey * 2 set i = i + 1 endloop return Key + TempKey endfunction function GetRandomItemType takes integer Key returns integer//获得一个给定Key的随机物品 local integer RandomRate local integer i = -1 local integer j = 0 local integer Level = 0 local integer TempAllLevelRate = 0 local integer array TempLevelRate local integer array TempLevel loop//获取记录有效的Level if Key != Key / 2 * 2 then set i = i + 1 set TempLevelRate[i] = udg_ItemLevelRate[j] set TempAllLevelRate = TempAllLevelRate + udg_ItemLevelRate[j] set TempLevel[i] = j endif set Key = Key / 2 exitwhen Key == 0 set j = j + 1 endloop set j = 1 loop//分配概率 exitwhen j > i set TempLevelRate[j] = TempLevelRate[j] + TempLevelRate[j - 1] set j = j + 1 endloop set RandomRate = GetRandomInt(1,TempAllLevelRate) set j = 0 loop if TempLevelRate[j] >= RandomRate then set Level = TempLevel[j] exitwhen true endif set j = j + 1 endloop set j = 0 set RandomRate = GetRandomInt(1,udg_ItemRateNumInLevel[Level]) loop if udg_ItemAppearRate[udg_ItemIndexInLevel[Level] + j] >= RandomRate then return udg_ItemTypeArray[udg_ItemIndexInLevel[Level] + j] endif set j = j + 1 endloop return udg_ItemTypeArray[0] endfunction
多等级禁用物品版:
globalsinteger array udg_ItemTypeArray//物品类型记录数组(不必按等级排列)(自定数据) integer array udg_ItemAppearRate//对应每个物品类型物品在其等级所有物品中的出现概率(自动计算)(自定数据) integer array udg_ItemLevel//对应每个物品类型的等级 integer array udg_ItemLevelRate//所有等级中每个等级出现的概率(自动计算)(自定数据) integer array udg_ItemIndexInLevel//每个等级的物品在udg_ItemTypeArray中的第一个的序号位置(对应等级排列,为0~udg_ItemLevelNum -1)(结果数据) integer array udg_BanItemType//禁止的物品的类型数组,在调用函数GetRandomItemType后自动清空。如果需禁用某个物品,那么请放入此数组中(结果数据) integer udg_ItemTypeNum//物品类型总数(间接数据) integer udg_ItemLevelNum//物品等级总数,物品等级从0级开始,依次递增到udg_ItemLevelNum - 1级,共udg_ItemLevelNum个等级 (间接数据) endglobalsfunction RandomItemSystemInitialize takes nothing returns nothing//随机物品系统初始化local integer array TempItemTypeArraylocal integer array TempItemAppearRatelocal integer array TempItemLevellocal integer array TempItemNumlocal integer TempIntegerlocal integer i = 0set udg_ItemIndexInLevel[0] = 0loop//对于部分数据初始值设置 set udg_ItemIndexInLevel[i] = 0 set TempItemNum[i] = 0set i = i + 1exitwhen i >= udg_ItemLevelNumendloopset i = 0loop//记录临时数据以及等级内概率求和 set TempItemTypeArray[i] = udg_ItemTypeArray[i]set TempItemAppearRate[i] = udg_ItemAppearRate[i]set TempItemLevel[i] = udg_ItemLevel[i] set udg_ItemIndexInLevel[udg_ItemLevel[i] + 1] = udg_ItemIndexInLevel[udg_ItemLevel[i] + 1] + 1set i = i + 1exitwhen i >= udg_ItemTypeNumendloopset i = 1 loop//对于每个等级初始位置分配 set udg_ItemIndexInLevel[i] = udg_ItemIndexInLevel[i] + udg_ItemIndexInLevel[i - 1]set i = i + 1exitwhen i >= udg_ItemLevelNumendloopset i= 0 loop//对于物品类型数据排序 set TempInteger = udg_ItemIndexInLevel[TempItemLevel[i]] + TempItemNum[TempItemLevel[i]]set udg_ItemTypeArray[TempInteger] = TempItemTypeArray[i]set udg_ItemAppearRate[TempInteger] = TempItemAppearRate[i]set udg_ItemLevel[TempInteger] = TempItemLevel[i]set TempItemNum[TempItemLevel[i]] = TempItemNum[TempItemLevel[i]] + 1set i = i + 1exitwhen i >= udg_ItemTypeNumendloop endfunctionfunction MakeLevelKey takes integer Level,integer Key returns integer//将Level加入到Key中,注意不要重复添加,最大等级30 local integer i = 0local integer TempKey = 1loop exitwhen i == Level set TempKey = TempKey * 2set i = i + 1endloopreturn Key + TempKeyendfunctionfunction IsBanItem takes integer ItemType returns boolean//返回物品类型ItemType是否可出现 local integer i = 0loopif ItemType == udg_BanItemType[i] thenreturn falseendifset i = i + 1exitwhen udg_BanItemType[i] == 0endloopreturn trueendfunctionfunction AddBanItem takes integer ItemType returns nothing//增加一个禁用物品local integer i = 0loopexitwhen udg_BanItemType[i] == 0set i = i + 1endloop set udg_BanItemType[i] = ItemTypeendfunction function RemoveBanItem takes integer ItemType returns nothing//将物品在禁用表中去除local integer i = 0local integer BanItemIndex = -1loopexitwhen udg_BanItemType[i] == 0if udg_BanItemType[i] == ItemType thenset BanItemIndex = iendifset i = i + 1endloop if BanItemIndex == -1 then returnendifset udg_BanItemType[BanItemIndex] = udg_BanItemType[i - 1]set udg_BanItemType[i - 1] = 0endfunction function GetRandomItemType takes integer Key returns integer//获得一个给定Key的随机物品 local integer RandomRatelocal integer i = -1local integer j = 0local integer Level = 0local integer TempRate = 0local integer array TempRateArraylocal integer array TempLevel local integer array TempItemType loop//获取记录有效的Level if Key != Key / 2 * 2 then set i = i + 1set TempRateArray[i] = udg_ItemLevelRate[j] set TempRate = TempRate + udg_ItemLevelRate[j]set TempLevel[i] = jendifset Key = Key / 2 exitwhen Key == 0 set j = j + 1endloopset j = 1loop//分配等级概率 exitwhen j > i set TempRateArray[j] = TempRateArray[j] + TempRateArray[j - 1]set j = j + 1endloopset RandomRate = GetRandomInt(1,TempRate)set j = 0loop//获得随机等级 if TempRateArray[j] >= RandomRate then set Level = TempLevel[j] exitwhen trueendifset j = j + 1 endloop set TempRate = 0set i = -1set j = udg_ItemIndexInLevel[Level] loop//记录有效的物品类型 if IsBanItem(udg_ItemTypeArray[j]) then set i = i + 1 set TempRateArray[i] = udg_ItemAppearRate[j]set TempItemType[i] = udg_ItemTypeArray[j] set TempRate = TempRate + udg_ItemAppearRate[j]endifset j = j + 1exitwhen j == udg_ItemIndexInLevel[Level + 1] endloopset j = 1loop//分配物品概率 exitwhen j > i set TempRateArray[j] = TempRateArray[j] + TempRateArray[j - 1]set j = j + 1endloopset j = 0 set RandomRate = GetRandomInt(1,TempRate)loop if TempRateArray[j] >= RandomRate thenreturn TempItemType[j]endifset j = j + 1endloop return udg_ItemTypeArray[0]endfunction
JASS随机物品系统相关推荐
- 用JASS简单修改魔兽争霸地图
大学时候,经常用w3mmaster修改一些未加密地图的技能,自娱自乐.有一张地图,神之墓地,有一些改版:"春哥"."风姐"版,特点是玩家输入"风姐万岁 ...
- JASS代码加翻译更新(第六篇)
[GetLocalPlayer] title = "本地玩家 [R]" description = "本地玩家" comment = "指代玩家自己, ...
- Jass 技能模型定义(—):半人马酋长的反击光环
Jass是什么? 先阐释一下什么是jass吧,百度:JASS(正确地说是JASS 2)是魔兽3的程序语言,用于控制游戏和地图的进行,也是魔兽游戏和地图的基础. 地图编辑器中摆放的单位(Unit),区域 ...
- 批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解
批量梯度下降(BGD).随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解 </h1><div class="clear"></div> ...
- linux ftp随机端口,linuxFTP生产环境配置
1.ftp采用两个端口控制: A 20端口用于数据传输. B 21端口用于控制,或指建立TCP连接. 2.主动方式连接过程: [注意]:C表示客户端 S表示服务器端 A. S端要开启20.21端口: ...
- python random 随机生成一个数
import random # 0 到 1 之间的随机浮点数 print(random.random()) # 1到20之间随机选取一个整数 print(random.randint(1, 20)) ...
- sklearn.model_selection.train_test_split随机划分训练集和测试集
1 函数用途 train_test_split()是交叉验证中常用的函数,功能是将数组或矩阵按比例随机划分为训练集和测试集,使用方法为: X_train,X_test, y_train, y_test ...
- PyTorch 安装和基本运算— Tensor 的数据类型(浮点型、整型、随机浮点型等)、基本运算(绝对值、求和、裁剪、求商、求积、求幂等)、Tensor 与 Numpy 转换
PyTorch 的安装可以到官网 https://pytorch.org/,选择适合自己机器以及安装方式,执行对应的命令即可. 除了安装 PyTorch 之外,建议也安装 torchvision 包. ...
- 利用mysql建立随机森林_随机森林算法实例 - osc_4imme0wh的个人空间 - OSCHINA - 中文开源技术交流社区...
根据成年人数据集来预测一个人的收入 1.准备数据集 我下载好了一个成年人数据集,从百度云下载 链接:https://pan.baidu.com/s/10gC8U0tyh1ERxLhtY8i0bQ 提取 ...
- matlab 信号的原子产生,MATLAB随机产生原子结构代码
在计算材料学中极少的情况下,我们可能会需要随机产生一个模拟盒子内的原子结构,一般用于测试. 这样说,其实只要rand一个数组就可以了,但是我们又希望这个结构又能够大致满足一些物理上的限制,而不是纯粹数 ...
最新文章
- 华为百度再次携手AI人工智能未来科技,为什么不是腾讯阿里巴巴?
- Apache Dubbo 2.7.7 发布!升级 fastjson 等依赖!
- 兴义智力象机器人_兴义向阳路小学在第十八届全国青少年机器人竞赛贵州区选拔赛夺冠...
- 全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别(转)
- QT的QCameraImageCapture类的使用
- leetcode 287. Find the Duplicate Number | 287. 寻找重复数(判断链表是否有环,并找到环的起点)
- vlan跨交换机 udp广播_划分VLAN和接二级路由都能阻止广播风暴?两者有什么区别?...
- java list分批_Java实用笔记——mybatis批量导入
- sqlserver08评估期已过的解决方法
- textarea在IE中和FF下不同的效果
- 服务器cp所以型号,云服务器cp
- 什么是WEBserver? 经常使用的WEBserver有哪些?
- 2 测试方法与理论 - 软件测试
- 用U盘PE启动安装系统教程
- Wps开发工具-宏的使用
- 利用python进行TEQC质量检核结果绘图
- windows11截屏快捷键失效
- 摘果子问题(聚沙成塔问题)
- PSENet原理与代码解析
- Java核心语法——IO流