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)
关键逻辑解释
- 状态跟踪:用
$lastMove记录上一个动作,$kneeStreak记录连续Knee的次数,$i判断是否是组合第一个动作,这些状态是动态筛选的依据。 - 动态筛选合法动作:每次生成动作前,用
Where-Object根据当前状态过滤动作列表,自动排除违反规则的选项,比嵌套IF更清晰易扩展。 - 组合长度随机:通过
$minComboLength和$maxComboLength控制每次生成的组合动作数量,灵活调整训练强度。 - 解决之前的报错:之前的报错是因为直接对数组进行了不恰当的类型转换,现在通过逐个生成动作并拼接成数组,再用
-join转换成字符串播报,避免类型错误。
扩展建议
- 新增动作时,直接在
$allMoves里添加即可,只要规则不变,无需修改筛选逻辑。 - 如果要加新规则,比如“2之后不能跟4”,只需要在
Where-Object里新增对应的判断条件。
内容的提问来源于stack exchange,提问作者Burger
相关产品推荐
相关产品推荐

