0

我正在尝试从一副 52 张牌中处理一张牌,我的功能如下所示:

public static Card dealCard(Card[] deck){
    Card[] tempDeck = new Card[deck.length-1];
    for (int i =0; i<tempDeck.length; i++){
        tempDeck[i] = deck[i];
    }
    Card cardDealed = deck[deck.length-1];
    deck = tempDeck;
    return cardDealed;
}

当我这样调用函数时:

    Card a = dealCard(deck);
    System.out.println(deck.length);

我得到52?任何人都可以请帮忙。非常感谢您的宝贵时间。

编辑:如果我在调用函数之前获得最后一个值并且函数只会将其减少 1 个长度,是否有可能?

4

6 回答 6

3

试试这个。如果你的全局deck变量被调用deck

public static Card dealCard(Card[] d){
Card[] tempDeck = new Card[d.length-1];
for (int i =0; i<tempDeck.length; i++){
    tempDeck[i] = d[i];
}
Card cardDealed = d[d.length-1];
deck = tempDeck;
return cardDealed;
}

作为替代方案,你可以简单地跟踪最后一张牌的索引,而不是改变你的牌组大小。所以:

lastCardDealt = deck.length; // start at last index +1

public static Card dealCard(Card[] d){
    lastCardDealt = lastCardDealt - 1;
    return deck[lastCardDealt];
}

这样你就有更少的循环。在每手牌开始时,洗牌并重置lastCardDealtdeck.length

于 2012-11-19T19:57:52.147 回答
1

你的算法实际上并没有洗牌,它只是照原样复制它......这将为你洗牌,然后你可以拿最上面的元素来发牌。

public static Card[] shuffle(Card[] deck){
    Card[] tempDeck = new Card[deck.length];
    for (int i = 0; i < deck.length; i++) {
        tempdeck[i] = deck[i];
    }
    Random r = new Random();
    for (int i = tempDeck.length - 1; i > 0; i--){
        int shuffleCard = r.nextInt(i + 1);
        swap(tempDeck, i, shuffleCard);
    }

    return tempDeck;
}

public static void shuffle(Card[] deck, i, j) {
    Card temp = deck[i];
    deck[i] = deck[j];
    deck[j] = temp;
}

如果您的牌组已经洗牌,那么数组不是最适合您的数据结构(因为数组保证具有相同数量的元素。发牌后它仍然有 52 个元素。考虑 a LinkedList,然后处理一张卡只使用deck.pop(),因为之后它将只有 51 个元素。

public LinkedList<Card> listDeck(Card[] cards) {
    return new LinkedList<Card>(Arrays.asList(cards));
}

如果您必须使用数组,则可以这样做(这会将数组末尾的元素更改null为发牌时。

// this modifies the original array
public static Card dealCard(Card[] deck) {
    for(i = deck.length - 1; i >= 0; i--) {
        if(deck[i] != null) {
            Card toReturn = deck[i];
            deck[i] = null;
            return toReturn;
        }
    }
    // Deck is empty!!
    return null;
}
于 2012-11-19T20:00:00.190 回答
0

当然,您确实得到 52。您的牌组中有 52 张牌,并且您无需更改 dealCard 中的数组。

如果要删除卡片,最好使用像这样的集合List<Card>(例如ArrayList<Card>.

于 2012-11-19T19:54:27.883 回答
0

您的dealCard方法不会操作在deck方法外部定义的原始数组。它创建一个新的(较小的)数组,然后让deck方法内定义的指针指向新数组。但这不会改变deck方法外部定义的指针。

于 2012-11-19T19:55:56.313 回答
0

Java 是按值引用传递的(这意味着将传递引用的副本)。

您在内部所做的更改dealCard会影响传递给的参考值(副本,而不是原始值)dealCard,而不是原始数组。

处理此问题的一种方法是返回tempDeck并将其分配给外部引用。

于 2012-11-19T19:55:58.607 回答
0

您应该创建一个Deck用 a Listof Cards 调用的类。

public class Deck {
    List<Card> cards = new ArrayList<Card>();

    //...

    public Card getNextCard() {
        //...verify there are card(s) a 
        //make sure once a card is dealt, it's not in the deck anymore
        return this.list.remove(list.size() - 1); 
    }
}

然后,您可以创建一个名为的类,该类Dealer可以使用该方法来发牌。

于 2012-11-19T19:58:23.610 回答