You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell实现符合规则的随机格斗组合生成求助

解决方案:基于状态过滤的动态动作组合生成

核心思路

不用预定义所有组合,而是逐个动作生成,根据当前状态动态过滤可选动作,既满足规则又灵活扩展。关键是跟踪三个状态:当前序列的最后一个动作、连续Knee的次数,以及是否是组合的第一个动作,用Where-Object动态筛选合法动作列表,避免繁琐的嵌套IF。

完整修改代码

# Number callout system for cardio kickboxing
# Version 2.0 - 支持符合规则的组合生成
# Created by Burger

# 动作列表(可直接新增,无需修改规则逻辑)
$allMoves = @('1','2','3','4','Knee')

# 配置参数
[int]$minComboLength = 2    # 组合最少动作数
[int]$maxComboLength = 4    # 组合最多动作数
[int]$minPause = 2          # 组合间最短休息秒数
[int]$maxPause = 6          # 组合间最长休息秒数
[int]$sessionDuration = 1   # 训练时长(分钟)

# 初始化训练计时
$timeStart = Get-Date
$timeEnd = $timeStart.AddMinutes($sessionDuration)
Write-Host "Start Time: $timeStart"
Write-Host "End Time:   $timeEnd`n"

# 训练循环
do {
    $timeNow = Get-Date
    if ($timeNow -ge $timeEnd) {
        Write-Host "`nGreat Work. It's time for your Cool Down. :)"
        break
    }

    # 生成符合规则的动作组合
    $currentCombo = @()
    $lastMove = $null
    $kneeStreak = 0

    # 确定当前组合的长度
    $comboLength = Get-Random -Minimum $minComboLength -Maximum ($maxComboLength + 1)

    for ($i = 0; $i -lt $comboLength; $i++) {
        # 根据当前状态筛选合法动作
        $validMoves = $allMoves | Where-Object {
            # 规则1:组合第一个动作不能是4或Knee
            if ($i -eq 0) {
                $_ -notin @('4', 'Knee')
            }
            else {
                $valid = $true
                # 规则2:1之后不能跟3
                if ($lastMove -eq '1' -and $_ -eq '3') { $valid = $false }
                # 规则3:不能连续3次Knee
                if ($kneeStreak -eq 2 -and $_ -eq 'Knee') { $valid = $false }
                $valid
            }
        }

        # 随机选一个合法动作
        $selectedMove = Get-Random -InputObject $validMoves
        $currentCombo += $selectedMove

        # 更新状态
        $lastMove = $selectedMove
        $kneeStreak = if ($selectedMove -eq 'Knee') { $kneeStreak + 1 } else { 0 }
    }

    # 播报组合(用逗号分隔)
    Write-Host "组合: $($currentCombo -join ', ')"
    # 休息
    $pauseSeconds = Get-Random -Minimum $minPause -Maximum $maxPause
    Start-Sleep -Seconds $pauseSeconds

} until ($timeNow -ge $timeEnd)

关键逻辑解释

  1. 状态跟踪:用$lastMove记录上一个动作,$kneeStreak记录连续Knee的次数,$i判断是否是组合第一个动作,这些状态是动态筛选的依据。
  2. 动态筛选合法动作:每次生成动作前,用Where-Object根据当前状态过滤动作列表,自动排除违反规则的选项,比嵌套IF更清晰易扩展。
  3. 组合长度随机:通过$minComboLength和$maxComboLength控制每次生成的组合动作数量,灵活调整训练强度。
  4. 解决之前的报错:之前的报错是因为直接对数组进行了不恰当的类型转换,现在通过逐个生成动作并拼接成数组,再用-join转换成字符串播报,避免类型错误。

扩展建议

  • 新增动作时,直接在$allMoves里添加即可,只要规则不变,无需修改筛选逻辑。
  • 如果要加新规则,比如“2之后不能跟4”,只需要在Where-Object里新增对应的判断条件。

内容的提问来源于stack exchange,提问作者Burger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:25:21