我的交易方法有问题

I am having difficulty with my deal method

在我的 PokerDeck class 中,如果不生成重复项,我无法将我的交易方法设为 运行。谁能告诉我我做错了什么?

import java.util.*;

public class PokerDeck {
    public static final int NUMBER_OF_CARDS = PokerCard.NUMBER_OF_SUITS * PokerCard.NUMBER_OF_RANKS;
    // Instance Variables
    private boolean[] deck;
    private int numberOfCardsInDeck;

    // Constructor
    public PokerDeck()

    {
        deck = new boolean[NUMBER_OF_CARDS];
        for (int j = 0; j < deck.length; j++)
            for (PokerCard.CardSuit suit : PokerCard.CardSuit.values())
                for (PokerCard.CardRank rank : PokerCard.CardRank.values())
                    deck[j] = true;

    }

    // Accessor
    public int getNumberOfCardsInDeck() {
        numberOfCardsInDeck = NUMBER_OF_CARDS;
        return this.numberOfCardsInDeck;

    }

    // Mutator:
    // Return all 52 PokerCards to this PokerDeck
    public void shuffle() {
        for (int i = 0; i < deck.length; i++) {
            int index = (int) (Math.random() * deck.length);
            deck[i] = deck[index];
        }

    }

    // Mutator:
    // Return a randomly selected PokerCard from this PokerDeck
    // Update the state of this PokerDeck to reflect removal of
    // the selected PokerCard
    // Exception thrown if this PokerDeck is "empty"

    public PokerCard deal() {
        Random dealer = new Random();
        int ran = dealer.nextInt(deck.length);
        if (numberOfCardsInDeck == 0)
            throw new RuntimeException("Empty Deck");

        if (deck[ran] == false)
            ran = dealer.nextInt(deck.length);

        deck[ran] = false;
        int suit = ran / 13;
        int rank = ran % 13;

        return new PokerCard(PokerCard.CardSuit.values()[suit], PokerCard.CardRank.values()[rank]);
    }
}

我至少尝试了五种不同的代码,但所有代码要么没有 运行,要么 运行 和 return 重复。

这段代码有很多错误。你的问题是,因为你越来越随机而不是使用你在 deal 方法开始时声明的 te ran 变量。声明 ran 变量后,不要执行 dealer.nextInt(deck.length),将其替换为 ran

你的洗牌不是真的洗牌,检查一下:Random shuffling of an array

比较(如if(something == false))应该用==来完成,你正在用=来做(但你可能只是粘贴错了)。

在你的 getter 这个 numberOfCardsInDeck = NUMBER_OF_CARDS; 是错误的,除非你想 'refresh' 一副牌而不是只得到一些牌,但我不这么认为,删除那条线。

你的构造函数中的三重 for 是错误的,你只需要第一个,它在这里没有什么区别(性能除外),但请修复它。

此外,我建议重写所有这些,用花色和等级枚举做一个 Card 对象 (class),用 Card 对象列表做一个 Deck 对象,做一个 deck.getCard() 方法从牌组中取出最后一张牌,制作 deck.shuffle() 洗牌的方法(你现在将有一个牌列表,而不是一个数组,所以你将能够做 Collections.shuffle(cardList) , 简单).

此外,更改此:

if (deck[dealer.nextInt(deck.length)] == false)
            dealer.nextInt(deck.length);

像这样:

while (deck[ran] == false)
            ran = dealer.nextInt(deck.length);

有一些可怕的错误让我想知道您阅读了多少自己的代码:

  1. 此处重用随机数:

    if (deck[dealer.nextInt(deck.length)] == false)
    

    表示你会再次随机化,不再使用之前生成的ran

  2. 这个街区

    if (deck[dealer.nextInt(deck.length)] == false)
        dealer.nextInt(deck.length);
    

    没有用,因为 dealer.nextInt(deck.length) 只是创建一个值而不存储任何内容。 我猜你想 "keep trying until you find a valid card" 所以它应该看起来更像这样:

    while (deck[ran] == false)
        ran = dealer.nextInt(deck.length);
    
  3. 此处的 Shuffle() 方法只是简单地复制牌组中每个地方的值,因为不是交换,而是简单地将第一个值替换为第二个值,从而丢失第一个值。为避免这种情况,只需添加

    boolean b = deck[i];
    deck[i] = deck[index];
    deck[index] = b;
    

    使其成为交换。

这是我第一次阅读后发现的全部内容。