BankerWins: 45.173%
PlayerWins: 45.594%
TieWins: 9.233%
Option Explicit
Const DECK_SIZE As Integer = 52
Const TOTAL_DECKS As Integer = 8
Const MAX_ROUNDS_PER_SHOE As Long = 10
Const SHOES_TO_RUN As Long = 1000000
Dim shoe() As Integer
Dim cardIndex As Integer
Dim playerWins As Long
Dim bankerWins As Long
Dim ties As Long
Dim totalPlayerWins As Long
Dim totalBankerWins As Long
Dim totalTies As Long
' Initialize the shoe with 8 decks of cards
Sub InitializeShoe()
Dim i As Integer, j As Integer, k As Integer
Dim cardValue As Integer
ReDim shoe(1 To TOTAL_DECKS * DECK_SIZE)
k = 1
For i = 1 To TOTAL_DECKS
For j = 1 To DECK_SIZE
cardValue = j Mod 13 ' Ace = 1, 2-9, 10, J, Q, K = 0
If cardValue > 9 Then cardValue = 0 ' Face cards are 0
shoe(k) = cardValue
k = k + 1
Next j
Next i
ShuffleShoe
cardIndex = 1 ' Reset card index
End Sub
' Fisher-Yates Shuffle algorithm to shuffle the shoe
Sub ShuffleShoe()
Dim i As Integer, j As Integer
Dim temp As Integer
For i = UBound(shoe) To 2 Step -1
j = Int(Rnd * i) + 1
temp = shoe(i)
shoe(i) = shoe(j)
shoe(j) = temp
Next i
End Sub
' Draw a card from the shoe
Function DrawCard() As Integer
If cardIndex > UBound(shoe) Then
DrawCard = -1 ' No more cards to draw
Else
DrawCard = shoe(cardIndex)
cardIndex = cardIndex + 1
End If
End Function
' Calculate the total value of a hand
Function CalculateHandValue(cards As Collection) As Integer
Dim total As Integer
Dim card As Variant
total = 0
For Each card In cards
total = (total + card) Mod 10 ' Baccarat only cares about last digit
Next card
CalculateHandValue = total
End Function
' Simulate a round of Baccarat
Function PlayBaccaratRound() As Boolean
Dim playerHand As New Collection
Dim bankerHand As New Collection
Dim playerValue As Integer
Dim bankerValue As Integer
Dim playerThirdCard As Integer
Dim bankerDraw As Boolean
Dim card As Integer
' Deal two cards to Player
card = DrawCard
If card = -1 Then PlayBaccaratRound = False: Exit Function
playerHand.Add card
card = DrawCard
If card = -1 Then PlayBaccaratRound = False: Exit Function
playerHand.Add card
' Deal two cards to Banker
card = DrawCard
If card = -1 Then PlayBaccaratRound = False: Exit Function
bankerHand.Add card
card = DrawCard
If card = -1 Then PlayBaccaratRound = False: Exit Function
bankerHand.Add card
' Calculate initial hand values
playerValue = CalculateHandValue(playerHand)
bankerValue = CalculateHandValue(bankerHand)
' Check for natural hand (8 or 9) or if both hands have 6 or 7
If playerValue >= 8 Or bankerValue >= 8 Or (playerValue = 6 Or playerValue = 7) And (bankerValue = 6 Or bankerValue = 7) Then
GoTo DetermineWinner ' No more drawing; check winner directly
End If
' Player draws a third card if needed
If playerValue <= 5 Then
playerThirdCard = DrawCard
If playerThirdCard = -1 Then PlayBaccaratRound = False: Exit Function
playerHand.Add playerThirdCard
playerValue = CalculateHandValue(playerHand)
Else
playerThirdCard = -1 ' No third card drawn
End If
' Banker draws a third card based on Baccarat rules
bankerDraw = False
If bankerValue <= 2 Then
bankerDraw = True
ElseIf bankerValue = 3 Then
If playerThirdCard <> 8 Then bankerDraw = True
ElseIf bankerValue = 4 Then
If playerThirdCard >= 2 And playerThirdCard <= 7 Then bankerDraw = True
ElseIf bankerValue = 5 Then
If playerThirdCard >= 4 And playerThirdCard <= 7 Then bankerDraw = True
ElseIf bankerValue = 6 Then
If playerThirdCard = 6 Or playerThirdCard = 7 Then bankerDraw = True
End If
' Banker draws third card if needed
If bankerDraw Then
card = DrawCard
If card = -1 Then PlayBaccaratRound = False: Exit Function
bankerHand.Add card
bankerValue = CalculateHandValue(bankerHand)
End If
DetermineWinner:
' Determine winner
If playerValue > bankerValue Then
playerWins = playerWins + 1
ElseIf bankerValue > playerValue Then
bankerWins = bankerWins + 1
Else
ties = ties + 1
End If
PlayBaccaratRound = True
End Function
' Main simulation procedure for a single shoe
Sub BaccaratSimulation()
Dim result As Boolean
Dim roundsPlayed As Long
' Initialize shoe
InitializeShoe
' Reset results for this shoe
playerWins = 0
bankerWins = 0
ties = 0
roundsPlayed = 0
' Play rounds until reaching 70 rounds
Do While roundsPlayed < MAX_ROUNDS_PER_SHOE
result = PlayBaccaratRound
If result Then
roundsPlayed = roundsPlayed + 1
Else
Exit Do
End If
Loop
' Add the results of this shoe to the totals
totalPlayerWins = totalPlayerWins + playerWins
totalBankerWins = totalBankerWins + bankerWins
totalTies = totalTies + ties
' Prepare for next shoe
cardIndex = 1 ' Reset card index
ShuffleShoe ' Shuffle for new shoe
End Sub
' Run simulation for a specified number of shoes
Sub RunMultipleShoes()
Dim shoeNum As Long
' Initialize totals
totalPlayerWins = 0
totalBankerWins = 0
totalTies = 0
' Run simulation for each shoe
For shoeNum = 1 To SHOES_TO_RUN
BaccaratSimulation
Next shoeNum
' Display final results after all shoes
MsgBox "Simulation complete!" & vbCrLf & _
"Shoes Played: " & SHOES_TO_RUN & vbCrLf & _
"Total Player Wins: " & totalPlayerWins & vbCrLf & _
"Total Banker Wins: " & totalBankerWins & vbCrLf & _
"Total Ties: " & totalTies & vbCrLf & _
"Tie Percentage: " & Format((totalTies / (totalPlayerWins + totalBankerWins + totalTies)) * 100, "0.00") & "%"
End Sub
If you change the line:
playerThirdCard = -1 ' No third card drawn
to
playerThirdCard = 5 ' No third card drawn; this is treated as if the player's third card is a 5
then it should work.
Quote: ThatDonGuyBased on a quick look, I think the error is, if the player has a 5 or 6, the banker will not draw a card under any circumstances.
If you change the line:
playerThirdCard = -1 ' No third card drawn
to
playerThirdCard = 5 ' No third card drawn; this is treated as if the player's third card is a 5
then it should work.
link to original post
Thank you !
For playerThirdCard = X ' No third card drawn, I think it should work if 4<= X <= 7 , agree ?
Quote: ssho88For playerThirdCard = X ' No third card drawn, I think it should work if 4<= X <= 7 , agree ?
link to original post
X = 4 or 5 should work. If X = 6 or 7, banker will not take a card with 5.
I may have discovered why the AI made its mistake; the Venetian baccarat rules web page doesn't mention what happens when the player doesn't take a third card.
Quote: ThatDonGuyQuote: ssho88For playerThirdCard = X ' No third card drawn, I think it should work if 4<= X <= 7 , agree ?
link to original post
X = 4 or 5 should work. If X = 6 or 7, banker will not take a card with 5.
I may have discovered why the AI made its mistake; the Venetian baccarat rules web page doesn't mention what happens when the player doesn't take a third card.
link to original post
ElseIf bankerValue = 5 Then
If playerThirdCard >= 4 And playerThirdCard <= 7 Then bankerDraw = True
If Banker first two cards total is 5, and we set X = 6 or 7, Banker will take a third card. Am I missing something ?
Quote: ssho88Quote: ThatDonGuyQuote: ssho88For playerThirdCard = X ' No third card drawn, I think it should work if 4<= X <= 7 , agree ?
link to original post
X = 4 or 5 should work. If X = 6 or 7, banker will not take a card with 5.
I may have discovered why the AI made its mistake; the Venetian baccarat rules web page doesn't mention what happens when the player doesn't take a third card.
link to original post
ElseIf bankerValue = 5 Then
If playerThirdCard >= 4 And playerThirdCard <= 7 Then bankerDraw = True
If Banker first two cards total is 5, and we set X = 6 or 7, Banker will take a third card. Am I missing something ?
link to original post
No, but there is still a problem with X = 6 or 7; the banker will take a third card with a 6.
Quote: ThatDonGuyQuote: ssho88Quote: ThatDonGuyQuote: ssho88For playerThirdCard = X ' No third card drawn, I think it should work if 4<= X <= 7 , agree ?
link to original post
X = 4 or 5 should work. If X = 6 or 7, banker will not take a card with 5.
I may have discovered why the AI made its mistake; the Venetian baccarat rules web page doesn't mention what happens when the player doesn't take a third card.
link to original post
ElseIf bankerValue = 5 Then
If playerThirdCard >= 4 And playerThirdCard <= 7 Then bankerDraw = True
If Banker first two cards total is 5, and we set X = 6 or 7, Banker will take a third card. Am I missing something ?
link to original post
No, but there is still a problem with X = 6 or 7; the banker will take a third card with a 6.
link to original post
If playerValue >= 8 Or bankerValue >= 8 Or (playerValue = 6 Or playerValue = 7) And (bankerValue = 6 Or bankerValue = 7) Then
GoTo DetermineWinner ' No more drawing; check winner directly
End If
Disagree, Banker with a 6 have no chance to draw third card even X=6 or 7 due to above codes .