2

我正在开发一个简单的应用程序,它是简单的纸牌游戏,我创建了一个包含游戏所有纸牌的数组,但问题是我不知道为什么我不能洗牌这个数组?

我尝试使用 RANDOM,但没有成功。

public class Mazzo {
    private Carta[] carteNelMazzo ;

    public Mazzo(){// create the deck
        carteNelMazzo = creaMazzo();
        mescolaMazzo(carteNelMazzo);
    }

   /**methods of the deck */

    public Carta PescaCarta (){

        return (carteNelMazzo==null||(carteNelMazzo.length>0)) ? pescaCarta(carteNelMazzo) : null;
    }

    public Carta pescaBriscola(){
        return (carteNelMazzo==null||(carteNelMazzo.length>0)) ? carteNelMazzo[carteNelMazzo.length-1] : null;
    }
    /**
     * @param carte deve avere lunghezza maggiore uguale ad 1
     * @return la prima carta del mazzo
     */
    private Carta pescaCarta(Carta[] carte){
        Carta[] nuoveCarte=new Carta[carte.length-1];
        Carta pescata= carte[0];
        System.arraycopy(carte,1,nuoveCarte,0,carte.length);
        carte = nuoveCarte;
        return pescata;
    }

    private Carta[] creaMazzo(){
        ArrayList<Carta> nuovoMazzo=new ArrayList<>();
        for(int i =0; i<4; i++){
            // selezione del seme

            for(int j = 0;j<10;j++){
                // creation of the card from another calss
                Carta nuovaCarta= new Carta(Carta.SEME.values()[i],j);
                nuovoMazzo.add(nuovaCarta);
            }
        }
        return (Carta[]) nuovoMazzo.toArray();
    }

//shuffle deck

    private void mescolaMazzo(Carta[] carte){

       Random rand = new Random();
       int elements = (int) (40 * Math.random());

       int elements = carteNelMazzo.length;
    }
}

最后,我希望这个数组与所有卡片随机混合。

4

4 回答 4

5

这里:

int elements = (int) (40 * Math.random());
int elements = carteNelMazzo.length;

不洗牌。它将一个随机数分配给一个局部变量,然后将其丢弃。(我实际上认为这甚至不应该编译,因为您在同一范围内声明了两次相同的局部变量)

您需要的是:创建一个将 40 个索引映射到新值的函数,例如:

0, 1, 3, ... 39 

变成

14, 2, 7, ...

到达那里的简单方法:Collections.shuffle(someList);.

有关更多想法(也直接使用数组),请参见此处

但是由于您这样做可能是为了学习东西,因此我建议您仔细消化我预先告诉您的内容。首先考虑如何“手动”洗牌(不是通过触摸它们,而是当你被告知它们的顺序时,你如何“在心理上”重新排列它们)。从那里开始,想一想如何指导计算机执行此操作。

于 2019-04-16T18:29:25.523 回答
2

利用:

Collections.shuffle(<<arrayname>>);
于 2019-04-16T18:35:23.550 回答
1

你可以尝试这样的事情:

private void shuffleCards (Card[] cards) {

    for (int i = 0; i < cards.length; i++) {
        Card temp = cards[i];

        //random index of the array
        int rnd = Math.floor(Math.random() * cards.length);
        cards[i] = cards[rnd];
        cards[rnd] = temp;
    }
}

PS .:如果此代码引发更改ArrayIndexOutOfBoundsExceptionint rnd = Math.floor(Math.random() * cards.length);int rnd = Math.floor(Math.random() * (cards.length - 1));

于 2019-04-16T18:34:50.367 回答
0

这是我多年前学到的一个。

  int[] cards = IntStream.rangeClosed(0, 51).toArray();
  Random r = new Random();

  for (int i = cards.length - 1; i >= 0; i--) {
     int idx = r.nextInt(i + 1);
     int card = cards[idx];
     cards[idx] = cards[i];
     cards[i] = card;
  }

然后总是有 Collections.shuffle() 类。

于 2019-04-16T22:25:01.207 回答