|
掉级强化模拟.rar
(24.24 KB, 下载次数: 350)
在游戏设计中大家经常会遇到马尔科夫链问题的系统设计,在这里跟大家分享一个自己做的VBA模拟器。
数据结构
第一部分数据结构,ID、花费、强化ID、对应权重
ID:就是当前强化等级 默认为1级,实际你按-1去考虑就可以了。
花费:强化需消耗的货币数量
强化ID:当前等级强化后可能跳转的等级
对应权重:可跳转的等级对应的权重。
举例说明:第一行数据,初始等级1级时花费500,强化操作后有20%的概率是1级,80的概率是2级。
这里强化ID格式为 A+B+C形式,填写的时候注意不要有断档,就是你操作到某一个等级后你填的数据无法保证可以继续走下去,简单来说你要保证1-2-3-4-5-6-7-8-9-10......这个概率一定存在。
由于代码读取问题,注意数据的格式和所在列!!!!!
参数
参数界面:目标ID、目标次数、平均次数、平均花费
目标ID:测试时指定要强化到的等级,注意初始是1这个区别。实际你期望的要+1
目标次数:反复测试的次数,次数越大得到的数据越接近实际数据
平均次数:达到目标所需要强化的次数取小数点后两位
平均花费:达到目标所需要的强化消耗取小数点后两位
进度详情:因为目标次数太大EXCEL运行速度问题,给一个可视的进度防止文件卡死不知道。
由于代码读取问题,注意数据的格式和所在列!!!!!
之后是代码相关介绍:
随机算法及数据解析:
Option Explicit
Option Base 1
Public set_id As Integer
Public set_cost As Integer
Public Sub rand_show(ByVal arr)
Dim i#
Dim rnd_num#
Dim rnd_rank#
Dim rnd_rank_p#
Dim m_select#
Dim temp_arr3
Dim temp_arr4
'初始化随机种子
Randomize
'----------------------------------------------随机过程-----------------------------------------------
rnd_num = Int(Rnd() * 10000 + 1)
temp_arr3 = analysis_data(arr(set_id, 3))
temp_arr4 = analysis_data(arr(set_id, 4))
rnd_rank = 0
'-------------------------------判断此次结果ID位置-----------------------------------
For i = 0 To UBound(temp_arr4)
rnd_rank_p = rnd_rank
rnd_rank = rnd_rank + temp_arr4(i)
If temp_arr4(i) <> 0 Then
If rnd_num > rnd_rank_p And rnd_num <= rnd_rank Then
m_select = temp_arr3(i)
Exit For
End If
End If
Next i
'------------------End----------------
set_cost = arr(set_id, 2)
set_id = m_select
End Sub
'-----------------------解析数组里的字符--------------------
Function analysis_data(my_str)
Dim ana_arr
ana_arr = Split(my_str, "+")
analysis_data = ana_arr
End Function
主要运行过程:
Option Explicit
Option Base 1
Sub new_test()
Dim goal_id#
Dim goal_time#
Dim sum_cost#
Dim aver_time#
Dim aver_cost#
Dim sum_time#
Dim goal_id_needtime#
Dim brr
Dim test_sht
Dim k#
Dim T#
'-----------------------载入数据-------------------------
Set test_sht = Sheet1 '|
With test_sht '|
brr = .[A2].Resize(.[A1].End(xlDown).Row - 1, 4) '|
goal_id = .[H2] '|
goal_time = .[I2] '|
.[k2] = 0 '|
.[H4] = "···" '|
.[I4] = "···" '|
End With '|
'-----------------------循环模拟-------------------------
'----初始化数据----
aver_time = 0
aver_cost = 0
sum_time = 0
sum_cost = 0
For k = 1 To goal_time
'----初始化数据----
set_id = 1
goal_id_needtime = 0
'---------调用随机过程-------
Do Until set_id = goal_id
rand_show (brr)
goal_id_needtime = goal_id_needtime + 1
sum_cost = sum_cost + set_cost
Loop
sum_time = sum_time + goal_id_needtime
test_sht.[k2] = k / goal_time
delay 0.0001
Next k
'-----------------TEST数据存入数组-----------------
aver_cost = Round(sum_cost / k, 2)
aver_time = Round(sum_time / k, 2)
'--------------------数据输出---------------------
With test_sht
.[H4] = aver_time
.[I4] = aver_cost
End With
End Sub
Function delay(T As Single)
Dim T1 As Single
T1 = Timer
Do
DoEvents
Loop While Timer - T1 < T
End Function
解析函数:用来解析数据表里的特殊格式数据
随机算法:用权重来随机取值,这里数据格式很自由所以考虑了如果权重填0也正常的判断。
主过程:用于取得参数来运行主逻辑。
延迟函数:主要是为了防止次数太多时EXCEL运算有概率会卡死,因为EXCEL会以最快速度运算,配置不好会无响应一段时间这段时间内无法操作电脑。
代码相对来说还算通用,大家可以借鉴参考。
|
|