2012-03-12 19 views
1

検索カードを入力し、検索カードの値(色とランク)を手の現在のカードと比較して、 "カードの手"(キュー)を検索しようとしています。一致するカードが出力され、現在のプレイヤーの「気分」が変更された場合に表示されます。一致するものが見つからず、ハンド全体が検索されていない場合、現在のカードはデキューされ、手の後ろにエンキューされ、メソッドが再び実行されます。手全体が検索された場合(手の最初のカードに戻る)、「ダミーカード」が返されます。 私の問題は、一致するカードが見つからない場合、StackOverflowErrorが表示されることです。私はこれがどこから来ているのか分かりませんが、カードのエンキュー/デキューとメソッドの再帰(最後に向かって)と関係があると思います。誰かが助けることができれば、私はそれを感謝します。より多くのコードや情報が必要な場合は、尋ねてください。スタック検索でスタックオーバーフローが発生する

NEW CODE:

(at top of class) 
int counter = 1; 

.... 

/** 
* Method that checks a player's hand for matching cards 
* @param searchCard card to search for in player's hand 
* @return card in player's hand if found, dummy card otherwise 
*/ 
public UnoCard getMatch(UnoCard searchCard) { 
    UnoCard foundCard; 
    UnoCard currentCard = cards.first(); 
    UnoCard noCard = new UnoCard('N', 0); 

    //check if colours of cards match 
    if (currentCard.getColour() == searchCard.getColour()) { 
     //set mood, remove card from hand, and return matching card 
     setMood("Colour"); 
     foundCard = currentCard; 
     cards.dequeue(); 
     return foundCard; 
    //check if ranks of cards match 
    } else if (currentCard.getRank() == searchCard.getRank()) { 
     //set mood, remove card from hand, and return matching card 
     setMood("Rank");    
     foundCard = currentCard; 
     cards.dequeue(); 
     return foundCard; 
    //if no match is found 
    } else { 
     //check if end of hand has been reached 
     if (counter == cards.size()) { 
      //set mood and return dummy card 
      setMood("No match"); 
      counter = 1; 
      return noCard; 
     } else { 
      //place card at back of hand and search again with next card in hand 
      counter++; 
      System.out.println("Counter is: " + counter); 
      cards.dequeue(); 
      cards.enqueue(currentCard); 
      return getMatch(searchCard); 
     } 
    } 
} 
+0

を 'counter'ではなく、メソッド、変数のメソッドパラメータであってはならないことをあなたは確かにいますか? –

+0

リスト(または順序が関係ない場合はセット)を使用し、その 'contains()'および 'remove()'メソッドを使用しないのはなぜですか? –

+0

'counter'は、メソッドが現在どのカードを手にしているかの表現として使用されます。メソッドが実行されると、1に初期化されます(最初のカードの場合)。メソッドが呼び出されるたびに同じ方法で開始する必要があるため、パラメータでなければならないとは思いません。リストを使用することはできません。申し訳ありません。 – lollercopter

答えて

2

私はあなたがこのような何かが必要だと思います:

public UnoCard getMatch(UnoCard searchCard) { 
    return getMatch(searchCard, 0); 
} 

private UnoCard getMatch(UnoCard searchCard, int counter) { 
    //int counter = 0 
    ... the rest of your code 

    // Recursion at the end 
    getMatch(searchCard, counter); 
} 
+0

まあ、それは私が期待したものではありませんが、問題を解決する方法はたくさんあります;) – Tim

+0

ああ、おそらくこれを処理するためのより良い方法がありますが、これは最小の修正の1つです。残りのコードがなければ、何をすべきかを言うのは難しいです。 –

+0

申し訳ありませんが、私はトップポストに私の修正コードがあります。私はそれがうまくいくかどうかを見るために別の方法を作るのを避けようとしました。ただし、カウンタをトレースして一致しない場合は、オーバーフローが発生する前にカウンタが約8500に増加します。 'counter = cards.size()'(手のサイズ)が動作していないかどうかをテストするにはどうすればよいですか? – lollercopter

関連する問題