AJsStack
AJsStack

Reputation: 271

'Rock, Paper, scissor' logic to get result 'Win, Lose, Draw' in vb.net using loop or If Statements

Im head is spinning right now, and its probably because I've missed out some basic logic.

I have a 'Rock, Paper, scissor' program in VB.NET which gives the correct results for each individual game/round. The problem that I have is when trying to determine the result for a MATCH which can also be a 'Win, Loose, Draw'. Matches are Best-of-3 (first to 2) and Best-of-5 (first to 3). As the outcome of the match can be a draw, this has various combinations/permutations such as:

  1. W, L, D
  2. L, W, D
  3. L, D, W
  4. D, L, W
  5. W, D, L, .... etc...

I have the following code so far:

    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

I thought I was doing good until I remembered that I completely forgot about the Draw/Tie. Since then my head has been looping so could someone kindly shed some light on how to get findMatchWinner() function working properly?

Any help would be greatly appreciated.

Manys thanks in advance

Upvotes: 0

Views: 1017

Answers (1)

Nashibukasan
Nashibukasan

Reputation: 2028

I would suggest that instead of checking how many wins there were for one player and seeing if it was the amount expected for the amount of rounds played you could just record the wins for both payers and compare them at the end.

If Player A > Player B then Player A wins, if they are the same it is a draw. Also, remember that a game of 3 rounds does not need 2 wins for a winner as Player A could win once and then all other games could be Draws.

Upvotes: 1

Related Questions