游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6514|回复: 16

[原创] 【VBA】RPG网游经验模型搭建和验算

[复制链接]

6

主题

22

帖子

174

积分

注册会员

Rank: 2

积分
174
发表于 2016-7-6 23:20:22 | 显示全部楼层 |阅读模式
  笔者最近抽空写了一个简单的RPG游戏的升级经验模型。主要包含主线任务、日常任务,其他经验产出渠道可自行补充,这里只分享一个模型思路,抛砖引玉,欢迎大家讨论。
  excel中还包含一个升级模拟工具,该工具主要作用是,当频繁调整升级经验时(项目早期),能快速的看到各个经验卡点的变化(主线任务经验不足,需要做日常任务、刷副本等)的情况。实际上如果模型搭建合理,这个验算工具基本没什么卵用。

     excel中的数值笔者已做过特殊处理,仅供测试模型用,不建议直接使用:)。

     欢迎有兴趣的朋友一起讨论
  QQ:1437900504 唐僧
      Q群:564663199



  以下是相关的VBA代码:
  1. Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

  2. Sub 升级行为模拟器2()
  3. '模拟器只规划玩家行为,统计经验在表格中。
  4. '定义变量----------------------------------------------
  5. action_type = 0 '确定行为类型
  6. task_zhuxian = "主线"
  7. task_richang = "日常"
  8. task_richang_huan_max = 20 '日常任务最大环数
  9. task_richang_huan_finished = 0

  10. guaji = "挂机"
  11. guaji_time_max = 60 * 8 '每日挂机时间
  12. guaji_time = 0
  13.    
  14. '初始化数据-------------------------------------------------------------------------------
  15.         
  16.     sheetname = "升级模拟器2.0"
  17.     playerlv = 1 '玩家初始等级
  18.     playerlv_max = 150 '设定玩家等级上限
  19.     action_row = 18 '开始写入行为相关内容的行-------------------
  20.    
  21.     action_column = "L"
  22. '清空行为区域-------------------------------------------------------------------------------
  23.   
  24.     rangevalue = "L" & action_row & ":L10000" '清空行为区域的范围
  25.     Sheets(sheetname).Select
  26.     Range(rangevalue).Select
  27.     Selection.ClearContents
  28. '开始循环======================================================================================================================

  29.     For action_row = 18 To 4000
  30.    
  31.         Cells(action_row, 1).Select
  32.         Debug.Print action_row
  33.         
  34.         playerlv = Sheets(sheetname).Cells(action_row, "B") '获取上一次行为后玩家等级
  35.         playerlv_lastture = Sheets(sheetname).Cells(action_row - 1, "B")
  36. '主线任务-----------------------------------------------------------------------------
  37.         If playerlv = 1 Then
  38.         
  39.             action_type = task_zhuxian
  40.             Sheets(sheetname).Cells(action_row, action_column).Value = action_type & "Lv." & playerlv '写入行为类型
  41.             Debug.Print action_type & "Lv." & playerlv
  42.             GoTo nextfor '跳下一循环
  43.         
  44.         ElseIf playerlv > playerlv_lastture Then '判断是否升级了,如果升级则做主线,并退出当前循环------------------------------------
  45.         
  46.             action_type = task_zhuxian
  47.             Sheets(sheetname).Cells(action_row, action_column).Value = action_type & "Lv." & playerlv '写入行为类型
  48.             
  49.             Debug.Print action_type & "Lv." & playerlv
  50.             GoTo nextfor '跳下一循环
  51.         
  52.         End If
  53.         
  54.         
  55.         
  56. '日常任务--------------------------------------------------------------------------
  57.         
  58.         If task_richang_huan_finished < task_richang_huan_max Then '如果日常任务还有剩余,则做日常任务,直到升级或做完。

  59.                 action_type = task_richang
  60.                 task_richang_huan_finished = task_richang_huan_finished + 1
  61.                 Sheets(sheetname).Cells(action_row, action_column).Value = action_type & "(" & task_richang_huan_finished & "/" & task_richang_huan_max & ")"  '写入行为类型
  62.                
  63.                
  64.                 Debug.Print action_type & "(" & task_richang_huan_finished & "/" & task_richang_huan_max & ")"
  65.                 GoTo nextfor '跳下一循环
  66.             
  67.         End If
  68.         'Debug.Print "日常任务已全部完成!!!";


  69. '挂机--------------------------------------------------------------------------------
  70. guijia:
  71.         
  72.         If guaji_time < guaji_time_max Then '如果挂机可已做,则做,直到升级或做完

  73.                 action_type = guaji
  74.                 guaji_time = guaji_time + 60
  75.                 Sheets(sheetname).Cells(action_row, action_column).Value = action_type & "(小时:" & guaji_time / 60 & "/" & guaji_time_max / 60 & ")" '写入行为类型
  76.                
  77.                
  78.                 Debug.Print action_type & "(" & guaji_time / 60 & "/" & guaji_time_max / 60 & ")"
  79.                 GoTo nextfor '跳下一循环

  80.         End If
  81.         'Debug.Print "挂机已全部完成!!!";
  82.         
  83.         
  84. '离线&重置次数--------------------------------------------------------------------------------
  85. lixian:
  86.    
  87.         action_type = lixian
  88.                
  89.         lixian_time = 60 * 24 - guaji_time
  90.         Sheets(sheetname).Cells(action_row, action_column).Value = action_type & "(小时:" & lixian_time / 60 & ")" '写入行为类型
  91.         
  92.         '重置次数和时间
  93.         task_richang_huan_finished = 0
  94.         task_bangpai_huan_finished = 0
  95.         juqingfuben_finished = 0
  96.         'shouweinvshen_finished = 0
  97.         shouweinvshen_saodang_finished = 0
  98.         'tongtianta_finished = 0
  99.         tongtianta_saodang_finished = 0
  100.         danaotiangong_finished = 0
  101.         zuduifuben_finished = 0
  102.         yabiao_finished = 0
  103.         shuilufahui_finished = 0
  104.         guaji_time = 0



  105. '等级最大时---------------------------------------------------------------------------------
  106.         
  107.         If playerlv = playerlv_max Then
  108.             Exit For
  109.         End If

  110. nextfor: '跳下一循环---------------------------------------------------------------------------

  111.     Next
  112.    
  113.     Sheets("模拟2数据分析").EnableCalculation = True '开启分析表的自动运算
  114.    
  115. End Sub


复制代码

升级经验规划及验算_蓝海唐僧.zip (2.07 MB, 下载次数: 1594)


相关阅读:策划如何用VBA调试游戏数值

1

主题

147

帖子

583

积分

高级会员

Rank: 4

积分
583
发表于 2016-7-7 09:30:27 | 显示全部楼层
嗯,确实没什么卵用
目标体验都没搞出来,经验公式完全就是渣渣

2

主题

46

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
QQ
发表于 2016-7-7 11:02:29 | 显示全部楼层
代码还需要优化,数据量比较小没有感觉。处理的数据多你这太卡了。调用对象次数太频繁。没有内存处理。
GOTO语句少用。

6

主题

22

帖子

174

积分

注册会员

Rank: 2

积分
174
 楼主| 发表于 2016-7-7 12:09:00 | 显示全部楼层
lathur 发表于 2016-7-7 09:30
嗯,确实没什么卵用
目标体验都没搞出来,经验公式完全就是渣渣

里面的数值都是随便填的,欢迎大神优化。目标体验、经验公式可有推荐的?

6

主题

22

帖子

174

积分

注册会员

Rank: 2

积分
174
 楼主| 发表于 2016-7-7 12:12:00 | 显示全部楼层
半不癫 发表于 2016-7-7 11:02
代码还需要优化,数据量比较小没有感觉。处理的数据多你这太卡了。调用对象次数太频繁。没有内存处理。
GOT ...

果然是高手,VBA过程中的数据都直接读写单元格,运行确实比较慢。
放到内存中跑会快很多。

2

主题

46

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
QQ
发表于 2016-7-7 12:42:05 | 显示全部楼层
唐僧 发表于 2016-7-7 12:12
果然是高手,VBA过程中的数据都直接读写单元格,运行确实比较慢。
放到内存中跑会快很多。 ...

建议先确定经验的来源:A\B\C\D\E,然后确定每级的行为设计反向得出升级需要的经验。再模拟用户的非设计行为看结果跟设计目标有多大出入。

6

主题

22

帖子

174

积分

注册会员

Rank: 2

积分
174
 楼主| 发表于 2016-7-7 13:03:04 | 显示全部楼层
半不癫 发表于 2016-7-7 12:42
建议先确定经验的来源:A\B\C\D\E,然后确定每级的行为设计反向得出升级需要的经验。再模拟用户的非设计 ...

不谋而合,该经验模型就是如此搭建的。配置模型中的参数即可实现想要的体验。

1

主题

147

帖子

583

积分

高级会员

Rank: 4

积分
583
发表于 2016-7-7 13:14:59 | 显示全部楼层
唐僧 发表于 2016-7-7 12:09
里面的数值都是随便填的,欢迎大神优化。目标体验、经验公式可有推荐的?
...

没什么推荐,一条公式用到底:y=ak+b

一条日常经验获取;一条升级所需时间

分段计算,你先设定玩家在多少时间内达到多少级,然后慢慢调整,调到你想要的结果为准,然后两条公式算出来的值相乘,就可以大致推导出一级需要多少经验

6

主题

22

帖子

174

积分

注册会员

Rank: 2

积分
174
 楼主| 发表于 2016-7-7 13:49:07 | 显示全部楼层
lathur 发表于 2016-7-7 13:14
没什么推荐,一条公式用到底:y=ak+b

一条日常经验获取;一条升级所需时间

这位朋友估计是没看excel,模型就是如此,且都已做公式关联,配置即可实现想要的节奏

2

主题

46

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
QQ
发表于 2016-7-7 14:23:45 | 显示全部楼层
lathur 发表于 2016-7-7 13:14
没什么推荐,一条公式用到底:y=ak+b

一条日常经验获取;一条升级所需时间

当你需要GOTO跳转的时候还有多出代码重复性较高时,可以试试类编程思想,调用自己写的类
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-26 23:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表