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

Excel VBA开发War纸牌游戏多次平局动态分配卡牌问题咨询

Excel VBA War纸牌连续平局功能实现

实现思路

  • 新增动态数组存储对局累计的所有卡牌(奖池),只要未分出胜负就持续往奖池追加双方新打出的卡牌
  • 修正原有代码中随机数生成、牌堆读取的语法错误,补充抽牌后删除原牌堆已打出卡牌的逻辑
  • 用循环结构处理连续平局场景,直到双方打出的卡牌数值不等时终止循环,将奖池内所有卡牌全部分配给胜者

完整可运行代码

Private Sub Play_Click()
    Dim P1LR As Long, P2LR As Long
    Dim P1CardArr As Variant, P2CardArr As Variant
    Dim P1DrawIdx As Long, P2DrawIdx As Long
    Dim P1PlayVal As Long, P2PlayVal As Long
    Dim prizePool As Variant
    Dim i As Long, winFlag As Integer ' winFlag=1玩家1胜,=2玩家2胜
    
    Randomize ' 初始化随机数种子,避免每次随机结果重复
    ReDim prizePool(0 To 0) ' 初始化奖池
    
    ' 读取双方当前牌堆
    P1LR = Cells(Rows.Count, 1).End(xlUp).Row
    P2LR = Cells(Rows.Count, 2).End(xlUp).Row
    ' 边界判断:任意一方牌数为0直接结束
    If P1LR < 2 Or P2LR < 2 Then
        MsgBox IIf(P1LR < 2, "玩家2获胜!", "玩家1获胜!")
        Exit Sub
    End If
    P1CardArr = Range("A2:A" & P1LR).Value
    P2CardArr = Range("B2:B" & P2LR).Value
    
    ' 循环处理平局,直到分出胜负
    Do
        ' 玩家1随机抽牌
        P1DrawIdx = Int((UBound(P1CardArr, 1) - LBound(P1CardArr, 1) + 1) * Rnd + LBound(P1CardArr, 1))
        P1PlayVal = P1CardArr(P1DrawIdx, 1)
        ' 从玩家1牌堆删除已打出的牌
        For i = P1DrawIdx To UBound(P1CardArr, 1) - 1
            P1CardArr(i, 1) = P1CardArr(i + 1, 1)
        Next
        ReDim Preserve P1CardArr(1 To UBound(P1CardArr, 1) - 1, 1 To 1)
        
        ' 玩家2随机抽牌
        P2DrawIdx = Int((UBound(P2CardArr, 1) - LBound(P2CardArr, 1) + 1) * Rnd + LBound(P2CardArr, 1))
        P2PlayVal = P2CardArr(P2DrawIdx, 1)
        ' 从玩家2牌堆删除已打出的牌
        For i = P2DrawIdx To UBound(P2CardArr, 1) - 1
            P2CardArr(i, 1) = P2CardArr(i + 1, 1)
        Next
        ReDim Preserve P2CardArr(1 To UBound(P2CardArr, 1) - 1, 1 To 1)
        
        ' 两张牌加入奖池
        If UBound(prizePool) > 0 Or prizePool(0) <> Empty Then
            ReDim Preserve prizePool(0 To UBound(prizePool) + 1)
        End If
        prizePool(UBound(prizePool)) = P1PlayVal
        ReDim Preserve prizePool(0 To UBound(prizePool) + 1)
        prizePool(UBound(prizePool)) = P2PlayVal
        
        ' 判断胜负
        If P1PlayVal > P2PlayVal Then
            winFlag = 1
            Exit Do
        ElseIf P2PlayVal > P1PlayVal Then
            winFlag = 2
            Exit Do
        End If
        ' 平局则继续循环,再次抽牌
    Loop While True
    
    ' 展示本轮打出的最后一组牌
    Range("G2").Value = P1PlayVal
    Range("H2").Value = P2PlayVal
    
    ' 奖池卡牌分配给胜者
    If winFlag = 1 Then
        ' 清空原有玩家1牌堆,写入更新后的牌堆+奖池
        Range("A2:A" & P1LR).ClearContents
        For i = 1 To UBound(P1CardArr, 1)
            Cells(i + 1, 1).Value = P1CardArr(i, 1)
        Next
        For i = 0 To UBound(prizePool)
            Cells(UBound(P1CardArr, 1) + 2 + i, 1).Value = prizePool(i)
        Next
    Else
        ' 清空原有玩家2牌堆,写入更新后的牌堆+奖池
        Range("B2:B" & P2LR).ClearContents
        For i = 1 To UBound(P2CardArr, 1)
            Cells(i + 1, 2).Value = P2CardArr(i, 1)
        Next
        For i = 0 To UBound(prizePool)
            Cells(UBound(P2CardArr, 1) + 2 + i, 2).Value = prizePool(i)
        Next
    End If
End Sub

功能说明

  • 支持任意次数连续平局的自动处理,所有对局期间打出的卡牌都会累计到奖池,最终全部分配给胜者
  • 补充了牌堆空了之后的胜负判定逻辑
  • 修正了原代码中随机数生成、牌堆操作的语法错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:06:03