Как я могу распечатать все возможные "фулл-хаусы" в покере с Java? - PullRequest
2 голосов
/ 06 октября 2010

Мне было интересно, знает ли кто-нибудь, как реализовать код в java для печати всех случаев фулл-хауса. Есть примерно 3700 разных случаев. Пока мне около 2700, но у меня проблемы со сменой костюмов, она - то, что у меня есть.

public class FullHouseTest 
{//
static int count = 1;
static int [] cards ={1,2,3,4,5,6,7,8,9,10,11,12,13};
static int[] suit ={1,2,3,4};
static int[] suit2 ={2,3,4,1};
static int[] suit3 ={3,4,1,2};
 public static void main(String[] args) 
 { 
  for(int k = 0; k< 12; k++)
  {
   for(int i = 0; i < 3; i++)
   {
    for (int t = 0; t <3; t++)
    { 
     Card one = new Card(new Suit(suit[t]), new Pips(cards[k]));
     Card two = new Card(new Suit(suit2[t]), new Pips(cards[k]));
     Card three = new Card(new Suit(suit3[t]),new Pips(cards[k]));

     for (int j =0; j < 12; j++)
      { 
        Card four = new Card(new Suit(suit2[i]), new Pips(cards[j+1]));
        Card five = new Card(new Suit(suit[i]), new Pips(cards[j+1]));
        System.out.println("Hand:" + count + " | " + one + two + three + four + five);
        count ++;
      }
    }
   }
  }
  for(int i = 0; i < 3; i++)
  {
   for(int k = 0; k< 12; k++)
   {
     for(int s = 0; s<3; s++)
     {
      Card one = new Card(new Suit(suit[i]), new Pips(cards[k]));
      Card two = new Card(new Suit(suit2[i]), new Pips(cards[k]));
     for (int j =0; j < 12; j++)
     {

      Card three = new Card(new Suit(suit3[s]),new Pips(cards[j+1]));
      Card four = new Card(new Suit(suit2[s]), new Pips(cards[j+1]));
      Card five = new Card(new Suit(suit[s]), new Pips(cards[j+1]));
      System.out.println("Hand:" + count + " | " + one + two + three + four + five);
      count ++;


     }
    }
   }
  }

 }
}

Ответы [ 4 ]

2 голосов
/ 06 октября 2010

Добавьте несколько комментариев к своему коду, прежде чем идти дальше.Это поможет вам понять, что происходит, особенно если у вас есть вложенные циклы 4 с именами переменных с одним символом.

Далее рассмотрим проблему: что на самом деле уникально в фулл-хаусе?Оба # пункта являются уникальными, но не могут быть одинаковыми.У тройки есть 3 разных масти (или просто не хватает одной), а у пары 2 разных масти.

total_pips * (total_pips-1) * number_suits *  (possible combinations of 2 suits )  = 3744
     13            12               4                         6

Подумайте, чего вам не хватает в этом списке.Если у вас есть какие-то конкретные вопросы, просто отредактируйте ответ, и мы получим правильный ответ:)

1 голос
/ 10 октября 2010

Я видел эту проблему на днях (пока болел). С тех пор я спорю о перезвоне. С одной стороны, это похоже на домашнюю работу. (Это простая проблема. Ваш код сложен для понимания, что свидетельствует об отсутствии опыта.)

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


Первый шаг: Определите проблему. После четкого определения ответы становятся гораздо более простыми.

A «фулл-хаус» , предположительно 5 карт, состоящих из трех в своем роде плюс пара. Предположительно, это игра с одной колодой. Предположительно, это стандартная колода (Ace, 2,3,4,5,6,7,8,9, Jack, Queen, King) с мастями (пики, трефы, червы, бубны). (Сокращено ниже как (A23456789JQK) и (SCHD).)

Вы упомянули 3700 комбинаций. Предположительно поэтому вы рассматриваете руки (2S, 2C, 2H, 3H, 3D) и (3D, 3H, 2H, 2C, 2S) как эквивалентные, а не отличные. (Это на самом деле довольно важный момент, о котором говорил Шон и Loadmaster в своих комментариях. Существует 311 875 200 (52 * 51 * 50 * 49 * 48) возможных 5-карточных рисунков. Однако только 2 598 960 из этих рук различны!)

У нас есть (13 * 4) возможные тройки. Например. Для каждой карты ранга (например, 3) у нас может быть 4 тройки ({0S, 3C, 3H, 3D}, {3S, 0C, 3H, 3D}, {3S, 3C, 0H, 3D }, {3S, 3C, 3H, 0D}). (Возможно, вы начинаете замечать закономерность: 0111 1011 1101 1110.)

Дайте нашу тройку в своем роде, и, предполагая, что это игра с одной колодой и стандартной колодой, наша пара должна быть одним из 12 оставшихся рядов карт. Для каждого ранга карты есть шесть возможностей для пары. Например. Если бы у нас был рейтинг карты 7, мы могли бы иметь ({7S, 7C, 0H, 0D}, {7S, 0C, 7H, 0D}, {7S, 0C, 0H, 7D}, {0S, 7C, 7H, 0D} {0S, 7C, 0H, 7D}, {0S, 0C, 7H, 7D}). (Опять же, возможно, вы заметили шаблон: 1100 1010 1001, 0110 0101, 0011.)

Это дает нам 13 * 4 * 12 * 6 = 3744 комбинаций.

Отсюда просто зацикливаться, чтобы распечатать их.

Я предлагаю вам рассмотреть более описательные имена переменных. Хотя есть места и время для использования односимвольных переменных цикла, это не одна из них. Хорошо написанный код почти самодокументируется, что позволяет сосредоточиться на более сложных абстракциях более высокого уровня. Несколько лишних символов, которые вы сохраните, обойдутся вам в целую кучу времени на отладку. При желании вы можете быть ленивым, как я, изучать emacs, использовать (требовать 'завершение), (global-set-key "\ C - \\"' завершить), набрать первые несколько символов и позволить автозаполнению emacs для вас .

Я предлагаю вам подумать о поддержке и, возможно, о частных методах. Например, вы можете сделать что-то вроде: (Прошло много времени с тех пор, как я последний раз программировал на Java.)

for ( suit = 0;  suit < 4 ;  ++ suit )
    private_printThreeOfAKind( card, suit!=0, suit!=1, suit!=2, suit!=3 )

Три из них (! =) Были бы верными, один - ложными.

Что касается печати пар, вы можете захотеть изучить оператор continue . Ссылка: http://en.wikipedia.org/wiki/Java_syntax#continue_statement

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

if ( threeOfAKindCard == pairCard )
    continue;

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

1 голос
/ 06 октября 2010

Слишком много кода в основном методе. Вы должны использовать методы лучше здесь.

создайте метод с именем isFullHouse(Card[] card), который принимает массив (или ArrayList) из 5 карт и определяет для вас, является ли рука фулл-хаусом.

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

Насколько вы храните свою колоду карт. вместо всех этих массивов храните тот, который является 0-51. Вы можете использовать операторы split и mod в массиве, чтобы определить, какая у вас карта. Магическое число - 13.

i.e. The 47 card in the deck could be: 47/13=3 ; 47 % 13 = 8

Если вы заранее определили, что 0 = червы, 1 = алмазы, 2 = булавы и 3 = пики, то вы можете определить, что эта карта является 9 of spades (8 + 1, поскольку нет карты со значением 0 так что добавь)

Храните все эти идеи в своих собственных методах, и вы можете значительно упростить свои циклы.

0 голосов
/ 08 октября 2010

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

открытый класс PrintFullHouse {

enum Suit {CLUBS, DIAMONDS, HEARTS, SPADES}
enum Rank {Ace, One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King}

public static void main(String[] args) {

     String[] ranks = new String[14];
     String[] suits = new String[4];

    populateSuits(suits);
    populateCards(ranks);

    int numberOfCombos = 0;

    //Loop over all card values. This outer for loop is for the 3 of kind values. 3 Aces, 3 Twos, 3 Threes, etc
    for(int card = 0; card < ranks.length; card++)
    {
        String firstCard = ranks[card]; 

        for(int suit1 = 0; suit1 < suits.length; suit1++)
        {
            for(int suit2 = suit1+1; suit2 < suits.length; suit2++)
            {
                for(int suit3 = suit2+1; suit3 < suits.length; suit3++)
                {
                    //Loop over all card values that aren't equal to the firstCard.So we won't have 3 Aces and 2 Aces
                    for(int card2 = 0; card2 < ranks.length; card2++)
                    {
                        String secondCard = ranks[card2]; 

                        //Dont Compare the 3 of a Kind and 2 pair when they are the same rank. ie Aces and Aces
                        if(firstCard.compareTo(secondCard) != 0){
                            for(int othersuit1 = 0; othersuit1 < suits.length; othersuit1++)
                            {
                                for(int othersuit2 = othersuit1+1; othersuit2 < suits.length; othersuit2++)
                                {
                                    //Found a valid combo if 3 of a kind have different suits, 2 pair have different suits, and card1 is not equal to card2
                                    numberOfCombos++;
                                    System.out.println(numberOfCombos+". "+firstCard+" "+suits[suit1]+" "+firstCard+" "+suits[suit2]+" "+firstCard+" "+suits[suit3]+ " "
                                                       +secondCard+" "+suits[othersuit1]+" "+secondCard+" "+suits[othersuit2]);
                                }
                            }
                        }
                    }               
                }
            }
        }
    }
}

private static void populateSuits(String[] suits) {

    int index = 0;
    for(Suit suit: Suit.values())
    {
        suits[index++] = suit.toString();
    }
}

private static void populateCards(String[] ranks) {

    int index = 0;
    for(Rank rank: Rank.values())
    {
        if(index != ranks.length)
        ranks[index++] = rank.toString();
    }
}

}

...