角色升级模拟VBA(转给想学VBA的数值新人)

发表于2015-10-29
评论5 6.2k浏览

设计目的:快速验证角色升级节奏
        在设计过程中,往往会对经验产出和升级所需经验做出调整,而在每次调整后,玩家的升级节奏都有可能发生变化。为了方便验证该变化,我制作了一个简单的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交流群,人满封群!每天分享游戏开发内部干货、教学视频、福利活动、和有相同梦想的人在一起,更有腾讯游戏专家手把手教你做游戏!

腾讯GAD游戏策划交流群486822377Gad策划交流群

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引