Использование пустого класса в качестве «токена управления» - PullRequest
0 голосов
/ 04 февраля 2012

Я работаю над игрой и, как и я, идеалистичен, я хочу относиться к игроку-человеку точно так же, как к ИИ. Проблема в том, что игрок использует ИИ, значит, он должен быть асинхронным. Поэтому я нашел решение, похожее на это:

interface PlayerOrAI
{
    takeTurn();
}

class Game
{
    doMove(Move move);
}

Класс Move - это класс, описывающий ход игрока. (Вы можете легко превратить версию во что-то без этого дополнительного класса, но я подумал, что это было более легкое представление для вопроса). Идея состоит в том, что класс Game вызывает функцию takeTurn() игрока или ИИ, а затем они думают, и когда они это делают, они создают экземпляр класса Move и возвращают его с помощью doMove() функция. (При таком дизайне вы должны убедиться, что ваш ИИ также выполняет обратный вызов асинхронно, так как в противном случае вы медленно движетесь к переполнению стека).

Однако проблема, которая возникает, заключается в том, что я хочу иметь возможность проверить, является ли движение из правильного источника. Конечно, я мог бы просто рассчитывать на написание «правильного» кода с этого момента, но я бы предпочел на самом деле проверить это. Я придумал решение, использующее токен, как показано ниже.

class Token
{
}

interface PlayerOrAIWithToken
{
    takeTurn(Token token);
}

class GameWithToken
{
    private Token currentToken;

    doMove(Move move, Token token);
}

Здесь идея заключается в том, что класс GameWithToken создаст новый Token перед вызовом takeTurn(), сохранит его в currentToken и затем передаст его классу, у которого есть очередь при вызове takeTurn(). Затем PlayerOrAI должен предоставить Token в качестве аргумента makeMove(). Таким образом, GameWithToken всегда может подтвердить, что Движение исходило от правильного игрока.

Кажется идеальным. Слишком идеально, если вы спросите меня. Вы можете использовать его практически на любом языке ООП, и вы используете системы, уже существующие на языке, для решения проблемы. Тем не менее, я никогда не слышал об этом, и я не могу найти ссылки на это нигде.

Я просто что-то упускаю, когда ищу прецедент для этого? Возможно, я решаю проблему, которую решаю? Что-то еще происходит, что я скучаю? Или это просто очень простой, но надежный способ решения такой проблемы?

1 Ответ

0 голосов
/ 10 февраля 2012

Разве достаточно просто реализовать doMove с аргументом playerNumber? а затем либо просто ставить в очередь, либо возвращая false для «это не ваша очередь» из doMove?

Не совсем понятно, почему оба игрока также должны вызывать асинхронно, так как, как мне кажется, игра пошаговая, и, таким образом, игра может с такой же легкостью выполнять цикл и вызывать метод "executeMove" для каждого игрока выполняет какие-либо вычисления, выполняет перемещение, а затем возвращает (таким образом, не создавая переполнение стека, как вы упомянули).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...