0

私の頭は今回転しています、そしてそれはおそらく私がいくつかの基本的な論理を逃したためです。

VB.NETに「じゃんけん」プログラムがあり、個々のゲーム/ラウンドごとに正しい結果が得られます。私が抱えている問題は、「勝ち、負け、引き分け」でもあるMATCHの結果を決定しようとするときです。一致するのは、Best-of-3(最初から2)とBest-of-5(最初から3)です。試合の結果は引き分けになる可能性があるため、これには次のようなさまざまな組み合わせ/順列があります。

  1. W、L、D
  2. L、W、D
  3. L、D、W
  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

1人のプレーヤーの勝利数をチェックして、プレイされたラウンド数に期待される量であるかどうかを確認する代わりに、両方の支払人の勝利を記録して、最後に比較することをお勧めします。

プレーヤーA>プレーヤーBの場合、プレーヤーAが勝ち、同じ場合は引き分けになります。また、プレーヤーAが1回勝つと、他のすべてのゲームが引き分けになる可能性があるため、3ラウンドのゲームでは勝者が2勝する必要はありません。

于 2012-12-21T03:37:31.027 に答える