如何使用Java在扑克中打印所有可能的“满堂”?

时间:2010-10-05 23:24:42

标签: java poker

我想知道是否有人知道如何在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 个答案:

答案 0 :(得分:2)

在进一步操作之前,请在代码中添加一些注释。它将帮助您了解发生了什么,特别是当您使用单字符变量名称嵌套4深的循环时。

接下来,解决问题:满堂红的真正独特之处是什么?两个点数都是唯一的,但不能相同。 3种不同的西装(或者只缺少1种),并且有2种不同的西装。

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

考虑一下这个列表中可能缺少的内容。如果您有任何具体问题,只需编辑答案,我们就可以了解它:)

答案 1 :(得分:1)

主方法中的代码太多了。你需要在这里更好地使用方法。

创建一个名为isFullHouse(Card[] card)的方法,该方法接收5张卡的数组(或ArrayList),并确定手是否为满屋。

然后,您如何选择创建所有可能的手组合取决于您。每次获得新手时,请调用此方法。它会为你简化一些事情。主要的一切都很难读。

至于如何存储您的卡片组。而不是所有那些数组,存储一个0-51。您可以在阵列上使用除法和运算符来确定您拥有的卡。神奇的数字是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所以加一个)

将所有这些想法存储在他们自己的方法中,您可以大大简化您的循环。

答案 2 :(得分:1)

前几天我看到了这个问题(生病了)。从那以后,我一直在讨论关于鸣叫的问题。一方面,它似乎是家庭作业。 (这是一个简单的问题。你的代码很难理解,表明缺乏经验。)

另一方面,我不介意帮忙。我不会为你做你的工作,但我可以指出你正确的方向......


第一步:定义问题。一旦明确定义,答案就会变得更加直截了当。

“满堂红”,大​​概是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)视为等效而非不同。 (这实际上是非常重要的一点,正如Sean&amp; 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 )

其中三个(!=)是真的,一个是假的。

对于打印对,您可能需要调查继续语句。参考:http://en.wikipedia.org/wiki/Java_syntax#continue_statement

E.g。这将允许您跳过配对卡与三种卡的排名相同的情况:

if ( threeOfAKindCard == pairCard )
    continue;

我建议您分批构建软件。即使对于专家来说,尝试构建完整的系统也很少有效。制造零件,测试它们,冲洗,重复。是的,这意味着编写脚手架代码,你不会把它。也许甚至是一个测试子类......但是小步骤更容易实现。随着您作为程序员的进步,您将能够采取更大的步骤......

答案 3 :(得分:0)

快速而肮脏。还有很大的改进空间,但如果我的数学是正确的,这应该给你所有有效的手工组合。

public class 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();
    }
}

}