Gå till innehåll

Recommended Posts

Postad

Jag har några gånger varit på vippen att göra en simpel pokerklient för nätverksspel. Har oftast dragit mig ur med tanke på att programmera instruktioner för att hitta bästa pokerhanden.

 

Jag letar alltså efter det ultimata sättet att göra detta. Med bäst prestanda det vill säga. Jag eftersöker alltså inte någon praktiskt lösning i ett visst programmeringsspråk, utan en logisk modell som man kan använda sig av.

 

Utgå från detta enkla exempel:

 

Spelare 1 har korten: A B

Spelare 2 har korten: C D

Korten på bordet: 1 2 3 4 5

 

* RP :) - QoS *

Postad

Editerat bort här så ingen förstår vad QoS snackar om :D

 

Kom igen nu, vet att det finns massor med programmeringskunskaper på forumet, få igång en diskussion. Är mycket intresserad av programmering och poker, vill höra era resonemang.

Postad

Jag har själv skrivit ett program i python för att jämföra två händer. Det blev dock ganska stökigt, kolla stegar, kolla färg, kolla multiplar och sen finns det ju olika multiplar som är högre än stegar och tvärtom osv... Det är inte så svårt, men att göra det snyggt och på bästa sätt är en annan femma. Skall du dessutom ta med specialregler som jokrar eller icke-standardlekar så blir det lite svårare.

 

Lyckligtvis finns det intelligenta personer i världen och några av dessa har skrivit ihop poker-source. För att citera från hemsidan:

 

poker-eval is a C library to evaluate poker hands. The result of the evalution for a given hand is a number. The general idea is that if the evalution of your hand is lower than the evaluation of the hand of your opponent, you lose. Many poker variants are supported (draw, holdem, omaha, etc.) and more can be added. poker-eval is designed for speed so that it can be used within poker simulation software using either exhaustive exploration or Monte Carlo.

 

Det effektivaste sättet att koda torde väl vara att inte återuppfinna hjulet. ;)

Postad

Intressant, men tråden handlar om en logisk mall för att bestämma den bästa pokerhanden.

 

Enligt mitt exempel tänkte jag mig Texas Hold'em standard, inga jokrar eller liknande.

Postad

Logik för att bestämma bästa handen.

 

 

Kolla hur många kort det är av varje färg:

Finns det 5 av någon färg så finns flush.

 

Kolla hur många kort det finns av varje valör.

Gå sedan från A och ner till A och se om det råkar

finnas 5 stycken av valörerna i rad som har minst ett kort

- i så fall finns stege.

- finns både stege och flush så är det straight flush.

Finns det 4 av en valör så är det fyrtal.

Finns det 3 av en valör så finns det triss

finns det samtidigt 2 av en annan så är de kåk.

Finns det 2 av en valör och 2 av en annan så är det tvåpar.

Finns det 2 av en valör så är det par.

Annars är det högsta kortet.

 

Notera vilka 5 kort som då passar in och sortera korten i den

ordning från mest signifikanta kortet - där de kort som ingår i

en av ovanstående händer kommer före de som bara finns med

för att de är höga kort.

 

Ge alla resultaten från straight flush och neråt en siffra - jämför

med andra handens siffra. Om det blev lika siffra så jämför

valörerna i de två händernas kort i den ordning de kommer för att

se vem som har bäst hand.

 

Inte alls svårt att programmera

 

PS Om du söker logik för att finna den potentiellt bästa handen så kan ovanstående algoritm användas - med smärre modifieringar.

Postad

Hm, jag misstänker att det är enklare att ge ett poängvärde till var och en av de 21 möjliga femkortshänderna och välja den bästa. Men kolla in länken till poker-source, de har förstås svaret på din fråga.

Postad
Hm, jag misstänker att det är enklare att ge ett poängvärde till var och en av de 21 möjliga femkortshänderna och välja den bästa. Men kolla in länken till poker-source, de har förstås svaret på din fråga.

 

Hur skall du räkna ut poängen-värdet ?

 

Den algoritm jag ger ovan är mycket enkelt att implementera. Tar några tiotals rader kod att skriva.

Postad
Den algoritm jag ger ovan är mycket enkelt att implementera. Tar några tiotals rader kod att skriva.

Whatever. Jag fattade det som att du tänkte utgå från sju kort, vilket skulle ge en massa specialfall. Men jag kanske missuppfattade det hela.

Postad
Hm, jag misstänker att det är enklare att ge ett poängvärde till var och en av de 21 möjliga femkortshänderna och välja den bästa. Men kolla in länken till poker-source, de har förstås svaret på din fråga.

 

Hur skall du räkna ut poängen-värdet ?

 

Den algoritm jag ger ovan är mycket enkelt att implementera. Tar några tiotals rader kod att skriva.

Har du implementerat den? Skulle vara intressant att veta hur många rader det blev i sånna fall, jag har skrivit ett program som jämför två händer i prolog, fast det var för sökö så det är ju inte riktigt samma, det blev iaf 85 rader.

Egentligen ser jag inte problemet, det är ju bara att göra som vetgirig skrev, testa uppifrån och ner, har han färgstege? nähä, har han ett fyrtal då? osv.

 

Jag kan bifoga min kod, fast det är ju som sagt prolog-kod så det kanske inte säger dig så mycket (man tänker ju rätt olika när man kodar i logik-/funktionella språk jämfört med imperativa-/objektorienterade språk). Jag vet att inte alla predikat är med, men dom borde vara rätt uppenbara vad dom gör för någon som kan läsa prologkod.

straight_flush(Hand) :- flush(Hand), straight(Hand).

quads([[V, _]|Hand]) :- count(V, Hand, N), N is 3.
quads([_|Hand]) :- quads(Hand).

boat([[V, _]|Hand]) :- count(V, Hand, N), N is 2, del([V, _], Hand, Hand2), pair(Hand2).
boat([[V, _]|Hand]) :- count(V, Hand, N), N is 1, del([V, _], Hand, Hand2), set(Hand2).

flush([[_, S]|Hand]) :- flush(Hand, S).
flush([], _).
flush([[_, S]|Hand], Suit) :- S = Suit, flush(Hand, Suit).

straight(Hand) :- rempair(Hand, Hand2), length(Hand2, X), length(Hand, Y),
       X is Y, straight2(Hand).
straight2([_]).
straight2(Hand) :- largest([V1, _], Hand), V2 is V1 - 1,
       member([V2, _], Hand), del([V1, _], Hand, Hand2), straight2(Hand2).

set([[V, _]|Hand]) :- count(V, Hand, N), N is 2.
set([_|Hand]) :- set(Hand).

two_pair([[V, _]|Hand]) :- count(V, Hand, N), N is 1, del([V, _], Hand, Hand2), pair(Hand2).
two_pair([_, [V, _]|Hand]) :- count(V, Hand, N), N is 1, del([V, _], Hand, Hand2), pair(Hand2).

pair([[V, _]|Hand]) :- member([V, _], Hand).
pair([_|Hand]) :- pair(Hand).

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gäst
Svara i detta ämne...

×   Du har klistrat in innehåll med formatering.   Ta bort formatering

  Endast 75 max uttryckssymboler är tillåtna.

×   Din länk har automatiskt bäddats in.   Visa som länk istället

×   Ditt tidigare innehåll har återställts.   Rensa redigerare

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Skapa nytt...