Я пытаюсь найти «карточную руку» (очередь), введя карточку поиска, сравнив значения (цвет и ранг) карточки поиска с текущей карточкой в руке, и если совпадение найдено выдача соответствующей карты и изменение «настроения» текущего игрока. Если совпадений не найдено и вся рука не была найдена, то текущая карта удаляется из очереди, ставится в очередь на тыльной стороне руки, и метод запускается снова. Если была произведена проверка всей руки (ведущая к первой карте руки), то должна быть возвращена «фиктивная карта».
Моя проблема в том, что, если соответствующая карта не найдена, появляется ошибка StackOverflowError. Я не знаю, откуда это исходит, но я предполагаю, что это связано с постановкой в очередь / снятием с очереди карт и рекурсивностью метода (ближе к концу). Если кто-то может помочь, я был бы признателен. Если вам нужно больше кода или информации, просто спросите.
НОВЫЙ КОД:
(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);
}
}
}