【问题标题】:How can I use my private shuffle如何使用我的私人随机播放
【发布时间】:2017-02-15 10:24:51
【问题描述】:

我的问题是我似乎无法在 CardDeck 类中使用我的 shuffle() 方法,它是 private (必须是私有的)。不太确定是应该在drawNextCard() 方法中使用它还是在CardDeck() 构造函数中使用它。我也不太确定我的编码是否正确。任何建议/提示将不胜感激!

import java.util.*;
public class CardDeck
{
    private String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10",
                    "J", "Q", "K", "A" };
    private char[] suits = {'s','h','d','c'};
    private Card[] cards = new Card[13];
    private int currentCard;

    CardDeck()
    {
        Card newCard;

        for(int i=0; i<4; i++)
        {
            for(int j=0; j<13; j++)
            {
                cards[j] = new Card(this.ranks[j], this.suits[i]);
            }
        }

    }

    public void testing() //just for testing 
    {
        System.out.println(this.suits[0]);
    }   

    public Card drawNextCard()
    {
        return cards[currentCard++];
    }

    private void shuffle()
    {
        Card[] tmp = new Card[200];
        for (int i = 0; i < cards.length; i++)
        {
            int index = i + (int)(Math.random() * (cards.length));

            tmp[i] = cards[i];
            cards[i] = cards[index];
            cards[index] = tmp[i];
        } 
    }
}

主要:

public class BlackJoker
{
    public static void main(String[] args)
    {
        CardDeck cardDeck = new CardDeck();

        cardDeck.testing();
        System.out.println(cardDeck.drawNextCard());
        System.out.println(cardDeck.drawNextCard());
        System.out.println(cardDeck.drawNextCard());
        System.out.println(cardDeck.drawNextCard());
        System.out.println(cardDeck.drawNextCard());
        System.out.println(cardDeck.drawNextCard());
    }
}

我的测试输出是

s
2c
3c
4c
5c
6c
7c

【问题讨论】:

  • 你想如何使用shuffle()?你永远不会在这段代码中调用它。
  • 另外:你的牌组应该有 52 张牌长。您创建 13 张卡片,然后覆盖它们。
  • 我在这里根本看不到问题。这只是您想要实现它的方式。如果你想在拿到下一张牌之前洗牌,你应该在 drawNextCard 方法中调用它。否则,如果您希望它仅在开始时被洗牌,请在构造函数中调用它。
  • 你可以在构造函数中调用你的方法就好了。那有什么问题?另外,我不确定我是否需要任意大小的 tmp 数组
  • 大家好,感谢您的回复。好的,所以我尝试在 drawNextCard 中调用 shuffle 方法,但我似乎通过使用此“Card.this.shuffle();”得到了一条错误消息。我尝试了许多可能的调用方式,例如“CardDeck.cards.shuffle();”或“this.shuffle();”但我收到如下错误消息:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 53 或 CardDeck.java:31: not an enclosure class: Card Card.this.shuffle(); ^

标签: java methods


【解决方案1】:
int index = i + (int)(Math.random() * (cards.length));

您收到 IOB Exception 的原因是由于上述声明。您的卡片索引不能超过 12,但上述语句有可能会超过 12。因此,以下是替换上述语句的可能选项:

  1. int index = (int)(Math.random() * (cards.length)); 限制是 - 可以与自己交换卡片,并且可以将卡片交换回原来的位置。
  2. 另一种选择是使用 Collections.shuffle():

    private void shuffle() { List<Card> cardList = Arrays.asList(cards); Collections.shuffle(cardList); cards = cardList.toArray(cards); }

对于您在评论部分的问题,关于如何调用 shuffle,这取决于您要调用它的位置。如果它在同一个类中定义,你只需调用它shuffle();。如果它在主类或其他类中,则在类的实例之后调用它,例如 CardDeck cardDeck = new CardDeck(); cardDeck.shuffle();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多