角色升级模拟VBA(转给想学VBA的数值新人)
发表于2015-10-29
设计目的:快速验证角色升级节奏
在设计过程中,往往会对经验产出和升级所需经验做出调整,而在每次调整后,玩家的升级节奏都有可能发生变化。为了方便验证该变化,我制作了一个简单的vba升级模拟器,用来模拟玩家的日常升级行为。
模拟器主要包括:做主线任务、日常活动、挂机、离线经验,升级所需经验。其中日常活动、挂机、离线经验会随玩家的等级不同而不同,因此要在其他表格中填写好。
对于任何游戏来说,新手阶段的几个小时都非常重要。因此新手阶段的的升级节奏还需要以游戏中实际体验为准。
以下是该模拟器的vba代码:
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public daily_activies '日常任务1可做,0不可做
Public afk_time_max '玩家每天最大挂机时间
Public afk_time_remaining '当日剩余挂机时间
Public playtime As Single '累计游戏时间
Public playtime_column '累计游戏时间所在的列
Public action_row '行为操作的行
Public sheetname '操作的表
Sub 升级行为模拟器()
'初始化数据-------------------------------------------------------------------------------
sheetname = "升级行为模拟器"
tasklv = 1 '任务初始等级
playerlv = 1 '玩家初始等级
playerlv_max = 100 '设定玩家等级上限
Playerlv_column = "U" '行动后的玩家等级
actionid = 1 '行为ID
action_row = 6 '开始写入行为相关内容的行-------------------
daily_activies = 1 '日常任务1可做,0不可做
afk_time_max = Sheets(sheetname).Cells(2, "AC") '获取玩家每天挂机时间
afk_time_used = 0 '已使用的挂机时间
afk_time_remaining = afk_time_max - afk_time_used '剩余挂机时间
afk_exp_24h = 0 '挂机24小时经验
afk_exp_24h_column = "L" '挂机效率列号
playtime = 0 '累计游戏时间
playtime_column = "V" '累计游戏时间
levelup_exp_owned_column = "X" '玩家升级后多出的经验
levelup_exp_need_column = "Y" '玩家升到下级需要的经验
'清空行为区域-------------------------------------------------------------------------------
rangevalue = "A" & action_row & ":G1500" '清空行为区域的范围
Sheets(sheetname).Select
Range(rangevalue).Select
Selection.ClearContents
'首先执行一次主线任务--------------------------------------------------------------------------
Sheets(sheetname).Cells(action_row, 1) = actionid '写入行为ID
Sheets(sheetname).Cells(action_row, 2).Value = tasklv '写入任务ID
playerlv = Sheets(sheetname).Cells(action_row, Playerlv_column) '获取行为后玩家等级
Call 判断是否重置日常和挂机时间
tasklv = tasklv + 1 '下一个任务等级
actionid = actionid + 1 '下一个行为ID
action_row = action_row + 1 '下一行
'开始循环--------------------------------------------------------------------------
For i = 1 To 1500
If playerlv >= tasklv Then '比较玩家等级 是否大等于 下一个任务的等级
Sheets(sheetname).Cells(action_row, 1) = actionid '写入行为ID
Sheets(sheetname).Cells(action_row, 2).Value = tasklv '写入任务ID
playerlv = Sheets(sheetname).Cells(action_row, Playerlv_column) '获取行为后玩家等级
Call 判断是否重置日常和挂机时间
tasklv = tasklv + 1 '下一个任务等级
actionid = actionid + 1 '下一个行为ID
action_row = action_row + 1 '下一行
ElseIf daily_activies = 1 Then '判断是否可以做日常活动
Sheets(sheetname).Cells(action_row, 1) = actionid '写入行为ID
Sheets(sheetname).Cells(action_row, 3).Value = 1 '写入日常任务
playerlv = Sheets(sheetname).Cells(action_row, Playerlv_column) '获取行为后玩家等级
daily_activies = 0 '标记当天的日常任务为已做
Call 判断是否重置日常和挂机时间
actionid = actionid + 1 '下一个行为ID
action_row = action_row + 1 '下一行
ElseIf afk_time_remaining > 0 Then '判断是否可挂机
afk_exp_24h = Sheets(sheetname).Cells(action_row, afk_exp_24h_column) '获取挂机24小时可获得经验
levelup_exp_owned = Sheets(sheetname).Cells(action_row - 1, levelup_exp_owned_column) '获取玩家当前等级以获得的经验
levelup_exp_need = Sheets(sheetname).Cells(action_row - 1, levelup_exp_need_column) '获取玩家本级升级需要经验
levelup_exp = levelup_exp_need - levelup_exp_owned '计算还需多少经验升级
afk_time_need = Application.RoundUp(levelup_exp / afk_exp_24h * 24, 1) '计算升级需要挂机时间(h)
If afk_time_need < 0.1 Then '设定最小单次挂机时间为0.1h
afk_time = 0.1
ElseIf afk_time_need < afk_time_remaining Then '判断当日剩余的挂机时间是否足够升级
afk_time = afk_time_need '令挂机时间正好等于升级需要的时间
Else
afk_time = afk_time_remaining '令挂机时间等于剩余可用挂机时间
End If
Sheets(sheetname).Cells(action_row, 1) = actionid '写入行为ID
Sheets(sheetname).Cells(action_row, 4).Value = 1 '写入挂机状态
Sheets(sheetname).Cells(action_row, 5).Value = afk_time '写入挂机时间
afk_time_used = afk_time_used + afk_time '更新已挂机时间
afk_time_remaining = afk_time_remaining - afk_time '更新剩余挂机时间
playerlv = Sheets(sheetname).Cells(action_row, Playerlv_column) '获取行为后玩家等级
Call 判断是否重置日常和挂机时间
actionid = actionid + 1 '下一个行为ID
action_row = action_row + 1 '下一行
Else '离线
playtime_last = Sheets("升级行为模拟器").Cells(action_row - 1, playtime_column) '获取上一个行为后的游戏时间
offline_time = (1 - (playtime_last - Int(playtime_last))) * 24 '计算需要的离线时间
Sheets(sheetname).Cells(action_row, 1) = actionid '写入行为ID
Sheets(sheetname).Cells(action_row, 6).Value = 1 '写入离线状态
Sheets(sheetname).Cells(action_row, 7).Value = offline_time '写入离线时间
playerlv = Sheets(sheetname).Cells(action_row, Playerlv_column) '获取行为后玩家等级
Call 判断是否重置日常和挂机时间
actionid = actionid + 1 '下一个行为ID
action_row = action_row + 1 '下一行
End If
If playerlv = playerlv_max Then
Exit For
End If
Cells(action_row, 1).Select
'Sleep 10
Next
End Sub
Sub 判断是否重置日常和挂机时间()
'每个游戏行为后判断状态是否发生改变-------------------------------------------------------------------------------------
playtime = Sheets("升级行为模拟器").Cells(action_row, playtime_column) '本行为后的游戏时间
playtime_last = Sheets("升级行为模拟器").Cells(action_row - 1, playtime_column) '上一个行为后的游戏时间
If playtime > 0 Then '判断玩家是否开始游戏
If Application.RoundDown(playtime, 0) - Application.RoundDown(playtime_last, 0) >= 1 Then '判断玩家游戏时间是否过了1天
'MsgBox "playertime:" & playtime & " playtime_last:" & playtime_last & "Application.RoundDown(playtime, 0):" & Application.RoundDown(playtime, 0) & " Application.RoundDown(playtime_last, 0):" & Application.RoundDown(playtime_last, 0)
daily_activies = 1 '重置日常任务状态为“可做”
afk_time_remaining = afk_time_max '重置每日已挂机时间为0
End If
End If
End Sub
看了上面的文章 热爱游戏创作的你是不是已经开始热血沸腾了呢?是不是迫不及待的想加入游戏团队成为里面的一员呢?
福利来啦~赶快加入腾讯GAD交流群,人满封群!每天分享游戏开发内部干货、教学视频、福利活动、和有相同梦想的人在一起,更有腾讯游戏专家手把手教你做游戏!