Gutshot Draw...

Status
Nicht offen für weitere Antworten.

ARadauer

Top Contributor
Hi ich bräuchte kurz eure hilfe zum Thema Poker...
Es geht mir um den Test ob eine Hand ein Gutshot Draw ist.. 4 Karten in einer Reihe nur in der Mitte ist eine Lücke

also zb 5 6 8 9, oder 10 bube könig ass, oder 2 4 5 6

die karten werden symbolisert durch zahlen, sie sind bereits sortiert und es sind keine doppelten vorhanden.. max sieben karten..

Java:
ArrayList<Integer> ranks = new ArrayList<Integer>();

.. ermitteln, sortieren, doppelte raus, 
int w = 1;
		int max = -1;
		boolean hole =false;
		for(int i = 0; i <ranks.size()-1; i++){
			if(ranks.get(i)+1== ranks.get(i+1)){
				w++;
			}else if(!hole && ranks.get(i)+2==ranks.get(i+1)){
				hole = true;
				w++;
			}else{
				if(w>max)
					max =w;
				w = 1;
				hole = false;
			}
		}
		if(w>max)
			max =w;
		System.out.println(max);
		return max ==4;

kann mir da kurz mal jemand drüber schaun. ist das ok, oder kann das müll produzieren?
vielleicht hat jemand noch eine bessere lösung ;-) (höchstwahrscheinlich, bin schon müde)
 
M

maki

Gast
Wenn du nur von 5 Karten ausgehst, geht das auch ohne Schleife, die verschiedenen Kombinationen der 7 Karten müsstest du dann durchtesten.
 

Der Müde Joe

Top Contributor
das sollte reichen (oder hab ich was übersehen?)

Unter der Annahme, das die Karten sortiert sind, von min nach max gehen und nichts doppelt da ist.

Java:
public static boolean isGutshot(int[] cards) {
	return cards.length == (cards[cards.length - 1] - cards[0]);
}
 

Der Müde Joe

Top Contributor
6 7 3 9 10 ist einer, 3 4 7 9 10 nicht.

stimmt. so klappts nur für 4 karten..

für mehr als vier (ungetestet) sollte das klappen:
(wieder unter der annahme geordnet, min max, kein doppelten)

Java:
public static boolean isGutshot(int[] cards) {
	if (cards.length > 4) {
		int frame = cards.length - 4;
		for (int i = 0; i <= frame; i++) {
			if (isGutshot1(Arrays.copyOfRange(cards, i, i + 4))) {
				return true;
			}
		}
		return false;
	}
	return isGutshot1(cards);
}

private static boolean isGutshot1(int[] cards) {
	return cards.length == (cards[cards.length - 1] - cards[0]);
}
 

Marco13

Top Contributor
Ist das nicht einfach sowas wie
Code:
return 
    card[0]+1 == card[1] &&
    card[1]+2 == card[3] &&
    card[3]+1 == card[4];
!? ???:L

EDIT: Ach nee, sorry - die Mitte muss offenbar nicht in der Mitte sein ;)
 

Marco13

Top Contributor
Noch ein Versuch von einem Poker-Noob ;)
Code:
int matches = 1;
for (int i=1; i<5; i++)
{
    if (cards[i] == cards[0]+i)
    {
        matches++;
    }
}
return matches==4;

EDIT: Das kann man auch auf n Karten verallgemeinert schreiben...
 

Der Müde Joe

Top Contributor
>Ist das nicht einfach sowas wie

nö. kannst ja
xxx 1 345 xxx
xxx 12 45 xxx
xxx 123 5 xxx

haben

EDIT:
ach...zu langsam ...zuerst posten...dann telefonieren
 
M

maki

Gast
>Ist das nicht einfach sowas wie

nö. kannst ja
xxx 1 345 xxx
xxx 12 45 xxx
xxx 123 5 xxx

haben

EDIT:
ach...zu langsam ...zuerst posten...dann telefonieren
Oops, wusste nicht dass dass es irgendeine "mittlere" Karte sein könnte (kenne mich mit Poker nicht aus), dann wäre eine Schleife wohl doch besser.
 

Marco13

Top Contributor
Der Fall, dass die "Lücke" am Ende ist (was wohl nicht sein darf?!) wird bei meinem letzten natürlich nicht berücksichtigt.

Noch'n Versuch:
Java:
class GutShot
{

    public static void main(String args[])
    {
        System.out.println( test(new int[]{ 1,2,3,0,5,6,7 }));
        System.out.println(!test(new int[]{ 0,2,3,4,5,6,7 }));
        System.out.println(!test(new int[]{ 1,2,3,4,5,6,0 }));
        System.out.println(!test(new int[]{ 1,2,0,4,0,6,7 }));

    }

    private static boolean test(int cards[])
    {
        int matches = 2;
        int i = 1;
        for (i=1; i<cards.length-1; i++)
        {
            if (cards[i] == cards[0]+i)
            {
            matches++;
            }
        }
        if (cards[i] != cards[0]+i)
        {
            return false;
        }
        return matches==(cards.length-1);
    }
}
 

Der Müde Joe

Top Contributor
Ein Gutshot sind 4 Karten in einer Reihe mit genau einer Lücke dazwischen.(die drei oben).
4 Karten aneinander nennt man Straight Draw.
[edit]Open Ended Straight Draw, um genau zu sein[/edit]

Bei deinem Bespiel gehen leider die drei nicht:
Java:
System.out.println(test(new int[] { 1, 3, 4, 5 }));
System.out.println(test(new int[] { 1, 2, 4, 5 }));
System.out.println(test(new int[] { 1, 2, 3, 5 }));

EDIT:
Es können natürlich noch Karten vorher/nachher kommen.
dh 123 56 ->gutshot (123 5 oder 23 56)
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Hier mal meine Möglichkeit ;-) Die Hand kann unsortiert und mit doppelten Werten übergeben werden. Es wird zwar auf Gutshot geprüft, eine Straße oder open end wird aber auch erkannt (aber nicht als gutshot gewertet). Einzige Ergänzung die noch fehlt ist ein ASS auch als EINS zu werten.
Java:
public boolean checkForGutShot(ArrayList<Integer> list) {
	Collections.sort(list);
	StringBuffer buffer = new StringBuffer();
	for (int i=0;i<list.size()-1; i++) {
		if (list.get(i)!=list.get(i+1))
			buffer.append("x" + (list.get(i+1)-list.get(i)-1));
	}
	buffer.append("x");
	String hand = buffer.toString();
	if (hand.indexOf("x0x0x0x0x")>=0) {
		System.out.println("straight");
	}
	else if (hand.indexOf("x0x0x0x")>=0) {
		System.out.println("open end straight draw");
	}
	else if (hand.indexOf("x0x0x1x")>=0 || hand.indexOf("x0x1x0x")>=0 || hand.indexOf("x1x0x0x")>=0) {
		System.out.println("gutshot");
		return true;
	}
	System.out.println("no chances for a straight found");
	return false;
}
 

Marco13

Top Contributor
Ein Gutshot sind 4 Karten in einer Reihe mit genau einer Lücke dazwischen.(die drei oben).
4 Karten aneinander nennt man Straight Draw.
...
Bei deinem Bespiel gehen leider die drei nicht:
...

Ich bin jetzt davon ausgegangen, dass diese "Lücke" explizit (in meinem Fall: Als 0) vorhanden ist, aber es stimmt: Wenn sortiert wird, funktioniert das so natürlich nicht, weil die Lücke dann direkt (und NUR) als "fehlende" Karte erkennbar ist.

Aber demnach wären es jetzt IMMER 5 Karten, und 4 davon bilden eine Folge mit einer Lücke nach der 1.,2. oder 3. Karte? Jetzt müßte man noch (matematisch präzise) sagen, ob 1,2,3,4,5 nun als GutShot erkannt werden soll oder nicht: In der Praxis würde dieser Fall wohl VOR dem GutShot-Test schon abgehandelt, was den GutShot-Test als solchen vereinfachen würde....
 

Der Müde Joe

Top Contributor
>Aber demnach wären es jetzt IMMER 5 Karten, und 4 davon bilden eine Folge mit einer Lücke nach der 1.,2. oder 3. Karte?

Alle Pokerhände gehen auf 5 Karten. Wobei ein gutshot oder openender eigentlich keine Hand, sondern lediglich die Möglichkeit, eine Hand zu erreichen, darstellt.

So sind 4 Karten der selben Farbe ein Flush Draw (Flush sind 5 Karten der selben Farbe, es bleiben 13 - 4 Möglichkeiten einen flush zu erreichen)
4 Karten nacheinander sind ein Open Ended Straight Draw (5 sind eine Straight)
und wenn in der Mitte eine Karte fehlt, ein Gutshot. wobei die Odds beim OpenEnder höher sind eine Strasse zu kriegen als beim Gutshot (2345 -> 4 Sechsen und 4 Asse im Spiel (8), beim Gutshot 23 56 nur 4 Vieren)

>Jetzt müßte man noch (matematisch präzise) sagen, ob 1,2,3,4,5 nun als GutShot

Nein. Dies ist bereits ein Straight. Alle Draws zeichenen sich dadurch, dass eine Karte fehlt, um die entsprechende Hand zu erreichen. Daraus ergeben sich die wahrscheinlichkeiten, eine Hand zu erhalten.

zB:
Five Card Draw Poker (mit 1 mal Kartentausch):
ich besitze 5 Karten (4 der selben Farbe) --> Flush Draw
Ich darf einmal Tauschen. Will eine Karte tauschen (die falsche Farbe).
Nun sind 13 Karten einer Farbe vorhanden minus 4 die ich besitze. Also noch 9 im Spiel
Eine im Spiel ist weg und nicht die Farbe...etc...
 

ARadauer

Top Contributor
wow doch nicht so trivial mein problem ;-)

zu meinem code... mit straights und open ended straight draws wird meine methode nie aufgerufen. Die behandle ich vorher schon, drum sind mir die auch egal
Die karten sind bereits sortiert und es sind keine doppelten mehr drin.
Und falls ein Ass drin vor kommt wird es zusätzlich an den anfang kopiert.. 2 3 5 K A. wäre ja auch einer ;-)
Es geht hier um Texas Hold'Em also es konnen maximal 7 karten (8 mit dem Ass hinten und vorne) sein
 

Der Müde Joe

Top Contributor
Habe mal vor einiger Zeit eine kleine PokerEngine geschrieben. Mit den Standards (paar, driling....) HandEvaluation etc für Holdem. Ist schon ein weilchen her und hab daraus mal ein Natel Poker gemacht. Funktionierte recht sauber so viel ich mich noch erinnern kann.
Wenn du mal reinschauen willst schick ich sie dir. Sollte noch irgendwo auf ner Platte sein.
 

ARadauer

Top Contributor
Habe mal vor einiger Zeit eine kleine PokerEngine geschrieben. Mit den Standards (paar, driling....) HandEvaluation etc für Holdem. Ist schon ein weilchen her und hab daraus mal ein Natel Poker gemacht. Funktionierte recht sauber so viel ich mich noch erinnern kann.
Wenn du mal reinschauen willst schick ich sie dir. Sollte noch irgendwo auf ner Platte sein.

zum Evaluieren von fertigen Hände benutze ich das http://spaz.ca/poker/UofAHandEval.zip super schnell und funktioniert perfekt... nur leider nicht für draws ;-)

Aber kannst mir gerne deinen Code schicken, sicher interessant.

Also zurück zu meinem Code, ich glaub der passt schon.. es müssen ja keine fertigen straights und kein open endet straight draws ausgeschlossen werden, true wenn mindestes gut shot reicht mir vollkommen

Java:
public class Test{
	
	public static void main(String[] args) {
		
		System.out.println(testIfGutShot(new int[] {1,2,4,5,8,10})); //true		
		System.out.println(testIfGutShot(new int[] {5,6,7,10,11,12})); //false
		System.out.println(testIfGutShot(new int[] {5,6,7,10,11,12,14})); //true
		System.out.println(testIfGutShot(new int[] {5,6,7,8})); //eigentlich nicht, aber oesd sind auch ok true
		System.out.println(testIfGutShot(new int[] {1,2,4,6,7,9})); //false

	}
	
	public static boolean testIfGutShot(int[] ranks){		
		int w = 1;
        int max = -1;
        boolean hole =false;
        for(int i = 0; i <ranks.length-1; i++){
            if(ranks[i]+1== ranks[i+1]){
                w++;
            }else if(!hole && ranks[i]+2==ranks[i+1]){
                hole = true;
                w++;
            }else{
                if(w>max)
                    max =w;
                w = 1;
                hole = false;
            }
        }
        if(w>max)
            max =w;
        return max >=4;		
	}
}
 

Michael...

Top Contributor
Da es scheinbar einige Leute gibt, die sich mit dem Thema Poker speziell Texas Holdem auseinander setzen, hier mal ein Anliegen:
Ich bin zurzeit dabei den Wert einer Starthand gegenüber einer anderen zu ermitteln. Bisher habe ich die (48 über 5) möglichen Spielausgänge simuliert und ausgewertet, um die Chancen der einzelnen Hände zu ermitteln. Dauert auf meinem Rechner ca. 3min. Deshalb habe ich mir gedacht eine Tabelle aller möglichen Starthandkombinationen (bei zwei Spielern) anzulegen, um dann statt Simulation auf diese zurück zu greifen.
Nach meiner bisherigen Einschätzung gibt es < 50.000 Starthandkombinationen (A<Herz>A<Pik> vs. Q<Karo>J<Karo>
entspricht z.B. der Wertigkeit von
A<Kreuz>A<Pik> vs. Q<Karo>J<Karo>
A<Kreuz>A<Herz> vs. Q<Karo>J<Karo>
A<Herz>A<Pik> vs. Q<Kreuz>J<Kreuz> ...) d.h. bei wenn ich diese Kombinationen durch meinen Algorithmus durch jage brauche ich nur 50.000*3/60/24 --> ca. 100 Tage bis ich meine Starttabelle habe.;(
Hat jemand zufälligerweise so eine Tabelle ;-) bzw. kennt jemand einen Weg sowas schnell zu gerechnen?
Bei Fernsehübertragungen werden ja auch die Gewinnwahrscheinlichkeiten der einzelnen Hände Preflop angezeigt, weiß jemand wie die darauf kommen?
 

Der Müde Joe

Top Contributor
soweit ich das beurteilen kann, passt der Code.

Mich stört ein wenig, dass der Code auch auf Straight reagiert. Ist eigentlich kein Problem, da Straight "mächtiger" ist als ein Draw. Wenn ich mir das überlege, sollten nur immer 4 Karten evaluiert werden (per definition des draws).
zB
12345 78
[1234] -> false
[2345] -> false
[345 7] -> true
[45 78] ->true

[edit] ist natürlich schon ein Straight darum muss hier darunter gar nicht mehr getestet werden, sprich nur noch die besseren als Stright (aber als Bsp ok)[/edit]

Draws sollten imho nicht mit Händen verglichen werden. Ein Hand kann evaluiert werden. Sprich isFlush, isQuads... und dies hat auch ein gewicht. Ein draw hingegen kann sein, muss aber nicht. Es kann einen flush geben. Es kann eine Straight geben. Eine Hand ist etwas, ein draw hingegen kann mehere Dinge sein werden.

zb [Hand : 4H, 5H, commons: 6H, 7H, 4S, 4D, XX]

Die Hand ist ein Drilling. -> evaluiert (max)
kann noch ein (draws)
staight flush ( 2 möglichkeiten)
quads ( 1 möglichkeit)
fullhouse ( 9 Mö)
flush (9)
straight (8)
werden

So ganz kurz überlegt.
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
@joe: Grundsätzlich hast du schon recht. die frage ist halt was hab ich eigentlich mit der information vor.
Will ich Entscheidungen über meine nächste Action treffen? Was brauch ich für Informationen?
Wie ist meine Postion, was haben meine Gegner gemacht, wie viel Blinds habe ich noch, wie stark ist meine Hand....

Um die Stärke meiner Hand einzuschätzen muss sie aber noch nicht fertig sein. Ich fange einfach von oben an alles ab Falsh mach dies, Straße mach dies, drilling mach dies, two pair mach dies, flush draw mach das usw..


@Michael: es gibt 1.326 verschiedene Starthände (Wahrscheinlichkeiten bei Texas Hold?em ? Wikipedia)
btw... mach doch deinen eigenen thread auf ;-)
 

Der Müde Joe

Top Contributor
>die frage ist halt was hab ich eigentlich mit der information vor.

da hast du recht. Baust du dir eine Poker KI?

>Um die Stärke meiner Hand einzuschätzen muss sie aber noch nicht fertig sein.

Klar.

Einerseits spielt die aktuelle Hand eine Rolle und die möglichen besseren/schlechteren Hände der anderen Spieler
--> Alle möglichen besseren Kombinationen bzw schlechteren gegeneinander abwägen (simpel gesagt)

dazu kommt das Potential der Hand (HP) bzw deren wahrscheinlichkeit p() einzutreffen.

HP(PocketC, BoardC) = p(river_stf) + p(river_fok) + p(river_flh) ...etc bis zur aktuellen Hand.

und noch andere Effekte wie Stack, position..(wie du schon erwähnt hast).

So hab ich das noch irgenwie in Erinnerung. 2 Kollegen haben darüber eine Diplomarbeit geschrieben.
Irgend: Opponent Modeling in a Game with Imperfect Information oder so was. Sollte ich vielleicht mal genauer durchlesen, habs nur noch wage im Kopf.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben