Определение суммы выигрыша в покере без создания побочных банков - PullRequest
9 голосов
/ 28 марта 2011

Я пытаюсь запустить симуляцию покера и у меня есть следующие данные о покерном столе

  • сколько каждый игрок внес в банк
  • "счет руки" (после флопа) для каждого игрока (то есть, если player[0].score == player[1].score, они связали)

Я застрял, подсчитывая, сколько должен выиграть каждый игрок без необходимости создавать побочные карты и назначая игроков каждому из них.

Например,

player[0].contributed = 100
player[1].contributed = 80
player[2].contributed = 20

player[0].score = 10
player[1].score = 2
player[2].score = 10

total_pot = 200;

В этом примере сначала нужно вернуть player[0] 20вернуться и убрать его из банка?

Затем, поскольку player[0] и player[2] сыграли вничью за первое место, а player[1] проиграл, если банк будет разделен на:

player[0].received = 170
player[1].received = 0
player[2].received = 30

И впоследствии, если player[1] выиграл, следует разделить банк на:

player[0].received = 20
player[1].received = 180
player[2].received = 0

Ответы [ 2 ]

10 голосов
/ 28 марта 2011

Сначала выполните сортировку по убыванию, так что вы получите две группы: {0, 2}, {1}.

Затем отсортируйте каждую группу в порядке возрастания: {2(20), 0 (100)}, {1 (80)}.

Теперь разделите банк в следующем порядке:

  1. Сначала вы возьмете (max) 20 вкладов каждого игрока для создания первого банка.И разделите его равномерно на 2 и 0. Первый банк будет (20 + 20 + 20 = 60. Таким образом, 0 и 2 получат 30).После этого выигрыши первых игроков завершаются, и у вас остаются: {0 (80)}, {1 (60)}.

  2. Теперь вы возьмете (максимум) 80 от каждого вклада игроков, чтобы создать следующий банк (80 + 60 = 140).И присвойте ему значение 0 (деление не требуется, так как в верхней группе больше одного человека, поэтому 0 получит целые 140).У вас останется: {1 (0)}.

  3. Вкладов больше нет, так что все готово.

Итак,всего в вашем примере 0 получит 170, а 2 получит 30.

2 голосов
/ 15 апреля 2014

Следующий код имеет очень большое количество утверждений, но БУДЬТЕ ОСТОРОЖНЫ , потому что я не проверил его тщательно. Непонятно, что делать с нечетными фишками; Я отдаю их игрокам, которые появятся позже в коллекции.

import java.util.*;

public class Player {
    int contributed, score, received;

    static void winnings(Collection<Player> players) {
        for (Player player : players) {
            assert player.contributed >= 0;
            player.received = 0;
        }
        int potCutoff = 0;
        while (true) {
            int playerCount = 0;
            int nextPotCutoff = Integer.MAX_VALUE;
            int scoreMax = Integer.MIN_VALUE;
            int winnerCount = 0;
            for (Player player : players) {
                if (player.contributed <= potCutoff) {
                    continue;
                }
                playerCount++;
                assert playerCount > 0;
                nextPotCutoff = Math.min(nextPotCutoff, player.contributed);
                if (player.score > scoreMax) {
                    scoreMax = player.score;
                    winnerCount = 1;
                } else if (player.score == scoreMax) {
                    winnerCount++;
                    assert winnerCount > 0;
                } else {
                    assert player.score < scoreMax;
                }
            }
            if (playerCount == 0) {
                break;
            }
            assert playerCount > 0;
            assert nextPotCutoff > potCutoff;
            assert potCutoff >= 0;
            assert Integer.MAX_VALUE / (nextPotCutoff - potCutoff) >= playerCount;
            int potTotal = playerCount * (nextPotCutoff - potCutoff);
            assert potTotal > 0;
            assert winnerCount > 0;
            assert winnerCount <= playerCount;
            for (Player player : players) {
                if (player.contributed <= potCutoff) {
                    continue;
                }
                assert player.contributed >= nextPotCutoff;
                if (player.score == scoreMax) {
                    assert winnerCount > 0;
                    int winnerShare = potTotal / winnerCount;
                    winnerCount--;
                    assert winnerShare > 0;
                    assert potTotal >= winnerShare;
                    potTotal -= winnerShare;
                    player.received += winnerShare;
                    assert player.received > 0;
                } else {
                    assert player.score < scoreMax;
                }
            }
            assert winnerCount == 0;
            assert potTotal == 0;
            potCutoff = nextPotCutoff;
        }
    }

    public static void main(String[] args) {
        Player p0 = new Player(), p1 = new Player(), p2 = new Player();
        p0.contributed = 100;
        p1.contributed = 80;
        p2.contributed = 20;
        p0.score = 10;
        p1.score = 2;
        p2.score = 10;
        Collection<Player> players = new ArrayList<Player>();
        players.add(p0);
        players.add(p1);
        players.add(p2);
        winnings(players);
        for (Player player : players) {
            System.out.println(player.received);
        }
    }
}
...