起因是我看这个策划岗位貌似需要excel经验,比如excel里的: 原型图和基础编辑器还有vlookup/xlookups等

这些貌似也要学

策划岗位需要的其他经验是这些(放大查看),感觉还需要补充

上图右上角写的东西启发了我去写这个项目

excel项目组成(概括就是一个游戏的攻击力/防御/属性/技能/爆率/关卡boss难度等变量都是可以量化成吸引玩家玩/提高留存率的系统 )

6个图表来显示所有游戏数值等:

1.经济平衡表 2.核心数值平衡表 3.模拟器控制台(调整关卡强度看结果) 4.技能树成长库 5.汇总分析日志(只对多个表的数值修改后结果) 6.参数寻优的更改回溯记录(只对某一个表4的数值修改后结果)

表1,2,4都存放可以修改的数据。表3,5,6存放用VBA代码微调表1,2,4后的数据。表3模拟器控制台(调整关卡强度看结果) ,表5汇总分析日志(对表1,2,4的数值修改后结果),表6参数寻优的更改回溯记录(对表4的数值修改后结果)

6个表:

1.经济平衡表 

2.核心数值平衡表

3.模拟器控制台

4.技能树成长库

5.汇总分析日志

6.参数寻优的更改回溯记录

项目的核心逻辑代码(需要VBA脚本(数据库)<-excel中打开Visual Basic<-快捷键Fn+Alt+F11(所有F1到12需要同时按下Fn才起作用))

实现表3:
Sub RunSmartSimulation()
    Dim i As Integer, playerPower As Double, monsterPower As Double
    Dim resources As Double, prevPower As Double
    Dim wsLogs As Worksheet, wsShop As Worksheet
    Dim balanceStatus As String
    
    Set wsLogs = Sheets("模拟器控制台")
    Set wsShop = Sheets("技能树与成长库")
    
    wsLogs.Cells.Clear
    wsLogs.Range("A1:F1").Value = Array("轮次", "关卡强度", "当前战力", "状态", "累计资源", "诊断报告")
    
    playerPower = 10
    resources = 0
    
    For i = 1 To 20 ' 模拟 20 轮
        ' 1. 引入动态环境 (怪物强度随机波动 + 资源掉落随机)
        monsterPower = 12 + (Rnd * 8) ' 12到20之间波动
        Dim dropReward As Double
        dropReward = 30 + (Rnd * 40)  ' 资源掉落30到70之间波动
        
        prevPower = playerPower ' 记录上一轮战力
        
        ' 2. 挑战与反馈
        If playerPower < monsterPower Then
            resources = resources + dropReward
            balanceStatus = "失败"
            
            ' 购买逻辑
            If resources >= wsShop.Range("D2").Value Then
                playerPower = playerPower * (1 + wsShop.Range("C2").Value)
                resources = resources - wsShop.Range("D2").Value
                balanceStatus = "失败 -> 强化"
            End If
        Else
            balanceStatus = "胜利"
        End If
        
        ' 3. 自动诊断机制 (这是你的检查器)
        Dim diagnostic As String
        If playerPower = prevPower Then
            diagnostic = "? 警告:卡关" ' 战力没变,说明卡住了
        ElseIf (playerPower / prevPower) > 1.2 Then
            diagnostic = "? 警报:成长过猛" ' 增长超过20%,太快了
        Else
            diagnostic = "? 平滑成长"
        End If
        
        ' 4. 写入数据
        wsLogs.Cells(i + 1, 1).Value = i
        wsLogs.Cells(i + 1, 2).Value = Round(monsterPower, 1)
        wsLogs.Cells(i + 1, 3).Value = Round(playerPower, 2)
        wsLogs.Cells(i + 1, 4).Value = balanceStatus
        wsLogs.Cells(i + 1, 5).Value = Round(resources, 0)
        wsLogs.Cells(i + 1, 6).Value = diagnostic
    Next i
    
    MsgBox "智能测试完成!请查看‘模拟器控制台’的‘诊断报告’列。"
End Sub

      该代码流程图如下

实现表5:
' =================================================================
' 完整自动化分析模块 (覆盖所有旧代码)
' =================================================================

' 1. 总指挥
Sub RunFullProcess()
    ' 启动自动化灵敏度分析引擎
    Call SensitivityManager
    ' 生成图表
    Call GeneratePerformanceCharts
    ' 汇总仪表盘
    Call CreateDashboard
    MsgBox "全流程自动化分析已完成!"
End Sub

' 2. 自动化引擎:控制变量灵敏度分析
Sub SensitivityManager()
    Dim wsLog As Worksheet, wsTarget As Worksheet
    Dim targets As Variant, addr As String, wsName As String
    Dim i As Integer
    
    ' 初始化汇总表
    On Error Resume Next
    Set wsLog = Sheets("汇总分析日志")
    If wsLog Is Nothing Then Set wsLog = Sheets.Add: wsLog.Name = "汇总分析日志"
    wsLog.Cells.Clear
    wsLog.Range("A1:E1").Value = Array("参数位置", "原始值", "变动率", "变动后数值", "模拟结果(资源)")
    On Error GoTo 0
    
    ' 定义测试清单 (格式:工作表名|单元格范围)
    targets = Array("技能树与成长库|C2:C20", "核心数值平衡表|A3", "核心数值平衡表|B3", "经济平衡表|C2:C20", "经济平衡表|D2:D20")
    
    For i = LBound(targets) To UBound(targets)
        Dim parts As Variant
        parts = Split(targets(i), "|")
        wsName = parts(0)
        addr = parts(1)
        Set wsTarget = Sheets(wsName)
        Call ScanRange(wsTarget, addr, wsLog)
    Next i
    
    MsgBox "全维度灵敏度分析完成!数据已汇总至【汇总分析日志】。"
End Sub

Sub ScanRange(ws As Worksheet, addr As String, logWs As Worksheet)
    Dim rng As Range, cell As Range
    Set rng = ws.Range(addr)
    For Each cell In rng
        If IsNumeric(cell.Value) And cell.Value <> 0 Then
            Dim org As Double: org = cell.Value
            Dim step As Integer
            For step = 1 To 5
                Dim rate As Double: rate = step * 0.01
                cell.Value = org * (1 + rate)
                
                ' 运行你的模拟器
                Call RunSmartSimulation
                
                ' 记录结果 (假设最后一轮资源在 E21)
                Dim res As Double
                res = Sheets("模拟器控制台").Range("E21").Value
                
                Dim r As Long
                r = logWs.Cells(logWs.Rows.Count, 1).End(xlUp).Row + 1
                logWs.Cells(r, 1).Value = ws.Name & "!" & cell.Address
                logWs.Cells(r, 2).Value = org
                logWs.Cells(r, 3).Value = Format(rate, "0%")
                logWs.Cells(r, 4).Value = cell.Value
                logWs.Cells(r, 5).Value = res
                
                cell.Value = org ' 恢复原值
            Next step
        End If
    Next cell
End Sub

' 3. 原有的智能模拟器 (必须保留)
Sub RunSmartSimulation()
    Dim i As Integer, playerPower As Double, monsterPower As Double
    Dim resources As Double, prevPower As Double
    Dim wsLogs As Worksheet, wsShop As Worksheet
    Dim balanceStatus As String
    
    Set wsLogs = Sheets("模拟器控制台")
    Set wsShop = Sheets("技能树与成长库")
    
    wsLogs.Cells.Clear
    wsLogs.Range("A1:F1").Value = Array("轮次", "关卡强度", "当前战力", "状态", "累计资源", "诊断报告")
    playerPower = 10: resources = 0
    
    For i = 1 To 20
        monsterPower = 12 + (Rnd * 8)
        Dim dropReward As Double: dropReward = 30 + (Rnd * 40)
        prevPower = playerPower
        
        If playerPower < monsterPower Then
            resources = resources + dropReward
            If resources >= wsShop.Range("D2").Value Then
                playerPower = playerPower * (1 + wsShop.Range("C2").Value)
                resources = resources - wsShop.Range("D2").Value
            End If
        End If
        
        wsLogs.Cells(i + 1, 1).Value = i
        wsLogs.Cells(i + 1, 2).Value = Round(monsterPower, 1)
        wsLogs.Cells(i + 1, 3).Value = Round(playerPower, 2)
        wsLogs.Cells(i + 1, 5).Value = Round(resources, 0)
    Next i
End Sub

' 4. 图表与仪表盘
Sub GeneratePerformanceCharts()
    ' 这里可以复用你之前的图表逻辑
    ' 如果需要针对【汇总分析日志】生成图表,可以修改这里的逻辑
End Sub

Sub CreateDashboard()
    ' 仪表盘生成逻辑
End Sub

Function PrepareLogSheet(sn As String) As Worksheet
    ' 辅助工具
    Set PrepareLogSheet = Sheets.Add
    PrepareLogSheet.Name = sn
End Function
实现表6:
' =================================================================
' 核心改进:梯度加压测试
' =================================================================
Sub RunSensitivityAnalysis()
    Dim wsEcon As Worksheet, wsCore As Worksheet, wsSkill As Worksheet
    Dim wsEconLog As Worksheet, wsCoreLog As Worksheet, wsSkillLog As Worksheet
    
    Set wsEcon = Sheets("经济平衡表")
    Set wsCore = Sheets("核心数值平衡表")
    Set wsSkill = Sheets("技能树与成长库")
    
    Set wsEconLog = PrepareLogSheet("经济的回溯日志")
    Set wsCoreLog = PrepareLogSheet("核心的回溯日志")
    Set wsSkillLog = PrepareLogSheet("技能的回溯日志")
    
    ' 定义一个梯度循环:从 1% 到 5%
    Dim step As Integer
    For step = 1 To 5
        Dim rate As Double
        rate = step * 0.01 ' 依次产生 0.01, 0.02, 0.03, 0.04, 0.05
        
        ' 执行梯度测试
        Call TestImpact(wsEcon, "C2", rate, wsEconLog)
        Call TestImpact(wsCore, "B3", rate, wsCoreLog)
        
        Dim i As Integer
        For i = 2 To 5
            Call TestImpact(wsSkill, "C" & i, rate, wsSkillLog)
        Next i
    Next step
    
    MsgBox "梯度压力测试已完成,日志已更新。"
End Sub

' 辅助工具:增加参数,记录具体的测试比例
Sub TestImpact(ws As Worksheet, addr As String, rate As Double, logWs As Worksheet)
    Dim org As Double, testV As Double, r As Long
    org = Val(ws.Range(addr).Value)
    testV = org * (1 + rate)
    
    ' 临时修改值
    ws.Range(addr).Value = testV
    
    ' 记录到日志
    r = logWs.Cells(logWs.Rows.Count, 1).End(xlUp).Row + 1
    logWs.Cells(r, 1).Value = ws.Name & "!" & addr
    logWs.Cells(r, 2).Value = org
    logWs.Cells(r, 3).Value = testV
    logWs.Cells(r, 4).Value = "变动率: " & (rate * 100) & "%"
    
    ' 恢复原值
    ws.Range(addr).Value = org
End Sub

一些不重要的VBA代码优化细节/思考/以后可以注意的点(无关本项目)

1.可以把问AI的代码改为对代码的自动化的提问方式

比如AI说可以设置可以改数值的选项->改为写代码自动对不适合某要求时触发改一些变量数值->写循环调优功能的代码

也不知道这是自动化还是数学建模思维中的某一步?

循环调优: 把AI说的手动调整数值大小改为,不符合某种要求时。在一步步微调,微调的范围在一个循环中

这一核心机制由 SensitivityManagerScanRange 两个函数联手实现。以下是它是如何一步步完成“调优”的:

' =================================================================
' 核心调优逻辑实现 (SensitivityManager & ScanRange)
' =================================================================

Sub SensitivityManager()
    ' ... (初始化代码) ...
    
    ' [第一层] 确定调优目标 (控制台)
    ' 遍历定义的 targets 清单,决定下一步去修改哪一条流水线
    For i = LBound(targets) To UBound(targets)
        ' ... (解析地址) ...
        Set wsTarget = Sheets(wsName)
        Call ScanRange(wsTarget, addr, wsLog)
    Next i
End Sub

Sub ScanRange(ws As Worksheet, addr As String, logWs As Worksheet)
    Dim rng As Range, cell As Range
    Set rng = ws.Range(addr)
    
    ' [第二层] 定位调优精度 (细分扫描)
    ' 在选定范围内逐个单元格扫描,确保没有遗漏任何一个变量点
    For Each cell In rng
        If IsNumeric(cell.Value) And cell.Value <> 0 Then
            Dim org As Double: org = cell.Value
            
            ' [第三层] 核心调优动作 (梯度 Loop)
            ' 这是真正的“调优”环节,梯度变化与实验复位
            For step = 1 To 5
                Dim rate As Double: rate = step * 0.01
                
                ' 1. 修改数值: 模拟“提高 1% 到 5%”
                cell.Value = org * (1 + rate)
                
                ' 2. 运行模拟: 把改变后的参数扔进模型跑一遍
                Call RunSmartSimulation
                
                ' 3. 结果记录: 将变动后的结果存入日志
                ' ... (记录逻辑) ...
                
                ' 4. 复位 (Reset): 最关键的一步
                ' 确保模型恢复原始数据,保证“控制变量法”的纯粹性
                cell.Value = org 
            Next step
        End If
    Next cell
End Sub

最后那个控制变量: 因为你要改很多列的数值,调完这一列的参数你要去改下一列之前(表1的C列,D列/表2的B列/表3的C列里的参数)。必须把已经修改后的上一列的调回到修改之前

1.1循环调优要注意微调+回溯记录到日志文件:

改一个数值/代码 可能对其他数值都出错,整个系统相互关联(微调0.02/次与回溯调整的记录)

1.2日志集中化:

记录到可以回溯的日志记录表,要控制变量.本来想对表1,表2,表4分别回溯到3个日志表。但是一个表出问题你可能要来换换表来回改代码等可能情况。所以日志集中化统一把对不同变量修改的运行结果放到同一张表

2.复用性 (Reusability):

写一个总函数/类,程序先执行该函数,该函数内有其他函数调用/类调用。类似Java代码优先从main函数开始执行,main函数里写一堆函数调用

概念 描述
模块化 (Modularity) 每个函数对应一个功能: 将复杂任务拆解为小的、可复用的独立子程序(Sub函数)。这让你能像搭积木一样管理代码。
关注点分离 (Separation of Concerns) 每个函数只做一件事(例如:SensitivityManager 只管分析,CreateDashboard 只管界面)。
抽象 (Abstraction)

RunFullProcess 就像一个指挥官,它不需要知道分析引擎具体怎么运行,只需要知道“下达命令”即可。这屏蔽了复杂细节。

入口点模式 (Entry Point Pattern) 类似 Java 的 public static void main。在 VBA 中,虽然没有强制的入口,但通过一个专门的 Main 过程来调度,是保持工程整洁的行业最佳实践。
概念 核心关注点 你的角色 你的目标
结构化编程 流程顺序 逻辑的构建者 防止“面条代码”,保证可读性与复用性。
控制者模式 交互/输入 交通警察 将“请求”与“处理”解耦,处理用户指令。
编排模式 协作/流转 项目总管 协调多个独立模块/服务,管理任务的成功与失败。

3.设置在运行开始时期自动对所有页表的撤销工作表保护(可以有密码),运行结束(end+函数名())后自动对所有页表加上工作表保护

这下面标签在我写项目时怎么还给我加了运维?自动化和运维有必然联系?,我是写完才发现.

所以大家谁知道吗

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐