java - 使用 for 循环的方法不会打乱我的数组元素或重写所有元素

标签 java arrays for-loop shuffle

我有一个类 Deck_of_Cards,它有一个默认构造函数,它将新定义的大小为 52 的数组分配到“deck”中,然后激活类刷新方法。

刷新方法使用嵌套的 for 循环将卡片分配到牌组中,然后激活类 shuffle 方法,正如您可能猜到的那样,该方法使用 for 循环来随机化“牌组”数组中所有元素的位置。执行测试代码应该会产生五张不同的卡,而不是我得到一张卡五次,示例如下所示。

Jack of Diamonds
Jack of Diamonds
Jack of Diamonds
Jack of Diamonds
Jack of Diamonds

测试代码

public class test {

    Deck_of_Cards X = new Deck_of_Cards();

    int drawCount = 5;

    for(int i = 0; i<drawCount; i++)
    {
        printCard(X.drawCard());
    }

    //Outputs the given card's data as "<rank> of <suit>".
    public static void printCard(Card c) {
        String st;

        if (c.getRank() == '1')
            st = c.getRank() + "0 of " + c.getSuit();

        else if (c.getRank() == 'A')
            st = "Ace of " + c.getSuit();

        else if (c.getRank() == 'J')
            st = "Jack of " + c.getSuit();

        else if (c.getRank() == 'Q')
            st = "Queen of " + c.getSuit();

        else if (c.getRank() == 'K')
            st = "King of " + c.getSuit();

        else
            st = c.getRank() + " of " + c.getSuit();


        switch (c.getSuit()) {

卡片类别

public class Card {
    private char suit;
    private char rank;

    //Constructor 
    public Card(char s, char r) 
    {
        // Suit if-statement
        if (s == 'C' || s == 'D' || s == 'H' || s == 'S' )
        {
            s = suit;
        }
        else 
        {
            throw new IllegalArgumentException("Not a valid suit!");
        }

        // Rank if-statement
        if (r == 'A' || r == '2' || r == '3' || r == '4' || r == '5' || r == '6' || r == '7' || r == '8' || r == '9' || r == 'J' || r == 'Q' || r == 'K')
        {
            r = rank;
        }
        else 
        {
            throw new IllegalArgumentException("Not a valid rank!");
        }

    }

    // Accessors
    public char getRank()
    {
        return rank;
    }

    public char getSuit()
    {
        return suit;
    }

Deck_of_Cards 类

import java.util.*;

public class Deck_of_Cards {

    private Card deck [];
    private int position;


    Random rng = new Random();


    public Deck_of_Cards ()
    {
        deck = new Card[51];


        refresh();
    }

    public void refresh()
    {   
        char suit[] = {'C', 'D', 'H', 'S'};
        char rank[] = {'A', '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K'};

        int index = 0;
        for (int i = 0; i < suit.length; i++)
        {
            for (int j = 0; j < rank.length; j++) 
            {
                deck[index] = new Card(suit[i], rank[j]);
                index++;
            }
        }

        shuffle();
    }

    public void shuffle()
    {
        for (int x = deck.length; x >= 0; x--)
        {
            position = rng.nextInt(x+1);
            Card g = deck [x];

            deck[x] = deck[position];
            deck[position] = g;

            //Reseting position back to zero
            if(x == 0)
            {
                position = 0;
            }
        }



    }

    public Card drawCard()
    {
        return deck[position];
    }

}



最佳答案

问题是在drawCard中:

public Card drawCard()
{
    return deck[position];
}

你不会改变位置,所以每次你调用它时,你都会一遍又一遍地抽同一张牌。将其更改为:

public Card drawCard()
{
    return deck[position++];
}

增加位置(或位置--,具体取决于您如何可视化“牌组”)

关于java - 使用 for 循环的方法不会打乱我的数组元素或重写所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54391640/

相关文章:

javascript - 为什么 array.forEach(() => { array.pop() }) 不会清空数组

python - 并行运行 for 循环中的所有迭代

javascript - 如何使用三个js使用体素生成器生成地形

java - 在MVC架构中, `View`可以访问模型吗?

java - JNDI 查找是否保持连接打开 - 这就是我的负载平衡被破坏的原因吗?

java - 如何更改Java Post上传文件的最大大小

C 指向整数数组数组的指针

java - 为什么这段代码会继续(递归)?

c - 数组衰减为指针的异常?

javascript - 为什么这个 for 循环返回字符的索引而不是整个属性?