Поиск в стеке вызывает переполнение стека - PullRequest
1 голос
/ 13 марта 2012

Я пытаюсь найти «карточную руку» (очередь), введя карточку поиска, сравнив значения (цвет и ранг) карточки поиска с текущей карточкой в ​​руке, и если совпадение найдено выдача соответствующей карты и изменение «настроения» текущего игрока. Если совпадений не найдено и вся рука не была найдена, то текущая карта удаляется из очереди, ставится в очередь на тыльной стороне руки, и метод запускается снова. Если была произведена проверка всей руки (ведущая к первой карте руки), то должна быть возвращена «фиктивная карта». Моя проблема в том, что, если соответствующая карта не найдена, появляется ошибка 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);
        }
    }
}

1 Ответ

2 голосов
/ 13 марта 2012

Я думаю, что у вас должно быть что-то вроде этого:

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);
}
...