2

UNOのゲームをプレイするプログラムを作っています。UNOデッキでは、いくつかのカードが繰り返されているため、整数のリストを作成することはできません。オブジェクトを使用する必要があります。デッキにLinkedListを使用する予定ですが、LinkedListのシャッフルが非常に遅いことを認識しています。

私の質問は、私がすべきかということです。

  1. LinkedListを完全に避け、ArrayListを使用するだけです
  2. ArrayListなどを使用してシャッフルし、内容をLinkedListに入れます
  3. ArrayListを作成してから、LinkedListに追加する独自のシャッフルルーチン(Randomを使用しない)を作成します。
  4. とにかくLinkedListをシャッフルします(のように、それほど悪くはありません)

これは宿題用ではありません。それは楽しむのを助けることです:)

4

3 に答える 3

2

カードは単純な整数で表すことができます。整数がカードの種類を表し、Uno が同じ種類のカードを複数持っている場合、そのカードに対応する整数を複数回使用します。

シャッフルとディーリングは簡単です。

ゲームを開始するには、デック全体 (サイズ = N) を保持できる固定サイズの整数型のダム配列 (手の込んだリンク リストや Arraylist を適用する必要はありません) を設定します。重複カードを表す重複整数を含む Uno デッキを表す整数をこの配列に入力します。UNDEALT を N に設定します。

シャッフルするには、次のコードを適度な (100 回?) 回実行します。

 1)  Pick a random number from 1 to UNDEALT, R.
 2)  Exchange the the first array slot with the Rth slot.

対処するには:

 1) Give out the card in the UNDEALT slot.
 2) Decrement UNDEALT.

これはすべて、より洗練されたデータ構造でも行うことができますが、まったく意味がありません。総情報量が100個のデータだとすれば、よっぽど馬鹿なことをしない限り、人より速い。しかし、私のモットーは、シンプルに機能する場合は、シンプルに固執することです。

于 2012-05-19T16:11:26.103 に答える
2

いくつかの考え:

cards[] = {1, 1, 1, 1, 2, 3, 4, 5, 6, 6}、ここで、1 = 「ワイルド」、2 = 「ドロー フォー」、または何がありますか。

私の意見では、Array(List) を使用すると、これが最も簡単になります。ここでの違いは、カードが何であるかを決定するためにキーではなく、配列の値をゲームプレイに使用することです。

必要に応じて、オブジェクトでも同じことができます。配列インデックスに基づいて配列をシャッフルしますが、配列内の値 (カードを表すオブジェクト) を使用して、カードが実際に何であるかを把握します。

編集: どうやら Java がシャッフルしてくれるようです! http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle(java.util.List)

于 2012-05-19T16:19:45.057 に答える
0

頻繁にシャッフルしなければ、それほど遅くはありません。

シャッフルする 1 つの方法は、最初のカードを別のカードとランダムに入れ替えることです。これは、LinkedList ではそれほど遅くはありません。一方、ArrayList との間でコピーするには時間がかかります。

于 2012-05-19T16:04:46.670 に答える