在扑克中随机处理 5 张牌
Dealing a Random Hand of 5 Cards in Poker
正如标题所示,我需要随机发 5 张牌来模拟扑克游戏。我还必须安排事情,使手牌不能多次包含同一张牌。这是我目前所拥有的:
public static ArrayList<Card> makeDeck()
{
ArrayList<Card> deck = new ArrayList<Card>( 52 );
String[] suits =
{ "spades", "hearts", "diamonds", "clubs" };
for ( String suit : suits )
{
for ( int k = 2 ; k <= 14 ; k++ )
{
deck.add( new Card( suit, k ) );
}
}
return deck;
}
public static ArrayList<Card> dealHand( ArrayList<Card> deck )
{
ArrayList<Card> hand = new ArrayList<Card>(5);
Random rc = new Random();
for ( int j = 0; j <= hand.size(); j++)
{
hand.add(rc.nextInt(deck.size()));
}
return hand;
}
public static void main( String[] args )
{
System.out.println(dealHand());
}
我收到一条错误消息说:MainClass.java:38:错误:找不到适合 add(int) 的方法
hand.add(rc.nextInt(deck.size()));
如果有人可以向我解释如何修复此错误,那将非常有帮助,谢谢!
改变
hand.add(rc.nextInt(deck.size()));
至
hand.add(deck.get(rc.nextInt(deck.size())));
您只是在创建一个随机数并将其添加到您的手上。我想你想获得代表的 Card
并将其添加到手上。
试试这个:
int cardNumber = rc.nextInt(deck.size());
Card card = deck.remove(cardNumber);
hand.add(card);
为了清楚起见,我把它写得比需要的更冗长了。如果需要,这可以在一行中完成:
hand.add(deck.remove(rc.nextInt(deck.size())));
注意使用牌组中的 remove()
而不是 get()
否则您将 运行 冒着发同一张牌两次(或更多次)的风险。
根据您的评论编辑:是的,您需要更改在 main()
中的调用方式:
System.out.println(dealHand(makeDeck()));
你没有把牌组传到 dealHand()
。
编辑 2 哦!哈,我想通了。检查你的循环,它增加了手牌的数量,所以循环永远不会终止并且牌组 运行s 没有牌。
改变
for ( int j = 0; j <= hand.size(); j++)
到
for ( int j = 0; j < 5; j++) // Note less-than, not less-than-or-equal-to
也可能值得考虑将手牌大小作为 makeHand()
的参数并使用它来预分配 ArrayList
并驱动此循环而不是依赖于 "magic number" 5.
正如标题所示,我需要随机发 5 张牌来模拟扑克游戏。我还必须安排事情,使手牌不能多次包含同一张牌。这是我目前所拥有的:
public static ArrayList<Card> makeDeck()
{
ArrayList<Card> deck = new ArrayList<Card>( 52 );
String[] suits =
{ "spades", "hearts", "diamonds", "clubs" };
for ( String suit : suits )
{
for ( int k = 2 ; k <= 14 ; k++ )
{
deck.add( new Card( suit, k ) );
}
}
return deck;
}
public static ArrayList<Card> dealHand( ArrayList<Card> deck )
{
ArrayList<Card> hand = new ArrayList<Card>(5);
Random rc = new Random();
for ( int j = 0; j <= hand.size(); j++)
{
hand.add(rc.nextInt(deck.size()));
}
return hand;
}
public static void main( String[] args )
{
System.out.println(dealHand());
}
我收到一条错误消息说:MainClass.java:38:错误:找不到适合 add(int) 的方法
hand.add(rc.nextInt(deck.size()));
如果有人可以向我解释如何修复此错误,那将非常有帮助,谢谢!
改变
hand.add(rc.nextInt(deck.size()));
至
hand.add(deck.get(rc.nextInt(deck.size())));
您只是在创建一个随机数并将其添加到您的手上。我想你想获得代表的 Card
并将其添加到手上。
试试这个:
int cardNumber = rc.nextInt(deck.size());
Card card = deck.remove(cardNumber);
hand.add(card);
为了清楚起见,我把它写得比需要的更冗长了。如果需要,这可以在一行中完成:
hand.add(deck.remove(rc.nextInt(deck.size())));
注意使用牌组中的 remove()
而不是 get()
否则您将 运行 冒着发同一张牌两次(或更多次)的风险。
根据您的评论编辑:是的,您需要更改在 main()
中的调用方式:
System.out.println(dealHand(makeDeck()));
你没有把牌组传到 dealHand()
。
编辑 2 哦!哈,我想通了。检查你的循环,它增加了手牌的数量,所以循环永远不会终止并且牌组 运行s 没有牌。
改变
for ( int j = 0; j <= hand.size(); j++)
到
for ( int j = 0; j < 5; j++) // Note less-than, not less-than-or-equal-to
也可能值得考虑将手牌大小作为 makeHand()
的参数并使用它来预分配 ArrayList
并驱动此循环而不是依赖于 "magic number" 5.