mehrdimensionalen array vergleichen

  • hallo liebe gemeinschaft :D

    ich bin nichtmehr ganz fit im kopf und komm zu keiner lösung, daher würde ich mich über unterstützung freuen :)

    ich versuche, pokerhände zu simulieren, dazu speichere ich entsprechende Werte im array $aWert, welcher zweidimensional ist (dimension 1 = spieler zuordnung [0-n], dimension 2 = Informationen über gemachte Hand)

    die zweite dimension besteht aus verschiedenvielen elementen, je nach Hand,zwecks eindeutiger zuordnung

    beispiel:
    ein Straightflush(=7) mit 10 als höchster Karte für spieler "n" wird in 2 elementen definiert: $aWert = [n][7,10]

    zwei paare(=2) (zehner und neuner) mit hoher Karte Ass (=1) für spieler "m" ist somit:
    $aWert[m][2,10,9,1]

    jetzt möchte ich für alle spieler überprüfen, wer denn die beste hand hällt (wer also als ersten wert der 2. dimension den höchsten wert erreicht hat, bei gleichstand sollte der 2. wert überprüft werden, bei gleichstand der dritte, .....

    ich hab das gefühl ich hab mir mit meiner array-declarierung selbst ein grab geschaufelt, da ich bemi besten iwllen nicht drauf komme wie ich diese vergleichen soll :S

    so far
    lieben gruß

  • Wenn du es so angeordnet hast das der Index 0 der 2ten Dimension immer je Höher desto besser ist, müsstest du gucken ob: (aus dem Kopf hierrein geschrieben! Kann auch falsch sein :D)

    [autoit]

    If $aWert[0][0] > $aWert[1][0] Then
    ;dann wurde festgestellt das der 1. Spieler (Index 0 in dimension 1) höher ist als der zweite Spieler (Index 1 in Dimension 1)
    Endif

    [/autoit]


    Das kannst du dann auch mit den Anderen überprüfen.
    PS: Ich versteh deine Deklination nicht, hat jede 2te Dimension nur eine "spalte" oder immer mehr, für jede Spalte eine andere Zahl?

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • ich versteh deine frage nicht ^^
    also die 2. dimension besteht aus sovielen elementen wie die hand zum definieren braucht, also für jeden wert einen anderen index (kein string, der alle werte enthält, meinst du das mit der "spalte"?)

    da weder spielerzahl noch die elemente der 2. dimension konstant sind kann ich mit

    [autoit]

    If $aWert[0][0] > $aWert[1][0] Then

    [/autoit]

    keine allgemeingültige funktion erstellen.

    habs jedenfalls bisher nicht hinbekommen

  • was hälst du davon in die 2. Dimension ein Array zu packen mit den jeweiligen Infos?
    Lässt sich leichter vergleichen
    so ungefähr:

    [autoit]

    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $spielerArr[5][5], $hand[5]

    [/autoit][autoit][/autoit][autoit]

    $hand[0] = 1
    $hand[1] = 2
    $hand[2] = 3
    $hand[3] = 4
    $hand[4] = 5

    [/autoit][autoit][/autoit][autoit]

    $spielerArr[0][0] = $hand

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($spielerArr[0][0])

    [/autoit]
  • hab mal nen stückchen kot dazugepackt..

    der letzte _arraydisplay befehl soll die siegerhand ausspucken
    funktioniert mit dem ersten element auch wunderbar,
    nur wie kann ich das 2. und 3. und n.te element überprüfen?


    EDIT: wie ichi das seh gibt es für fixe werte zu viele mögliche kombinationen :S

    [autoit]


    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    ;zu testzwecken:
    global $iPlayerNr = 3

    [/autoit][autoit][/autoit][autoit]

    func _sd_get_hand($playerNr) ;zu testzwecken
    Switch($playerNr)
    case 0
    global $aTmp[3]
    $aTmp[0] = 3
    $aTmp[1] = 7
    $aTmp[2] = 1
    return $aTmp
    case 1
    global $aTmp[4]
    $aTmp[0] = 2
    $aTmp[1] = 7
    $aTmp[2] = 1
    $aTmp[3] = 5
    return $aTmp
    case 2
    global $aTmp[5]
    $aTmp[0] = 5
    $aTmp[1] = 3
    $aTmp[2] = 1
    $aTmp[3] = 13
    $aTmp[4] = 5
    return $aTmp
    EndSwitch
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    func _compare ()
    Local $aCheck[$iPlayerNr][6]
    for $i = 0 to $iPlayerNr -1
    $aTmp = _sd_get_hand($i) ;returnwert ist ein eindimensionaler array mit den kartenwerten (siehe oben)
    $aCheck[$i][0] = $aTmp[0]
    for $j = 1 to UBound($aTmp) -1
    $aCheck[$i][$j] = $aTmp[$j] ;aCheck[n][m] -> n = spielerID,[m] = hand
    Next
    Next

    _ArrayDisplay($aCheck,"Gesammelte Hände")

    local $iCheck = $aCheck[0][0] ; =3 im test
    local $iWinner
    local $aHand[6]
    for $k = 0 to $iPlayerNr - 1 ;für jeden spieler wird
    if $aCheck[$k][0] > $iCheck Then ;der erste wert ausgelesen und wenn > $iCheck
    $iCheck = $aCheck[$k][0] ;dann wird $iCheck aktualisiert,
    $iWinner = $k ;die Hand wird zum (temporären) sieger erklärt
    for $l = 0 to UBound($aCheck) -1 ;und
    $aHand[$l] = $aCheck[$k][$l] ;die Hand in $aHand kopiert
    Next
    EndIf
    Next
    _ArrayDisplay($aHand, "Siegerhand")
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    _compare()

    [/autoit]

    2 Mal editiert, zuletzt von zombie36 (17. Dezember 2010 um 18:56)

  • und wieder ein stückchen weiter gekommen =)
    der erste angezeigte array ist der gleiche wie in der vorherigen funktion
    der zweite array ist umgewandelt, sodass er nurnoch eindimensional ist und in [0] alle [x][0] elemente auflistet, in [1] alle [x][1] etc.pp.

    kommt man jetzt evtl mit stringregexp weiter? wie würde eine entsprechende funktion aussehen?

    hoffe ihr seid noch aktiv dabei =)

    danke für die bisherige und zukünftige hilfe & LG

    klick mich
    [autoit]


    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;zu testzwecken:
    global $iPlayerNr = 3

    [/autoit] [autoit][/autoit] [autoit]

    func _sd_get_hand($playerNr) ;zu testzwecken
    Switch($playerNr)
    case 0
    global $aTmp[3]
    $aTmp[0] = 3
    $aTmp[1] = 7
    $aTmp[2] = 1
    return $aTmp
    case 1
    global $aTmp[4]
    $aTmp[0] = 5
    $aTmp[1] = 7
    $aTmp[2] = 1
    $aTmp[3] = 5
    return $aTmp
    case 2
    global $aTmp[5]
    $aTmp[0] = 5
    $aTmp[1] = 3
    $aTmp[2] = 1
    $aTmp[3] = 13
    $aTmp[4] = 5
    return $aTmp
    EndSwitch
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _compare ()
    Local $aCheck[$iPlayerNr][6], $aTmp, $sCheck
    for $i = 0 to $iPlayerNr -1
    $aTmp = _sd_get_hand($i) ;returnwert ist ein eindimensionaler array mit den kartenwerten (siehe oben)
    $aCheck[$i][0] = $aTmp[0]
    for $j = 1 to UBound($aTmp) -1
    $aCheck[$i][$j] = $aTmp[$j] ;aCheck[n][m] -> n = spielerID,[m] = hand
    Next
    Next

    _ArrayDisplay($aCHeck)

    [/autoit] [autoit][/autoit] [autoit]

    for $k = 0 to UBound($aCheck,2) -1
    $sCheck &= ","
    for $l = 0 to UBound($aCheck,1) -1
    $sCheck &= $aCheck[$l][$k]
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $sCheck = StringTrimLeft($sCheck,1)
    $aCheck = StringSplit($sCheck,",",2)

    _ArrayDisplay($aCheck)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    _compare()

    [/autoit]
  • da weder spielerzahl noch die elemente der 2. dimension konstant sind

    Schau dir dazu

    [autoit]

    UBound

    [/autoit]

    an.
    Wenn du in die 2. Dimension als kommagetrennten String speicherst und Wete die 2-stellig ein können (im Falle von nur einer Stelle) vorne mit 0 aufüllst, kannst du mit

    [autoit]

    _Arraysort

    [/autoit]

    sortieren. Da ich die Pokerrgeln nicht kenne musst du diese Annahme testweise prüfen. Evtl. ist auch die Definition der Wertigkeiten anzupassen 1 ist am schlechtesten 99 am beten,

    mfg autoBert

  • der array ist schon sortiert, undzwar nach stärke, je höher der integer an der jeweiligen stelle, desto besser die hand

    ich brauch nur eine möglichkeit zu definieren dass

    [autoit]


    global $aX[2]
    $aX[0] = 2
    $aX[1] = 3
    ...
    ...
    ...

    [/autoit]


    [autoit]


    global $aY[2]
    $aY[0] = 2
    $aY[1] = 2
    ...
    ...
    ...

    [/autoit]

    schlägt, denn
    $aX[0] =$aY[0]
    aber $aX[1] > $aY[1]

    und das für beliebig viele arrays mit 3 - 6 elementen
    ich hab versucht in den 2 versionen die ich geposted hab 2 möglichst unterschiedliche formen zu benutzen, um mit dem llösungsansatz etwas flexibler zu sein ;)

    EDIT: ich erläutere nochmal das prinzip.
    im ersten post hab ich die version vorgestellt, die $Werte[PlayerId][m*,n**,o***] speichert
    m*: der wert der hand. 0 für nichts, 1 für ein paar, 2 für 2 paare, [...] 9 für royal flush
    n**:bei zwei paaren daserste paar, bei einem paar der wert des pärchens
    o***: bei einem paar die höchste beikarte, bei zweipaaren das zweiet pärchen
    und so weiter

    im zweiten post hab ich alle m*'s und n**'s etc.zu einem string zusammengefasst, in der reinfolge 1.intger = spieler1, 2. integer = spieler2 (...)

    2 Mal editiert, zuletzt von zombie36 (17. Dezember 2010 um 20:39)

  • und das für beliebig viele arrays mit 3 - 6 elementen

    nochmals

    [autoit]

    UBound

    [/autoit]

    löst dieses Problem

    0 für nichts, 1 für ein paar, 2 für 2 paare, [...] 9 für royal flush

    schön, wenn du

    [autoit]

    _ArraySort,1($array,

    [/autoit]

    einsetzt ist zumidest hiefür der grösste Wert an 1, Stelle. Wenn du jetzt die Wertigkeiten für die anderen "Spalten" auch aufsteigend definiersr und links mit 0 auf 2 Stellig auffüllst ist das ganze Array abteigend richtig sortiert.
    Stell einfach einmal ein paar Arrays ein, dann zeige ich dir an einem Skript-Beispiel wie ich das meine,

    mfg autoBert

  • hm habs nochmal versucht aber vergeblich..

    main script
    [autoit]


    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $sTitle = ''
    ;Global $sCardPath = @ScriptDir & '\cards\'
    ;Global $sIconPath = @ScriptDir & '\icons\'
    Global $aWinnings[10] = ['Hi Card', 'One Pair', 'Two Pair', 'Three Of A Kind', 'Straight', 'Flush', 'Full House', 'Four Of A Kind', 'Straight Flush', 'Royal Flush']
    Global $aSuit[4] = ['d', 'h', 's', 'c'], $aDeck[52], $aCopyDeck, $iDeckCount = 51, $iDealCount = 0
    Global $iplayerNR, $aFlop[3], $turn,$river,$SDHand[5]

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 12
    $aDeck[$i * 13 + $j] = $aSuit[$i] & $j + 1
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    global $aTest[7] ;erklärung für diejenigen die texas holdem nicht kennen: aus 7 karten (5 gemeinschaftskarten + 2 Holecards) wird das bestmögliche 5-Kartenblatt zusammengelegt
    $aTest[0] = _dealCard()
    $aTest[1] = _dealCard()
    $aTest[2] = _dealCard()
    $aTest[3] = _dealCard()
    $aTest[4] = _dealCard()
    $aTest[5] = _dealCard()
    $aTest[6] = _dealCard()

    [/autoit] [autoit][/autoit] [autoit]

    func _dealCard () ;simuliert das Austeilen einer einzigartigen Karte (Format c13 = Kreuzkönig, h1 = herzAss)
    local $tRand = random(0,$ideckcount,1)
    local $iCard = $aCopyDeck[$tRand]
    $aCopyDeck[$tRand] = $acopyDeck[$ideckCount]
    $iDeckCount -= 1
    return $iCard
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _Sd_Get_Hand ($iplayer)
    local $tCards [7]
    $tCards[0] = $aFlop[0]
    $tCards[1] = $aFlop[1]
    $tCards[2] = $aFlop[2]
    $tCards[3] = $turn
    $tCards[4] = $river
    $tCards[5] = $aHolecards[$iplayer][0]
    $tCards[6] = $aHolecards[$iplayer][1]
    $tCards = _sortCards($tCards)
    $tCards = _ArrayCombinations($tCards,5)
    local $aReturn
    $aReturn = _RoyalFlush($tCards)
    if $aReturn = 9 Then return $aReturn
    $aReturn = _straightFlush($tCards)
    if IsArray($aReturn) Then return $aReturn
    $aReturn = _fourofakind($tCards)
    if IsArray($aReturn) Then return $aReturn
    $aReturn = _fullhouse($tCards)
    if IsArray($aReturn) Then return $aReturn
    $aReturn = _flush($tCards)
    if IsArray($aReturn) Then return $aReturn
    $aReturn = _Straight($tCards)
    if IsArray($aReturn) Then return $aReturn
    $aReturn = _threeofakind($tCards)
    if IsArray($aReturn) Then return $aReturn
    $aReturn = _twopair($tCards)
    if IsArray($aReturn) Then return $aReturn
    $aReturn = _pair($tCards)
    if IsArray($aReturn) Then return $aReturn
    $aReturn = _HiCards($tCards)
    if IsArray($aReturn) then return $aReturn
    EndFunc

    [/autoit]
    &quot;Benötigte Funktionen&quot;
    [autoit]


    Func _SortCards($aCards)
    Local $tmp
    For $i = 0 To UBound($aCards) - 2
    For $j = $i + 1 To UBound($aCards) - 1
    If int(StringMid($aCards[$j], 2)) < int(StringMid($aCards[$i], 2)) Then
    $tmp = $aCards[$i]
    $aCards[$i] = $aCards[$j]
    $aCards[$j] = $tmp
    EndIf
    Next
    Next
    Return $aCards
    EndFunc ;==>_SortCards

    [/autoit] [autoit][/autoit] [autoit]

    Func _RoyalFlush($aCards);return 9
    for $i = 1 to $aCards[0]
    $sCards = $aCards[$i];jeder string wird überprüft
    if $sCards = String("c1c10c11c12c13") Or $sCards = String("s1s10s11s12s13") Or $sCards = String("h1h10h11h12h13") Or $sCards = String("d1d10d11d12d13") then
    return 9
    EndIf
    Next
    EndFunc ;==>_RoyalFlush

    [/autoit] [autoit][/autoit] [autoit]

    Func _StraightFlush($aCards);return 8, wert höchste Karte
    For $i = 1 to $aCards[0]
    Local $sCards = $aCards[$i]

    [/autoit] [autoit][/autoit] [autoit]

    local $aTmp= StringSplit($sCards,"cshd",2)
    local $iCount = 1
    For $j = UBound($aTmp) - 1 to 2 step -1
    if Number($aTmp[$j]) = (Number($aTmp[$j-1]) + 1) Then;wenn die jeweils verherigeKarte 1 kleiner ist dann $iCount += 1
    $iCount += 1
    EndIf
    Next
    if $iCount = 5 Then
    local $aColor = StringSplit($sCards,"0123456789",2)
    Local $iCount = 1
    local $sTmp = $aColor[0]
    For $k = 1 to UBound($aColor) - 1
    if $aColor[$k] = $sTmp Then
    $iCount += 1
    EndIf
    Next
    if $iCount = 5 then
    Local $iHi = $aTmp[UBound($aTmp)-1]
    Local $aReturn[2]
    $aReturn[0] = 8
    $aReturn[1] = $iHi
    return $aReturn
    EndIf
    EndIf
    Next
    EndFunc ;==>_StraightFlush

    [/autoit] [autoit][/autoit] [autoit]

    Func _Fourofakind($aCards);return 7,wert poker, wert hohe karte
    for $i = $aCards[0] to 1 step -1
    Local $sCards = $aCards[$i]
    Local $aTmp = StringSplit($sCards,"cshd",2)
    for $j = 1 to 2
    Local $iTmp = $aTmp[$j]
    Local $iCount = 1
    for $k = $j + 1 to UBound($aTmp) - 1
    if $aTmp[$k] = $iTmp Then
    $iCount += 1
    EndIf
    Next
    if $iCount = 4 then
    Local $sCheck = "",$aCheck,$iCheck
    For $l = 1 to $aCards[0]
    $sCheck &= $aCards[$l]
    Next
    $aCheck = StringSplit($sCheck,"csdh",2)
    $iCheck = _ArrayMax($aCheck,1)
    If _ArraySearch($aCheck,1) > - 1 Then
    $iCheck = 1
    EndIf
    If $iCheck = $iTmp Then
    $a = _ArrayFindAll($aCheck,$iTmp)
    for $m = 0 to UBound($a) - 1
    _ArrayDelete($aCheck,$a[$m])
    Next
    $iCheck = _ArrayMax($aCheck,1)
    EndIf
    Local $aReturn[3]
    $aReturn[0] = 7
    $aReturn[1] = $iTmp
    $aReturn[2] = $iCheck
    return $aReturn
    EndIf
    Next
    Next
    EndFunc ;==>_Fourofakind

    [/autoit] [autoit][/autoit] [autoit]

    Func _FullHouse($aCards);return 6, wert trips, wert pair
    Local $iCount21, $iCount22,$iCount1 = 1, $iCount2 = 0,$itmp21, $iTmp22, $iTmp1, $iTmp2

    [/autoit] [autoit][/autoit] [autoit]

    for $i = $aCards[0] To 1 Step -1
    local $iTmp, $iTmp2
    Local $iSearch = 0,$iCount1 = 1, $iCount2 = 0
    Local $iStart = 2
    Local $sCheck = $aCards[$i]
    Local $aTmp = StringSplit($sCheck,"csdh",2)
    $iTmp1 = $aTmp[1]
    for $j = 0 to 2
    $iSearch = _ArraySearch($aTmp,$iTmp1,$iStart)
    if $iSearch > 0 Then
    $iCount1 += 1
    $iStart = $iSearch + 1
    EndIf
    Next
    for $k = 1 to UBound($aTmp) -1
    if $aTmp[$k] <> $iTmp1 Then
    $iTmp2 = $aTmp[$k]
    $iStart = _ArraySearch($aTmp,$iTmp2)
    ExitLoop
    EndIf
    Next
    for $l = 0 to 2
    $iSearch = _ArraySearch($aTmp,$iTmp2,$iStart)
    if $iSearch > 0 Then
    $iCount2 += 1
    $iStart = $iSearch + 1
    EndIf
    Next
    if ($iCount1 = 3 AND $iCount2 = 2) Then $i = 0
    if ($iCount1 = 2 AND $iCount2 = 3) Then $i = 0
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $m = 1 To $aCards[0]
    local $iTmp, $iTmp22, $iCount21 = 1, $iCount22 = 0
    Local $iStart = 2,$isearch = 0
    Local $sCheck = $aCards[$m]
    Local $aTmp = StringSplit($sCheck,"csdh",2)
    $iTmp21 = $aTmp[1]
    for $n = 0 to 2
    $iSearch = _ArraySearch($aTmp,$iTmp21,$iStart)
    if $iSearch > 0 Then
    $iCount21 += 1
    $iStart = $iSearch + 1
    EndIf
    Next
    for $o = 1 to UBound($aTmp) -1
    if $aTmp[$o] <> $iTmp21 Then
    $iTmp22 = $aTmp[$o]
    $iStart = _ArraySearch($aTmp,$iTmp22)
    ExitLoop
    EndIf
    Next
    for $p = 0 to 2
    $iSearch = _ArraySearch($aTmp,$iTmp22,$iStart)
    if $iSearch > 0 Then
    $iCount22 += 1
    $iStart = $iSearch + 1
    EndIf
    Next
    if ($iCount21 = 3 AND $iCount22 = 2) Then $m = $aCards[0] +1
    if ($iCount21 = 2 AND $iCount22 = 3) Then $m = $aCards[0] +1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    if ($iCount1 = 3 AND $iCount2 = 2) Then;ass in wertigkeit anpassen

    [/autoit] [autoit][/autoit] [autoit]

    if $iCount21 = 3 And $iTmp21 = 1 Then
    If $iTmp1 <> 1 then
    $iTmp2 = $iTmp1
    $iTmp1 = 1
    EndIf
    ElseIf $iCount21 = 2 and $iTmp21 = 1 then
    $iTmp2 = 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $aReturn[3]
    $aReturn[0] = 6
    $aReturn[1]= $iTmp1
    $aReturn[2] = $iTmp2
    return $aReturn
    ElseIf ($iCount1 = 2 AND $iCount2 = 3) then

    [/autoit] [autoit][/autoit] [autoit]

    if $iCount21 = 3 And $iTmp21 = 1 Then
    If $iTmp2 <> 1 then
    $iTmp1 = $iTmp2
    $iTmp2 = 1
    EndIf
    ElseIf $iCount21 = 2 and $iTmp21 = 1 then
    $iTmp1 = 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $aReturn[3]
    $aReturn[0] = 6
    $aReturn[1]= $iTmp2
    $aReturn[2] = $iTmp1
    return $aReturn
    EndIf
    EndFunc ;==>_FullHouse

    [/autoit] [autoit][/autoit] [autoit]

    Func _Flush($aCards);return 5, werte der karten
    for $i = $aCards[0] to 1 step -1
    Local $sCards = $aCards[$i]
    local $aColor = StringSplit($sCards,"0123456789",2)
    Local $aTmp = StringSplit($sCards,"csdh",2)
    Local $iCount = 1
    local $sTmp = $aColor[0]
    For $j = 1 to UBound($aColor) - 1
    if $aColor[$j] = $sTmp Then
    $iCount += 1
    EndIf
    Next
    if $iCount = 5 then
    Local $aReturn[1]
    $aReturn[0] = 5

    [/autoit] [autoit][/autoit] [autoit]

    if _ArraySearch($aTmp,1) > -1 Then
    _ArrayAdd($aReturn,1)
    _ArrayDelete($aTmp,_ArraySearch($aTmp,1))
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    for $k = UBound($aTmp) - 1 to 1 step -1
    _ArrayAdd($aReturn,$aTmp[$k])
    Next
    return $aReturn
    EndIf
    Next
    endFunc ;==>_Flush

    [/autoit] [autoit][/autoit] [autoit]

    Func _Straight($aCards);return 4, wert höchste karte (ace hi = 14 !!)
    Local $sCheck, $aCheck, $iCount = 1,$bAce = 0
    $sCheck = $aCards[1]
    $aCheck = StringSplit($sCheck,"csdh",2)
    $iSearch = _ArraySearch($aCheck,1)
    if $iSearch > -1 Then
    $bAce = 1
    EndIf
    for $i = $aCards[0] to 1 step -1
    $iCount = 1
    $sCheck = $aCards[$i]
    $aCheck = StringSplit($sCheck,"csdh",2)
    For $j = UBound($aCheck) - 1 to 2 step -1
    if Number($aCheck[$j]) = (Number($aCheck[$j-1]) + 1) Then;wenn die jeweils verherigeKarte 1 kleiner ist dann $iCount += 1
    $iCount += 1
    EndIf
    Next
    Local $aReturn[2]
    if ($iCount = 4 or $iCount = 5) and $aCheck[UBound($aCheck) -1] = 13 and $aCheck[UBound($aCheck) - 4] = 10 and $bAce = 1 Then
    $aReturn[0] = 4
    $aReturn[1] = 14
    Return $aReturn
    ElseIf $iCount = 5 Then
    $aReturn[0] = 4
    $aReturn[1] = $aCheck[UBound($aCheck)-1]
    Return $aReturn
    EndIf
    Next
    EndFunc ;==>_Straight

    [/autoit] [autoit][/autoit] [autoit]

    Func _Threeofakind($aCards);return 3,Wert Trips, Wert hohe karte 1, wert hohe karte 2
    Local $sCheck,$aCheck,$iCount = 1,$iCheck
    for $i = $aCards[0] to 1 step -1
    $sCheck = $aCards[$i]
    $aCheck = StringSplit($sCheck,"csdh",2)
    $iCount = 1
    for $j = 1 to 5
    $iCheck = $aCheck[$j]
    for $k = $j+1 to UBound($aCheck) -1
    if $aCheck[$k] = $iCheck Then
    $iCount +=1
    EndIf
    If $iCount = 4 Then
    for $l = 0 To 2
    _ArrayDelete($aCheck,_arraysearch($aCheck,$iCheck))
    Next
    Local $aReturn[4]
    $aReturn[0] = 3
    $aReturn[1] = $iCheck
    $aReturn[2] = _ArrayPop($aCheck)
    $aReturn[3] = _ArrayPop($aCheck)

    [/autoit] [autoit][/autoit] [autoit]

    $aCheck = StringSplit($aCards[1],"csdh",2)
    if _ArraySearch($aCheck,1) > -1 And $iCheck <> 1 Then
    $aReturn[3] = $aReturn[2]
    $aReturn[2] = 1
    EndIf
    Return $aReturn
    EndIf
    Next
    Next
    Next
    EndFunc ;==>_Three

    [/autoit] [autoit][/autoit] [autoit]

    Func _TwoPair($aCards);return 2, wert pair1, wert pair2, wert hi card
    For $i = $aCards[0] to 1 step -1
    Local $aCheck, $iCheck, $iHi, $iPair1, $iPair2
    $aCheck = StringSplit($aCards[$i],"csdh",2)
    $iTmp1 = _ArrayPop($aCheck)
    $iTmp2 = _ArrayPop($aCheck)
    $iTmp3 = _ArrayPop($aCheck)
    $iTmp4 = _ArrayPop($aCheck)
    $iTmp5 = _ArrayPop($aCheck)
    Local $aReturn[4]
    If $iTmp1 = $iTmp2 And $iTmp3 = $iTmp4 Then
    $aReturn[0] = 2
    $aReturn[1] = $iTmp1
    $aReturn[2] = $iTmp3
    $aReturn[3] = $iTmp5
    ElseIf $iTmp1 = $iTmp2 And $iTmp4 = $iTmp5 Then
    $aReturn[0] = 2
    $aReturn[1] = $iTmp1
    $aReturn[2] = $iTmp4
    $aReturn[3] = $iTmp3
    ElseIf $iTmp2 = $iTmp3 And $iTmp4 = $iTmp5 Then
    $aReturn[0] = 2
    $aReturn[1] = $iTmp2
    $aReturn[2] = $iTmp4
    $aReturn[3] = $iTmp1
    EndIf
    if $aReturn[0] = 2 Then
    $aCheck = StringSplit($aCards[1],"csdh",2)
    $aSearch = _ArrayFindAll($aCheck,1)
    If UBound($aSearch) - 1 > 0 Then
    $aReturn[2] = $aReturn[1]
    $aReturn[1] = 1
    ElseIf $aSearch <> -1 Then
    $aReturn[3] = 1
    EndIf
    return $aReturn
    EndIf
    Next
    EndFunc ;==>_TwoPair

    [/autoit] [autoit][/autoit] [autoit]

    Func _Pair($aCards);return 1,wert pair, wert hi card1, hi card2, hi card3
    local $aCheck = StringSplit($aCards[1],"csdh",2)
    if $aCheck[1] = $aCheck[2] And $aCheck[1] = 1 Then
    Local $aReturn[5]
    $aReturn[0] = 1
    $aReturn[1] = 1
    $aCheck = StringSplit($aCards[UBound($aCards)-1],"csdh",2)
    $aReturn[2] = _ArrayPop($aCheck)
    $aReturn[3] = _ArrayPop($aCheck)
    $aReturn[4] = _ArrayPop($aCheck)
    return $aReturn
    Else
    for $i = UBound($aCards) -1 to 1 step -1
    Local $sCards = $aCards[$i]
    Local $aTmp = StringSplit($sCards,"cshd",2)
    for $j = 1 to 4
    Local $iTmp = $aTmp[$j]
    Local $iCount = 1
    for $k = $j + 1 to UBound($aTmp) - 1
    if $aTmp[$k] = $iTmp Then
    $iCount += 1
    EndIf
    Next
    if $iCount = 2 then
    for $l = 0 to 1
    _ArrayDelete($aTmp,_arraysearch($aTmp,$iTmp))
    Next
    Local $aReturn[5]
    $aReturn[0] = 1
    $aReturn[1] = $iTmp
    $aReturn[2] = _ArrayPop($aTmp)
    $aReturn[3] = _ArrayPop($aTmp)
    $aReturn[4] = _arraypop($aTmp)
    if _ArraySearch($aCheck,1) > -1 Then
    $aReturn[4] = $aReturn[3]
    $aReturn[3] = $aReturn[2]
    $aReturn[2] = 1
    EndIf
    Return $aReturn
    EndIf
    Next
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_Pair

    [/autoit] [autoit][/autoit] [autoit]

    Func _HiCards($aCards);return 0, hi cards absteigende reinfolge
    Local $aReturn[1]
    $aReturn[0] = 0
    local $j = 4
    local $aCheck = StringSplit($aCards[1],"csdh",2)
    if _ArraySearch($aCheck,1) > -1 Then
    _ArrayAdd($aReturn,1)
    $j -=1
    EndIf
    local $aCheck = StringSplit($aCards[ubound($aCards)-1],"csdh",2)
    for $i = 0 to $j
    _ArrayAdd($aReturn,_ArrayPop($aCheck))
    Next
    return $aReturn
    EndFunc

    [/autoit]

    in das obere script möchte ich also eine art

    [autoit]


    func _compare()
    Local $aCheck[$iPlayerNr][6], $aTmp
    for $i = 0 to $iPlayerNr -1
    $aTmp = _sd_get_hand($i)
    $aCheck[$i][0] = $aTmp[0]
    for $j = 1 to UBound($aTmp) -1
    $aCheck[$i][$j] = $aTmp[$j];aCheck[n][m] -> n = spielerID,[m] = handreturn
    Next
    Next
    _ArrayDisplay($aCheck)

    $best_hand = ""
    return $BEST_HAND ;die da wäre.......? :S
    endfunc

    [/autoit][autoit][/autoit][autoit][/autoit]


    einbauen

    das problem dabei ist dass es sich immer um zufallsvariablen handelt die eine feste position innerhalb des arrays haben..
    deshalb versteh ich auch nicht wie du das mit dem _arraySort meinst..

    die funktionen sind ein ganzer happen an zeilen, ich dachte eventuell könnte man das mithilfe von stringregexp() beschleunigen?
    leider kenn ich mich kaum damit aus und die hilfedatei verrät mir:

    Zitat

    Caution: bad regular expressions can produce a quasi-infinite loop hogging the CPU, and can even cause a crash.- AutiIt Help

    das schreckt mich als laien doch ein wenig ab ;)


    ps. da ich mich bereit erkläre einen großteil zeitaufwendiger schreibarbeit zur verfügung zu stellen würde ich mich freuen, wenn weiterentwicklungen (im fall der fälle) hier gepostet werden ;)

  • Hallo zombie46,

    so ?

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $aSpieler[3] =["Hans","Kurt","Ingo"]

    [/autoit] [autoit][/autoit] [autoit]

    func _sd_get_hand($playerNr) ;zu testzwecken
    Switch($playerNr)
    case 0
    Local $aTmp[3]
    $aTmp[0] = 3
    $aTmp[1] = 7
    $aTmp[2] = 1
    return $aTmp
    case 1
    Local $aTmp[4]
    $aTmp[0] = 2
    $aTmp[1] = 7
    $aTmp[2] = 1
    $aTmp[3] = 5
    return $aTmp
    case 2
    Local $aTmp[5]
    $aTmp[0] = 5
    $aTmp[1] = 3
    $aTmp[2] = 1
    $aTmp[3] = 13
    $aTmp[4] = 5
    return $aTmp
    EndSwitch
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _compare ()
    Local $iPlayerAnz=3,$aCheck[$iPlayerAnz][2]
    for $i = 0 to $iPlayerAnz -1
    $aTmp = _sd_get_hand($i) ;returnwert ist ein eindimensionaler array mit den kartenwerten (siehe oben)
    $aCheck[$i][0] = $i
    for $j = 1 to UBound($aTmp) -1
    $aCheck[$i][1] &= $aTmp[$j]& "," ;aCheck[n][m] -> n = spielerID,[m] = hand
    Next
    Next
    _ArraySort($aCheck,1,0,0,1)
    _ArrayDisplay($aCheck,"Gesammelte Hände")
    ConsoleWrite($aSpieler[$aCheck[0][0]] & " hat gewonnen")
    #cs
    local $iCheck = $aCheck[0][0] ; =3 im test
    local $iWinner
    local $aHand[6]
    for $k = 0 to $iPlayerAnz - 1 ;für jeden spieler wird
    if $aCheck[$k][0] > $iCheck Then ;der erste wert ausgelesen und wenn > $iCheck
    $iCheck = $aCheck[$k][0] ;dann wird $iCheck aktualisiert,
    $iWinner = $k ;die Hand wird zum (temporären) sieger erklärt
    for $l = 0 to UBound($aCheck) -1 ;und
    $aHand[$l] = $aCheck[$k][1] ;die Hand in $aHand kopiert
    Next
    EndIf
    Next
    _ArrayDisplay($aHand, "Siegerhand")
    #ce
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    _compare()

    [/autoit]
  • nicht ganz...
    ich habe das ass als "1" definiert, es ist von der wertigkeit her aber z.T die höchste karte.

    _arraysort packt das ass nach ganz hinten..
    ich versuch das mal zu fixen ;) sollte doch drin sein

    abgesehn davon war dein post aber echt hilfreich, danke dafür
    ich hatte mich davor schon an arraysort probiert aber deine aufteilung war der schlüssel :D

    lieben gruß