19. Apr 2024, 19:43
VB-fun.de - Beitragsübersicht zum VB-/VBA-Forum-Archiv 0413
  VB6: Pokerengine - Straight, OESD, Gutshot usw. erkennen?
 Von  Yardbird
 Am  05. Oktober 2008 um 23:46:05
 Frage Hallo.
Ich habe folgende 3 Probleme. Ich will eine Straight erkennen. Dies allerdings aus 5-7 Karten. Also die Kartenzahl ist variable.
Erst sortiere ich die Karten nach Größe: (A=14,K=13 usw.)
Dann sehen die C() bspw. so aus:
C(0)=14;C(1)=12;C(2)=10;C(3)=6;C(4)=3
Dann prüfe ich die Differenz zur nächsten Karte.
Private Sub Straight()
Dim i As Integer
Dim C(6) As Integer
Dim intZaehler As Integer
Dim intNumber As Integer
blnGutShot = False
blnDblGutShot = False
blnOESD = False
blnStraight = False
For i = 0 To 6
C(i) = K(i)
Next i
intZaehler = 0
QuickSortNum C, 0, 6
If C(6) - C(0) = -12 Then
intZaehler = intZaehler + 1
intNumber = 6
End If
If C(5) - C(6) = 1 Then
intZaehler = intZaehler + 1
intNumber = 5
End If
If C(4) - C(5) = 1 Then
intZaehler = intZaehler + 1
intNumber = 4
End If
If C(3) - C(4) = 1 Then
intZaehler = intZaehler + 1
intNumber = 3
End If
If C(2) - C(3) = 1 Then
intZaehler = intZaehler + 1
intNumber = 2
End If
If C(1) - C(2) = 1 Then
intZaehler = intZaehler + 1
intNumber = 1
End If
If C(0) - C(1) = 1 Then
intZaehler = intZaehler + 1
intNumber = 0
End If

'????????????????? Gutshot ????????????????? Bsp: 2 4 | 5 6 OR K Q | 2 T 5 | 9
'????????????????? Doppelter Gutshot ????????????????? Bsp: 5 6 | 3 2 8 | 9

If intZaehler = 3 Then 'OESD
For i = 0 To 6
If intNumber = i Then
If C(i) - C(i + 3) = 3 Then blnOESD = True
End If
Next i
End If
If intZaehler = 4 Then 'Straight - OHNE A-5 prüfen
For i = 0 To 6
If intNumber = i Then
If C(i) - C(i + 4) = 4 And C(0) - C(1) = 1 And C(1) - C(2) = 1 And C(2) - C(3) = 1 And C(3) - C(4) = 1 And C(4) - C(5) = 1 Then blnStraight = True
End If
Next i
End If

For i = 0 To 6
If C(i) = 14 Then C(i) = 1 'Wert Ass=14 In Ass=1 umwandeln
Next i
If intZaehler = 4 Then 'Straight - MIT A-5 prüfen
For i = 0 To 6
If intNumber = i Then
If C(i) - C(i + 4) = 4 Then blnStraight = True
End If
Next i
End If
For i = 0 To 6
If C(i) = 1 Then C(i) = 14 'Wert Ass=1 In Ass=14 umwandeln
Next i
End Sub
1. Problem:
Die Straight Ohne A-5 wird nicht immer erkannt.
2. Problem:
Wie erkenne ich einen GutShot?
3. Problem:
Wie erkenne ich einen doppelten GutShot?

Ich weiß nicht, ob diese Differenz-Geschichte so eine gute Sache ist.
Vielleicht fällt jemanden etwas besseres ein.

Schönen Gruß
Yardbird
 Antwort:
 Von Bertha
 Am 08. Oktober 2008 um 20:33:43
 Antwort Hallo YardBird,


um die Sache zu vereinfachen könnte man zuerst alle doppelten Karten aus dem Array eliminieren und die Anzahl der verbleibenden relevanten Karten ermitteln. (Zwei Zehnen, zwei Könige tragen nichts zur "Straightbildung" bei … )

Dann muss man nur noch die auf einander folgenden Vierer- und Fünfer-Kombinationen untersuchen, und hier interessiert dann auch nur noch die Differenz der ersten zu der letzten Karte (was einer doppelter Gutshot ist weiß ich allerdings nicht, den habe ich erst einmal nicht in Betracht gezogen):


ViererKombi/Differenz 3 => OESD

ViererKombi/Differenz 4 => Gutshot

FünferKombi/Differenz 4 => Straight

FünferKombi/Differenz 5 => Gutshot

FünferKombi/Differenz 6 => vielleicht der doppelte Gutshot


Wie man die Kombinationen dann erstellt, ist sicherlich Geschmackssache, ich habe dazu eine sich wiederkehrend aufrufende Prozedur eingesetzt. Außerdem habe ich die Resultate nicht bewertet und mit weiterführenden Aktionen versehen, sondern nur gezählt.
    Dim PlayingCards() As Integer 'Array mit den verbleibenden relevanten Karten
Dim OESDCnt As Integer 'Anzahl der OESD
Dim GSCnt As Integer 'Anzahl der Gutshots
Dim StraightCnt As Integer 'Anzahl der Straights
Dim NumOfRelCards As Integer 'Anzahl der Relevanten Karten

Private Sub StartStraightCheck()
CheckPlayCards(NumOfRelCards, 0, NumOfRelCards - 1, 0)
'Falls CheckPlayCards(NumOfRelCards - 1) = Wert für Ass
'dann CheckPlayCards(NumOfRelCards - 1) = Kleiner Wert für Ass
'Neu sortieren
'CheckPlayCards(NumOfRelCards, 0, NumOfRelCards - 1) noch einmal aufrufen
End Sub

Private Sub CheckPlayCards(ByVal NumofCards As Integer, ByVal StartCard As Integer, ByVal EndCard As Integer _
, ByVal AufrufausBlock As Integer)
Dim i As Integer
Select Case NumofCards
Case 4
Select Case PlayingCards(EndCard) - PlayingCards(StartCard)
Case 3
OESDCnt = OESDCnt + 1
Case 4
GSCnt = GSCnt + 1
End Select

Case 5
Select Case PlayingCards(EndCard) - PlayingCards(StartCard)
Case 4
StraightCnt = StraightCnt + 1

Case 5
' GSCnt = GSCnt + 1
'Ist zwar ein Gutshot, wird aber später noch im
'Select Case NumofCards >> Case 4 Block identifiziert

Case 6
'Schlägt hier vielleicht der Doppelte Gutshot auf ???

End Select

For i = AufrufausBlock To 1
CheckPlayCards(4, StartCard + i, EndCard + i - 1, i)
Next

Case 6
For i = AufrufausBlock To 1
CheckPlayCards(5, StartCard + i, EndCard + i - 1, i)
Next

Case 7
For i = AufrufausBlock To 1
CheckPlayCards(6, StartCard + i, EndCard + i - 1, i)
Next

End Select

End Sub
Gruß Bertha
[ VB-/VBA-Forum | Archiv 0413 | Archiv-Übersicht ]
 Antworten
VB6: Pokerengine - Straight, OESD, Gutshot usw. erkennen? - Yardbird 05. Oktober 2008 um 23:46:05
Re: Pokerengine - Straight, OESD, Gutshot usw. erkennen? - Bertha 08. Oktober 2008 um 20:33:43

Zum Seitenanfang

Startseite | VB-/VBA-Tipps | Projekte | Tutorials | API-Referenz | Komponenten | Bücherecke | Gewinnspiele | VB-/VBA-Forum | DirectX | DirectX-Forum | VB.Net | VB.Net-Forum | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum