我在打扑机时遇到了一些麻烦。我不确定在我的甲板课的手工课或我的dealCard方法中是否有什么问题。当我尝试运行它时,它就会继续运行。在我最终停止它之前,它超过了4分钟。
当我尝试调用dealCard方法时,我需要一个变量,但我对如何做到这一点感到困惑?我得到了导师的帮助,但是我必须离开才能获得主要内容,现在我对dealCard Method和Hand类感到有点困惑。
卡:
public class Card
{
String suits;
String values;
public Card(int suit, int value)
{
if (suit == 0)
{
suits = "Spades";
}
else if (suit == 1)
{
suits = "Clubs";
}
else if (suit == 2)
{
suits = "Hearts";
}
else
{
suits = "Diamonds";
}
if (value == 0)
{
values = "2";
}
else if (value == 1)
{
values = "3";
}
else if (value == 2)
{
values = "4";
}
else if (value == 3)
{
values = "5";
}
else if (value == 4)
{
values = "6";
}
else if (value == 5)
{
values = "7";
}
else if (value == 6)
{
values = "8";
}
else if (value == 7)
{
values = "9";
}
else if (value == 8)
{
values = "10";
}
else if (value == 9)
{
values = "Jack";
}
else if (value == 10)
{
values = "Queen";
}
else if (value == 11)
{
values = "King";
}
else
{
values = "Ace";
}
}
}
甲板:
public class Deck
{
Card[] deck = new Card[52];
public Deck()
{
int element;
for(int iSuit = 0; iSuit < 4; iSuit++)
{
for(int iValue = 0; iValue < 13; iValue++)
{
element = iSuit * 13 + iValue;
deck[element] = new Card(iSuit, iValue);
}
}
}
public void shuffle()
{
Card[] newDeck = new Card[52];
int element = (int) (Math.random()*52);
for(int index= 0; index < 52; index++)
{
do
{
if (newDeck[element]== null)
{
newDeck[element]=deck[index];
}
else
{
element = (int) (Math.random()*52);
}
}while(newDeck[element]!=null);
}
deck = newDeck;
}
public Card dealCard(int card)
{
return deck[card];
}
}
手:
public class Hand
{
Card[] hand = new Card[5];
public Hand(Deck deck)
{
int element;
for(int card = 0; card < 4; card++)
{
hand[card]=deck.dealCard(card);
}
}
}
主:
public class FiveCardPoker
{
public static void main(String[] args)
{
Deck timsDeck = new Deck();
timsDeck.shuffle();
Hand timsHand = new Hand(timsDeck);
System.out.println(timsHand);
}
}
答案 0 :(得分:1)
首先,能够更多地自我诊断是非常重要的。添加一些日志记录或使用调试器应该可以帮助您确定代码正在执行的操作 - 您不应该只需要依赖于完美的输出。
其次,一些单元测试可以帮助您更清楚地验证代码的各个部分。
第三,我怀疑问题是while
中的shuffle
循环:
do
{
if (newDeck[element]== null)
{
newDeck[element]=deck[index];
}
else
{
element = (int) (Math.random()*52);
}
}while(newDeck[element]!=null);
在封闭循环的最后一次迭代中,您已经填充了 newDeck
的每个插槽 - 因此无法找到{{1}的值这样element
。所以你的newDeck[element] = null
循环将永远持续下去。
这实际上是一种非常痛苦的改组方式 - 请考虑使用while
代替。
然后 还需要在地方覆盖Collections.shuffle(Arrays.asList(deck))
以获得良好的输出。另外,我建议为套装和值推荐字符串数组,以大幅减少toString()
构造函数的大小:
Card
或者,对套装和价值使用枚举 - 卡牌通常用作枚举很有意义的情况的例子。