马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
// - 为什么要洗牌器
比如你要在100个英雄里抽4个,在200个物品里抽5个,在50个奖励里抽3个,就要用到洗牌了
洗牌器实现如下:
// - 读取长度为len的牌组中的第idx号元素的整数
function ShufflerGet takes integer len,integer idx returns integer
return 在哈希表索引为(洗牌器,len,idx)的位置读出整数
endfunction
// - 保存长度为len的牌组中第idx号元素为整数v0
function ShufflerSet takes integer len,integer idx,integer v0 returns nothing
call 在哈希表索引为(洗牌器,len,idx)的位置保存整数v0
endfunction
// - 对长度为len的牌组中的前cnt张牌进行洗牌
function ShufflerRun takes integer len,integer cnt returns nothing
local integer i0
local integer i1
local integer i2
// - 不存在则新建长度为len的牌组
if (哈希表.长度为len的牌组.exist)==false then
设置(哈希表.长度为len的牌组.exist)=true
set i0=0
loop
exitwhen i0==len
call ShufflerSet(len,i0,i0)
set i0=i0+1
endloop
endif
// - 洗前cnt张牌
set i0=0
loop
exitwhen i0==cnt
set i1=rdi(0,len-1)
set i2=ShufflerGet(len,i0)
call ShufflerSet(len,i0,Asf(len,i1))
call ShufflerSet(len,i1,i2)
set i0=i0+1
endloop
endfunction
// - 下面运行洗牌看看
call ShufflerRun(10,5)
分析:
长度为10的牌组不存在,因此会新建长度为10的牌组:
0,1,2,3,4,5,6,7,8,9
然后洗牌前5位,牌组变为
9,5,1,8,3,4,6,7,2,0
然后就可以用ShufflerGet(10,i)来获取i=0,1,2,3,4的前5张牌的值了,测试取出结果为9,5,1,8,3
// - 洗牌器的应用
实例1:TD里100个英雄里抽4个,就可以
call ShufflerRun(100,4)
运行上面的函数后,就可以用ShufflerGet(100,i)来获取i=0,1,2,3的值,举个例子,抽出来的4个英雄可能分别是第95,75,25,10号英雄
实例2:物品里200个抽5个:
call ShufflerRun(200,5)
实例3:奖励里50个抽3个:
call ShufflerRun(50,5) |