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;
}

LinkedListデッキがすでにシャッフルされている場合、配列は最適なデータ構造ではありません (配列は同じ数の要素を持つことが保証されているためです。カードが配られた後も 52 個の要素があります。カードは を使用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元の配列ではなくコピー)に影響を与えています。

これを処理する1つの方法は、戻り値を返しtempDeck、外部参照に割り当てることです。

于 2012-11-19T19:55:58.607 に答える
0

of で呼び出さDeckれるクラスを作成する必要があります。ListCard

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 に答える