在扑克中随机处理 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.