Разработка класса истории рук для Техасского Холдема на Java - PullRequest
5 голосов
/ 24 июня 2011

Я пытаюсь придумать класс истории 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;
}

Таким образом, для каждой ставки мы храним связанную хэш-карту, ключи которой являются целыми числами, которые являются смещениями от первой позиции, чтобы действовать для этой ставки, поэтому на префлопе UTG равен 0.

Мы уже генерируем действия в порядке расположения, поэтому используем связанную хэш-карту, чтобы мы могли потом итерацию и пропустить позиции, которые находятся в нерабочем состоянии, и т. Д.

Каждый массив будет содержать действия, которые эта позиция выполняла в этой области. В большинстве случаев в этом массиве будет один элемент, но в таких случаях, как limps и последующие вызовы, он будет иметь два элемента.

Может кто-нибудь увидеть лучшую структуру данных, чтобы использовать для этого?

Ответы [ 3 ]

1 голос
/ 26 июня 2011

небольшое изменение, так как в holdem фиксированное количество раундов торговли, возможно,

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

0 голосов
/ 26 июня 2011

Подумав об этом еще немного, я думаю, что ответил на свой вопрос. Я решил не пытаться хранить каждое действие в табличной форме и пытаться быстро найти счетчики частоты для линий ставок в одной и той же структуре данных.

Вместо этого я собираюсь использовать свой класс выше в качестве хранилища на диск, похожем на базу данных, и использовать DAG для линий ставок, где ребра являются кортежами {action, position, Players forward}, а вершины - подсчетом частот. Я думаю, что DAG является правильным для дерева здесь, так как я хочу, чтобы несколько ребер вошли в вершину, так как линии с общим суффиксом считаются близкими.

0 голосов
/ 24 июня 2011
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;
}

Вы также должны знать, сколько денег у каждого игрока, я думаю.Вы можете отслеживать это с помощью третьего поля (общая сумма денег до ставки) в классе Bet.

...