我想知道是否有人知道如何在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 ++;
}
}
}
}
}
}
答案 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();
}
}
}