2012-04-30 6 views
0

Javaでカードゲーム "UNO"を作成しようとしています。プレイヤーがカードをプレイするとき、それは他の要素が左にシフトしている状態で手から取り除かなければならない。パラメータとしてint nが取られます。これは破棄されるカードを指します。このメソッドは、クラスのフィールドとして指定したカード配列を変更する必要があります。それは、カードであるオブジェクトの配列、またはプレーヤーの手です。実行されると、nullPointerExceptionが生成されます。私はエラーが発生している理由を知っている、私はそれを修正する方法がわからない。私はまた、配列リストの使用を避けようとしています。また、破棄されているカードを返して印刷することもできます。ありがとう。UNOカードゲーム手札からカードを取り除く

public Card removeCardFromHand(int n) 
{ 
    Card c = cards[n]; 
    Card[] tempCards = new Card[cards.length - 1]; 
    for(int i = 0; i < n; i++) 
    { 
     tempCards[i] = cards[i]; 
    } 
    for(int i = n; i < cards.length; i--) 
    { 
     tempCards[n] = cards[n + 1]; 
    } 
    cards = tempCards; 
    return c; 
} 

エラーコード:

java.lang.ArrayIndexOutOfBoundsException:7

at Player.removeCardFromHand(Player.java:86) 
at BUno.executeOnePlay(BUno.java:112) 
at BUno.play(BUno.java:70) 
at BUno.main(BUno.java:186) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:271) 

この場合には、プレイヤーは7枚のカードを持っていた、ので、それが発生しています。 7番目が削除されたとき、その7番目のインデックスは空でした。私は、プレイヤーがカードを引く必要があるときに、カードを追加するための同様の方法を書きました。これは完璧に機能しました。私は今後の試験のために練習しています。これはアレイリストやベクターをカバーしていないので、使用するのは無駄です。

+0

インデックスを持つカードを削除しようとすると、カードn + 1、カードn、カードn -1 ...カード2、カード1}またはArrayIndexOutOfBoundでクラッシュする'ArrayList'を使いたいですか? * "なぜエラーが発生しているのか分かります" *共有する。また、例外のスタックトレース全体を貼り付けてください。 – Jeffrey

+0

ベクトルを使用してサイズを変更できますか? – stark

+0

なぜArrayListを避けるのですか? –

答えて

2
for(int i = n; i < cards.length; i--) 
{ 
    tempCards[n] = cards[n + 1]; 
} 

とは何ですか? :-)

すぐに問題が3つあります。最初は、iではなく、ループ内の配列インデックスにnを使用しています。

それを修正しても、配列の最後を超えてしまうことになります。

第3の点は、デクリメントするのではなく、iをインクリメントすることです。デクリメントすると、iは常にcards.lengthより小さくなるため、ループは永久に実行されます。そして、永遠で、私は右のあなたが代わりに

:-) cards[-1]で何かをやろうとし始める時点までの平均、あなたは試してみてください:

for (int i = n; i < cards.length - 1; i++) 
    tempCards[i] = cards[i + 1]; 
+1

あなたはそれが** i ++ **であるべきだと思いませんか? (n user916315

+0

このループは、より短いtempCards配列に削除されない残りのカードを追加することです。私はあなたの方法にショットを与えるでしょう –

+0

@AlexMoss、申し訳ありませんが、それは修辞的な質問でした。私はそれが何であるかを正確に知っていた。私のコメント_ "それは何ですか?" _は "あなたがそれを書いたときにあなたは何を考えていたのですか?"のような信憑性の表明で読むべきです。 "; _ :--) – paxdiablo

1

あなたの二forループが何をやっていませんそれを期待する。 iを連続して減らしている間に、あなたはちょうどtempCards[n] = cards[n+1]を何度も再割り当てしています。

for(int i = n; i < cards.length; i--) 
    { 
     tempCards[n] = cards[n + 1]; 
    } 

それはcards.length未満が、あなたはiから2、1、0、-1、-2、というようにデクリメントだろう3のような値が何か、と例えばi開始のように見えます。

0

アレイに頼る代わりにLinkedListを使用できます。アイテムを削除して追加すると(Card)、プレイヤーの手札に速く表示されます。

投稿したコードに2つの問題があります。最初の1つは潜在的な同時アクセスです(ただし、より高いレベルで扱うことができます):1枚のカードの取り外しが完全に行われていないときにカードを追加することは可能ですか?

は、もう一つはここにある:

for(int i = n; i < cards.length; i--) 
{ 
    tempCards[n] = cards[n + 1]; 
} 

は、あなたが他の方向(i++)そうでない場合は、あなたのtempCardは、{カード1、カード2、...、カードN-1のようなものが含まれますにコピーを行う必要があり、 card.lengh/2

関連する問題