0

私はJavaを学ぼうとしていて、ランダムに生成されたカードのデッキからランダムに5枚のカードを選択する非常に単純なクラスを作りたいと思っていました. 私は、解決するのが非常に簡単な問題であるべきだと思う何かに遭遇しています。また、これは私が通っている大学の研究室のためのものなので、コードのブロックを渡さずに私を導くことができれば、それが望ましいでしょう.

これは私が受け取ったエラーであり、私はそれを受け取った理由を理解しています:

式の型は配列型でなければなりませんが、Deck に解決されました

これが私のコードです:

public static void main(String[] args) {
    System.out.println(select(5));
}

public static Card[] select(int k)
{
    Random rand = new Random(52);
    Deck deck = new Deck(52);
    Card[] hand = new Card[5];
    for (int j = 0; j < 5; j += 1)
    {
        int index = rand.nextInt(52-j);
        hand[j] = deck[index];
    }
    return hand;
}

Deck.java および Card.java クラスは、講師 (実習中は不在) によって提供されました。

また、最近、このコードではやりたいことを実行できないことに気付きましたが、上記のエラーを把握する必要があります。私が抱えている他の問題を解決したい場合は、以下の説明に自由に答えてください。しかし、それが私がここにいる理由ではありません。

5枚のカードをランダムに選択したいです。ランダムに選択されたカードが私のデッキ オブジェクトのインデックス 27 にあるとしましょう。次に、そのカードをインデックス 51 に移動し、これを 4 回繰り返します。そうすれば、私のデッキ オブジェクトの最後の 5 枚のカードはすべてランダムに選択され、2 回選択されることはありません。最も簡単な方法 (まだ試していません) は、デッキ インデックスの 1 つの値を保持する変数を作成して、それらを交換できるようにすることだと考えています。同意する人はいますか?

どんな助けでも大歓迎です!

4

5 に答える 5

4

インスタンスを指すdeckクラスの参照としてあなたがあります: -Deck

Deck deck = new Deck(52);

したがって、配列のようなインデックスでアクセスすることはできません: -

deck[index];  // Cannot do this on a reference pointing to object of `Deck`

おそらく、クラスに次のようなメソッドを指定して、次のようにアクセスする必要があると思いますget(index): -deck.get(index)

または、次のように宣言したいかもしれませんdeck: -

Deck[] deck = new Deck[52];

それなら ( deck[index]) うまくいきます。

于 2012-10-23T19:48:13.357 に答える
4

すでに述べた他の提案に追加するだけで、

Card[] hand = new Card[5]; 

おそらく読むべきです

Card[] hand = new Card[k]; 

forループについても同じことが言えます:

for (int j = 0; j < 5; j += 1) 

読むべき

for (int j = 0; j < k; j += 1)
于 2012-10-23T20:00:56.963 に答える
2

やったほうがいい

int index = (52 -rand.nextInt(51)+1);

また、あなたはのが必要Deck[]です52

  Deck[] deck = new Deck[52];
  for(i to 52)
  //Initalize deck[i] here 
  end.
  Now you can access like deck[index]

あなたを使用すると、より良い方法でゲームをenum実装できると思います。Card

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

// This is just sample example  and it is just to show an approach. I had not enough time    to make code perfect but it works fine.
public enum Deck
{
DECK;
enum Rank
{
    DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6),
    SEVEN(7), EIGHT(8), NINE(9), TEN(10), JACK(10), QUEEN(10), KING(10), ACE(11);

    Rank(int rank)
    {
        this.rank = rank;
    }

    private final int rank;

}

enum Type
{
    SPADES,
    HEARTS,
    DIAMONDS,
    CLUBS;
}

class Card
{
    private final Rank rank;
    private final Type type;

    Card(Rank rank, Type type)
    {
        this.rank = rank;
        this.type = type;
    }

    @Override
    public String toString()
    {
        return type.name() + rank.name();
    }

}

static List<Deck.Card> cards = new ArrayList<Deck.Card>();
static
{
    for (Rank rank : Deck.Rank.values())
    {
        for (Type type : Deck.Type.values())
        {
            cards.add(DECK.new Card(rank, type));
        }
    }

}

List<Deck.Card> shuffle()
{
    Collections.shuffle(cards);//Once it is shuffled you can use it to draw first five cards same way we play
    System.out.println(cards);
    System.out.println(cards.size());
    return Collections.unmodifiableList(cards);
}

public static void main(String[] args)
{
    DECK.shuffle();
}
}
于 2012-10-23T19:46:59.860 に答える
2
public static Card[] select(int k)
{
  Random rand = new Random(52); // mistake 1
  Deck deck = new Deck(52);     // mistake 2
  Card[] hand = new Card[5];
  for (int j = 0; j < 5; j += 1)
  {
    int index = rand.nextInt(52-j);
    hand[j] = deck[index];     // mistake 2
  }
  return hand;
}

間違い 1:Random定数で初期化しないでください。これにより、疑似乱数シーケンスが常にまったく同じになります。

間違い 2:は配列として宣言されていないため、宣言Deck deckが間違っているか、アクセスしようとする方法が間違っています。はカードのコレクションを表すクラスであるため、より論理的な犯人は後者の行です。適切なメソッドの呼び出しに変更します。deck[index]deckDeckDeck

の実装を知らなければDeck、正しいコードを知ることは不可能です。がその性質上ランダムなカードのデッキである場合Deckは、上位 5 枚を選択する必要があります。それが完全にソートされている場合 (これは現実的なデッキではありません)、そこからランダムなカードを選択する必要があります。Deckクラスには少なくとも、重複の問題をすぐに解決するメソッドが必要ですremove

于 2012-10-23T19:50:19.810 に答える
1

カードをシャッフルしてピックします。重複する可能性があるため、ランダム選択を使用するよりも優れていますが、シャッフルを使用する場合はそうではありません. 使用できますCollections#shuffle

于 2012-10-23T19:50:42.413 に答える