0

我现在头晕目眩,可能是因为我错过了一些基本逻辑。

我在 VB.NET 中有一个“Rock, Paper, scissor”程序,它为每个单独的游戏/回合提供了正确的结果。我遇到的问题是在尝试确定 MATCH 的结果时,该结果也可以是“Win,Loose,Draw”。比赛是 3 胜制(先到 2)和 5 胜制(先到 3)。由于比赛的结果可能是平局,因此有多种组合/排列方式,例如:

  1. W、L、D
  2. 左、宽、深
  3. 左、右、右
  4. D、L、W
  5. W,D,L,......等等......

到目前为止,我有以下代码:

    Public Class GameForm
    Private humanScore As Integer = 0
    Private compScore As Integer = 0
    Private drawScore As Integer = 0
    Private totalGames As Integer = 0
    Private totalGamesForWin As Integer = 0
    Private totalGamesPlayed As Integer = 0
    Private player1 = New PlayerHumanPlayer()
    Private player2 = New PlayerComputerRandom()


    Private Sub GameForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If GameTypeForm.cmboMatchDuration.SelectedItem = 0 Then
            totalGames = 3
            totalGamesForWin = 2
            lblMatchInfor.Text = GlobalVariables.MatchTypeBestOf3Message
        ElseIf (GameTypeForm.cmboMatchDuration.SelectedItem = 1) Then
            totalGames = 5
            totalGamesForWin = 3
            lblMatchInfor.Text = GlobalVariables.MatchTypeBestOf5Message
        End If

    End Sub

    Private Sub btnRock_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRock.Click
        findGameWinner("HumanPlayer", "Rock", "RandomComputer")
    End Sub

    Private Sub btnPaper_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPaper.Click
        findGameWinner("HumanPlayer", "Paper", "RandomComputer")
    End Sub


    Private Sub btnScissors_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnScissors.Click
        findGameWinner("HumanPlayer", "Scissors", "RandomComputer")
    End Sub

    Public Sub findGameWinner(ByVal p1name As String, ByVal p1WeaponSelected As String, ByVal p2Name As String)

        player1.Name = p1name
        player1.pickWeapon(p1WeaponSelected)  ' Should I be using the Rock Class???

        player2.Name = p2Name
        player2.pickWeapon()

        Dim winner As Integer = player1.getWeapon().compareTo(player2.getWeapon())

        Select Case winner
            Case 1
                updateScores(True, False)
                findMatchWinner()
            Case -1
                updateScores(False, True)
                findMatchWinner()
            Case 0
                updateScores(False, False)
                findMatchWinner()
        End Select
    End Sub

    Public Function updateScores(ByVal humanWon As Boolean, ByVal compWon As Boolean) As Integer

        If humanWon = True Then
            humanScore = humanScore + 1

            'Update Human labels
            lblPlayerScore.Text = humanScore.ToString()
            'txtCompChoice.Text = txtCompChoice.Text + Environment.NewLine + Type.GetType(player2.pWeapon.ToString()).ToString()
            txtCompChoice.Text = txtCompChoice.Text + Environment.NewLine + player2.pWeapon.ToString()
            txtGameStatus.Text = txtGameStatus.Text + Environment.NewLine + player1.Name() + " wins!"

        ElseIf compWon = True Then
            compScore = compScore + 1

            'Update Computer labels
            lblCompScore.Text = compScore.ToString()
            'txtCompChoice.Text = txtCompChoice.Text + Environment.NewLine + Type.GetType(player2.pWeapon.ToString()).ToString() 
            txtCompChoice.Text = txtCompChoice.Text + Environment.NewLine + player2.pWeapon.ToString()
            txtGameStatus.Text = txtGameStatus.Text + Environment.NewLine + player2.Name() + " wins!"

        Else
            drawScore = drawScore + 1

            'Update Draw labels
            lblDrawGame.Text = drawScore.ToString()
            'txtCompChoice.Text = txtCompChoice.Text + Environment.NewLine + Type.GetType(player2.pWeapon.ToString()).ToString()
            txtCompChoice.Text = txtCompChoice.Text + Environment.NewLine + player2.pWeapon.ToString()
            txtGameStatus.Text = txtGameStatus.Text + Environment.NewLine + "Draw!"

        End If

        totalGamesPlayed = totalGamesPlayed + 1

        Return totalGamesPlayed
    End Function


    Public Function findMatchWinner() As String

        If totalGamesPlayed <> totalGames Then
            If humanScore = totalGamesForWin Then
                lblMatchInfor.Text = GlobalVariables.HumanMacthWinMessage
                clearForm()
            ElseIf compScore = totalGamesForWin Then
                lblMatchInfor.Text = GlobalVariables.CompMacthWinMessage
                clearForm()
            ElseIf totalGamesPlayed = totalGames - 1 Then
                lblMatchInfor.Text = GlobalVariables.DeciderGameMessage
            End If
        ElseIf humanScore = totalGamesForWin Then
            lblMatchInfor.Text = GlobalVariables.HumanMacthWinMessage
            clearForm()
        ElseIf compScore = totalGamesForWin Then
            lblMatchInfor.Text = GlobalVariables.CompMacthWinMessage
            clearForm()
        ElseIf (drawScore = totalGamesPlayed) Then
            lblMatchInfor.Text = GlobalVariables.DrawMacthWinMessage
            clearForm()
        End If

        Return "Human OR Computer"
    End Function

    Public Sub clearForm()

    End Sub

End Class

我以为我做得很好,直到我想起我完全忘记了平局/平局。从那以后我的脑袋一直在循环,所以有人可以解释一下如何让 findMatchWinner() 函数正常工作吗?

任何帮助将不胜感激。

提前谢谢

4

1 回答 1

1

我建议不要检查一个玩家有多少胜利,看看它是否是预期的回合数,你可以只记录两个支付者的胜利并在最后进行比较。

如果玩家 A > 玩家 B 则玩家 A 获胜,如果相同则为平局。另外,请记住,一场 3 轮的游戏不需要 2 次获胜即可获胜,因为玩家 A 可以获胜一次,然后所有其他游戏都可能是平局。

于 2012-12-21T03:37:31.027 回答