Avatar billede blach Nybegynder
05. januar 2003 - 17:55 Der er 14 kommentarer og
2 løsninger

Poker hånd

Jeg er ved at lave et spil poker og er kommet til, at den skal skrive, hvilken hånd man sidder med. Altså f.eks. "Et par: es"
Den skal selvfølgelig gå efter rangordenen, som jeg fandt her:
http://www.casinoguide.dk/regler/poker.asp

Spillerens 5 kort ligger i en liste ( Lst(0) ) og er betegnet på følgende måde:
Hjerter 1-13: h1-h13
Ruder 1-13: r1-r13
Spar 1-13: s1-s13
Klør 1-13: k1-k13
-Listen er ikke sorteret; de 5 kort ligger tilfældigt..

Nogen der kan hjælpe med at programmere dette på en smart måde??
Avatar billede martin_moth Mester
05. januar 2003 - 19:42 #1
Der er jo kun 10 mulige hænder ifølge dit link - er det ikke bare at lave en select case?
Avatar billede blach Nybegynder
05. januar 2003 - 20:08 #2
10 muligheder? Bare inden for "2 par" er der mange muligheder...
Man må kunne lave et eller andet smart.. f.eks. når der skal tjekkes om man har flere af en slags, kigge væk fra det første bogstav (h/r/s/k) og så tælle hvor mange man har af hver slags fra 1-13..?
Avatar billede martin_moth Mester
05. januar 2003 - 20:47 #3
Jeg mener - der er ti "typer" af hænder. Disse kan findes med en select case, og når det er bestemt om du har en Straight, et par eller hvad du nu har, så udskriver du mere specifikt, fx. To par, par 9 (hjerter + klør) samt Par 2, (spar + klør)

Så lav en select case på de fem kort i listen. Tjek om de opfylder en af de ti typer hænder. Gør den det, udskriver du en besked på baggrund af de aktuelle kort.

Jeg tvivler på at der er en "smartere" måde end at bruge select case, eller alternativt en masse if'er.
Avatar billede martin_moth Mester
05. januar 2003 - 20:51 #4
PS: En god ide er at lave det objektorienteret, men en klasse "clsKort", der indeholder 52 objekter med bl.a. egenskaberne Værdi og Kulør. Når du først har oprettet den klasse, er der mange ting der bliver nemmere, mener jeg.
Men det betyder, at du måske skal starte forfra, derfor tvivler jeg på at du vil "købe" ideen (selvom den er rigtig god). Lavede nemlig engang selv et kortspil i VB, og fik STORE fordele af at lave det objektorienteret - bare en ide ;o)
Avatar billede blach Nybegynder
06. januar 2003 - 16:19 #5
Kan du måske hjælpe med lidt kode?
Det Select Case du snakker om f.eks...

Jeg ved ikke hvad objektorienteret vil sige.. -første gang jeg sådan rigtigt laver noget i det her program!
Avatar billede martin_moth Mester
06. januar 2003 - 16:42 #6
Objektorienteret programmering er en programmeringsmetode, der ikke er specifik for VB. Se evt. http://www.eksperten.dk/spm/290397

Som altid når du programmere - sæt dig ned og find ud af hvad du vil inden du koder. Min fremgangsmåde - hvis det ikke skal være objektorienteret - ville først og fremmest at definere en type ved navn kort:

  Type Kort
    Værdi As Byte
    Kulør as String*1
  End Type

Herefter kan du lave arrays med kort

  KortArray(1 To 52) As kort

Og skrive/læse kortværdier med

  Kort.Værdi = ...
  Kort.Kulør = ...


Men uanset om du bruger selvdefinerede typer + Arrays eller listboxe, som du har valgt, vil princippet i min løsning være at lave 10 funktioner, fx:

  Private function EtPar( diverse parametre, evt. FemKort as Listbox) as boolean
    EtPar=False
    'bestem om der er et par... Er der et par sæt EtPar=True
  End function

og tilvarende for de resterende 9 mulige hænder. Herefter kan du bruge en select case eller nogle if'ere:

  if EtPar(Listbox1) = true then
    msgbox "du har et par"

Evt. kan du have de 10 funktioner til at returnerer det specifikke par (fx. klør og spar 8) i en string. Eller du kan lave een stor funktion og lave en select case på hvilken værdi funktionen returnerer. Eller lave det helt uden funktioner, hvis du ikke kan lide dem.
Avatar billede martin_moth Mester
08. januar 2003 - 14:52 #7
Er du med, blach?
Avatar billede blach Nybegynder
10. januar 2003 - 14:39 #8
Jeg har selv forsøgt vha. en sortering i en liste.. Dette ud fra reglerne her: http://www.21winners.dk/online-spil/poker.htm
Koden skelner først mellem om der er nogle ens kort (par) eller alle kortene er numererisk forskellige. Det sidste virker fint, men jeg har nogle problemer ved identificeringen af par.. F.eks. ved 2 par og fuldt hus har jeg problemer.

Kan du hjælpe med dette, Martin Moth?
Så får du de 120 point... Jeg kan også sende dig hele spillet hvis det er!?

::::::::::::::::::::::: KODEN ::::::::::::::::::::::
Private Sub Command3_Click()

' sortering i listen Lst(2):
Lst(2).AddItem Lst(0).List(0)
Lst(2).AddItem Lst(0).List(1)
Lst(2).AddItem Lst(0).List(2)
Lst(2).AddItem Lst(0).List(3)
Lst(2).AddItem Lst(0).List(4)
' de sorterede kort gemmes:
kort1 = Lst(2).List(0)
kort2 = Lst(2).List(1)
kort3 = Lst(2).List(2)
kort4 = Lst(2).List(3)
kort5 = Lst(2).List(4)

If Right(kort1, "2") <> Right(kort2, "2") And Right(kort1, "2") <> Right(kort3, "2") And Right(kort1, "2") <> Right(kort4, "2") And Right(kort1, "2") <> Right(kort5, "2") And Right(kort2, "2") <> Right(kort3, "2") And Right(kort2, "2") <> Right(kort4, "2") And Right(kort2, "2") <> Right(kort5, "2") And Right(kort3, "2") <> Right(kort4, "2") And Right(kort3, "2") <> Right(kort5, "2") And Right(kort4, "2") <> Right(kort5, "2") Then
' tjek om de har forskellige numre
    If Left(kort1, "1") = Left(kort2, "1") And Left(kort1, "1") = Left(kort3, "1") And Left(kort1, "1") = Left(kort4, "1") And Left(kort1, "1") = Left(kort5, "1") Then
    ' tjek om samme kulør
        If Right(kort1, "2") = "10" And Right(kort2, "2") = 11 And Right(kort3, "2") = 12 And Right(kort4, "2") = 13 And Right(kort1, "2") = 1 Then
        ' tjek om det er 10 - es
            Label5.Caption = "ROYAL FLUSH"
            Label7.Caption = (Label7.Caption + 750)
        End If
        If Right(kort4, "2") = (Right(kort5, "2") - 1) And Right(kort3, "2") = (Right(kort4, "2") - 1) And Right(kort2, "2") = (Right(kort3, "2") - 1) And Right(kort1, "2") = (Right(kort2, "2") - 1) Then
        ' tjek om de 5 ligger i rækkefølge
            Label5.Caption = "STRAIGHT FLUSH"
            Label7.Caption = (Label7.Caption + 150)
        Else
        ' 5 med ens kulør men ingen rækkefølge
            Label5.Caption = "FLUSH"
            Label7.Caption = (Label7.Caption + 15)
        End If
    Else
    ' Hverken par eller samme kulør
        ' sortering i nummerisk rækkefølge i listen Lst(2):
        Lst(2).Clear
        Lst(2).AddItem Right(kort1, "2")
        Lst(2).AddItem Right(kort2, "2")
        Lst(2).AddItem Right(kort3, "2")
        Lst(2).AddItem Right(kort4, "2")
        Lst(2).AddItem Right(kort5, "2")
        ' de sorterede kort gemmes:
        kort1 = Lst(2).List(0)
        kort2 = Lst(2).List(1)
        kort3 = Lst(2).List(2)
        kort4 = Lst(2).List(3)
        kort5 = Lst(2).List(4)
        If kort4 = (kort5 - 1) And kort3 = (kort4 - 1) And kort2 = (kort3 - 1) And kort1 = (kort2 - 1) Then
        ' tjek om de 5 ligger i rækkefølge
            Label5.Caption = "STRAIGHT"
            Label7.Caption = (Label7.Caption + 12)
        Else
            Label5.Caption = "Du tabte rundten!"
        End If
    End If
Else
' 4, 3 eller 2 ens? 2 par eller fuldt hus?
    ' sortering i nummerisk rækkefølge i listen Lst(2):
    Lst(2).Clear
    Lst(2).AddItem Right(kort1, "2")
    Lst(2).AddItem Right(kort2, "2")
    Lst(2).AddItem Right(kort3, "2")
    Lst(2).AddItem Right(kort4, "2")
    Lst(2).AddItem Right(kort5, "2")
    ' de sorterede kort gemmes:
    kort1 = Lst(2).List(0)
    kort2 = Lst(2).List(1)
    kort3 = Lst(2).List(2)
    kort4 = Lst(2).List(3)
    kort5 = Lst(2).List(4)
   
    If (kort1 - kort2) = 0 Then
    ' tjek om kort1 og kort2 danner par
        If (kort1 - kort2) = 0 And (kort3 - kort4) = 0 Then
            If (kort1 - kort4) = 0 Then
                Label5.Caption = "FOUR OF A KIND"
                Label7.Caption = (Label7.Caption + 75)
            Else
                Label5.Caption = "TWO PAIR"
                Label7.Caption = (Label7.Caption + 6)
            End If
        End If
        If ((kort1 - kort3) = 0 And (kort4 - kort5) = 0) Or ((kort1 - kort2) = 0 And (kort3 - kort5) = 0) Then
            Label5.Caption = "FULL HOUSE"
            Label7.Caption = (Label7.Caption + 24)
        End If
        If (kort1 - kort3) = 0 Then
            Label5.Caption = "THREE OF A KIND"
            Label7.Caption = (Label7.Caption + 9)
        Else
            If kort1 > 10 Or kort1 = 1 Then
            ' tjek om parret er knægt - es
                Label5.Caption = "JACKS OR BETTER"
                Label7.Caption = (Label7.Caption + 3)
            Else
                Label5.Caption = "Du tabte rundten!"
            End If
        End If
    End If
   
    If (kort2 - kort3) = 0 Then
    ' tjek om kort2 og kort3 danner par
        If (kort2 - kort3) = 0 And (kort4 - kort5) = 0 Then
        ' tjek om der er 2 par eller 4 ens
            If (kort2 - kort5) = 0 Then
            ' tjek om 4 ens
                Label5.Caption = "FOUR OF A KIND"
                Label7.Caption = (Label7.Caption + 75)
            Else
            ' ellers 2 par
                Label5.Caption = "TWO PAIR"
                Label7.Caption = (Label7.Caption + 6)
            End If
        End If
        If (kort2 - kort4) = 0 Then
        ' tjek om kort2 og kort4 er ens
            Label5.Caption = "THREE OF A KIND"
            Label7.Caption = (Label7.Caption + 9)
        End If
        If kort2 > 10 Or kort2 = 1 Then
        ' tjek om parret er knægt - es
            Label5.Caption = "JACKS OR BETTER"
            Label7.Caption = (Label7.Caption + 3)
        Else
            Label5.Caption = "Du tabte rundten!"
        End If
    End If
   
    If (kort3 - kort4) = 0 Then
    ' tjek om kort3 og kort4 danner par
        If (kort3 - kort5) = 0 Then
        ' tjek om kort3 og kort5 danner par
            Label5.Caption = "THREE OF A KIND"
            Label7.Caption = (Label7.Caption + 9)
        End If
        If kort3 > 10 Or kort3 = 1 Then
        ' tjek om parret er knægt - es
            Label5.Caption = "JACKS OR BETTER"
            Label7.Caption = (Label7.Caption + 3)
        Else
            Label5.Caption = "Du tabte rundten!"
        End If
    End If
   
    If (kort4 - kort5) = 0 Then
    ' tjek om kort4 og kort5 danner par
        If kort4 > 10 Or kort4 = 1 Then
        ' tjek om parret er knægt - es
            Label5.Caption = "JACKS OR BETTER"
            Label7.Caption = (Label7.Caption + 3)
        Else
            Label5.Caption = "Du tabte rundten!"
        End If
    End If
End If
End Sub
Avatar billede blach Nybegynder
10. januar 2003 - 14:40 #9
Det er altså fra disse linier jeg har brug for hjælp:
Else
' 4, 3 eller 2 ens? 2 par eller fuldt hus?
    ' sortering i nummerisk rækkefølge i listen Lst(2):
Avatar billede greatdane Nybegynder
10. januar 2003 - 14:50 #10
(*
Sidebemærkning som snildt kan springes over: Det er sådan noget her, som får mig til at beundre vore hjerner temmelig meget.  Tænk al den kode, der skal til for dette lille problem, som vi bare overskuer på et lille øjeblik, når vi sidder med kortene i hånden...

Undskyld forstyrrelsen :-)
*)
Avatar billede martin_moth Mester
10. januar 2003 - 17:36 #11
Jeg ville nu lave det som funktioner, for at det bliver mere overskueligt.

Iditenficering af 2 par - hvis jeg skal bruge samme fremgangsmåde som dig - kunne være:

kik på første kort. Har et af de andre kort samme værdi? Hvis nej, fortsæt til andet kort. Hvis ja, tjek for et par beladt de resterende 3 kort. Altså bare en masse if'ere inden i hinanden.

Jeg må indrømme, at jeg ikke har gidet læst alle dine 150 linier kode igennem :o)
Avatar billede blach Nybegynder
10. januar 2003 - 17:41 #12
hmm.. Må jeg ikke sende dig koden? Der er en fejl et eller andet sted... som jeg ikke kan finde :[
Avatar billede martin_moth Mester
10. januar 2003 - 18:17 #13
Nææ - gider ikke rette hvad der sandsynligvis er flere hundrede linier, med mindre du sender en fed check med ;o)
Får du en fejlmeddelse kan jeg hjælpe. Regner den bare "hånden forkert ud" (kan ikke finde par osv) er det blot almindelig programmering, der altså ikke regner tingene rigtigt ud -. dvs. "fejl 40". Skulle jeg finde de fejl, skulle jeg sætte mig 100% ind i en fremmeds kode, og det kan tage lang tid, især fordi jeg ville gøre tingene anderledes end du gør - jeg kunne sikkert lave det selv på den tid det ville tage mig at finde ud af alle dine små krumpspring :o)
Jeg kan anbefale først at fremmest at lave funktioner i stedet for een stor klump kode - det gør det 10 gange overskueligt og dermed nemmere at finde fejlen. Derefter lav et par milepæle, hvor du tjekker om programmet nu opfører sig som du gør - brug breakpoints eller sæt et par msgboxe
Held og lykke. (PS: Objektorienteret programmering er 100% skabt til lige dit problem)
Avatar billede martin_moth Mester
14. januar 2003 - 10:36 #14
Skal du ikke lukke spørgsmålet - eller spørge videre?
Avatar billede blach Nybegynder
14. januar 2003 - 14:20 #15
Jeg lukker, tak for hjælpen, kan godt forstå, at du ikke gider kigge den store kode igennem.
Avatar billede martin_moth Mester
14. januar 2003 - 14:24 #16
Tak for de 40 points - jeg synes det er helt i orden, at du giver lidt points, selvom du ikke fik løst problemet, for jeg har jo alligevel brugt noget tid og forhåbentligt givet dig nogle ideer. Fin stil!!! :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester