2011-06-24 5 views
5

私はテキサスホールデムのJavaハンド履歴クラスを考え出しています。テキサスホールデムの手履歴クラスをJavaで設計する

必要条件はすべてのアクションが保存され、標準的な継続賭けのような共通の「ライン」に合うように(各プレイハンドを表す)各HandHistoryオブジェクトをトラバースする効率的な方法があることです。レフトポジションのプリフロップで、おそらくポストフロップのポジションにあることがチェックされ、75%のアイポットベットが行われます)。

各行の定義が最高でも曖昧なときを無視します。最初に刺すように、私はそうのようにそれを組織のことを考えていました:

public class HandHistory { 
    private Integer handnumber; 
    //in case we saw things at showdown, put them here 
    private HashMap<Player,String> playerHands; 
    private String flopCards; 
    private String turnCard; 
    private String riverCard; 
    private HashMap<BetRound,LinkedHashMap<Integer,ArrayList<PlayerAction>>> actions; 
} 

ので、各betroundのために、私たちは、そのキーそのbetroundのために行動する最初の位置からのオフセットされている整数ですリンクハッシュマップを保存するので、プリフロップUTGは0です。

アクションは、すでに位置順に生成されています。リンクされたハッシュマップを使用して、後でうまく反復して座っている位置をスキップできるようにします。

各アーリーリストには、そのベットラウンドにそのポジションが持つアクションが含まれます。ほとんどの場合、この配列には1つの要素がありますが、リンプとコールのような場合には2つの要素があります。

誰でもこれに使用するためのより良いデータ構造を見ることができますか?

答えて

0
class Card { 
    // ??? probably just an int (0 to 51), but certainly not a String. 
    // Instead of using class Card below, directly using an int woulb be OK. 
} 

class Hand { 
    Set<Card> hand; // size 2 
} 

class Draw { // not sure of the exact poker name for the 5 cards 
    Set<Card> flop; // size 3 
    Card turn; 
    Card river; 
} 

class Bet { 
    Player player; 
    // or maybe "Double" instead; then amount == null means player dropping out. 
    // or use 0.0 to mean dropped out. 
    double amount; 
} 

class BettingRound { 
    // Includes initial "entry" and all subsequent calls. 
    // Should include players dropping out also. 
    List<Bet> bets; 
} 

class Game { 
    Draw draw; 
    Map<Player, Hand> hands; 
    // rounds 0 and 1 are special since turn and river are not shown 
    List<BettingRound> rounds; 
} 

また、各プレーヤーがどれくらいのお金を持っているか知っておく必要があります。クラスベットの3番目のフィールド(賭け前の合計現金)でそれを記録することができます。

0

もう少し考えてみたら、自分の疑問に答えたと思います。私は、すべてのアクションを表形式で保存するのではなく、同じデータ構造内のベットラインの頻度カウントをすばやく検索しようとすることにしました。

代わりに、ディスク上のデータベースのようなストレージとして上記のクラスを使用し、エッジが{アクション、ポジション、プレイヤー}のタプルであり、頂点が頻度カウントであるベッティングラインにDAGを使用するつもりです。一般的な接尾辞を持つ行は近いと見なされるので、複数の辺が頂点に来るようにしたいので、DAGはtrieよりも正しいと思います。

1

小さな変更、ホールデムは賭けラウンドの固定数を持っているので、多分

private HashMap<BetRound,LinkedHashMap<Integer,ArrayList<PlayerAction>>> actions; 

だけかもしれない:

private LinkedHashMap<Integer,ArrayList<PlayerAction>>[] actions= new ... ; 

も、ここに興味のある本のカップルです:

http://www.amazon.com/Poker-strategy-Winning-game-theory/dp/0399506691

http://www.amazon.com/Mathematics-Poker-Bill-Chen/dp/1886070253