Я работаю над игрой и, как и я, идеалистичен, я хочу относиться к игроку-человеку точно так же, как к ИИ. Проблема в том, что игрок использует ИИ, значит, он должен быть асинхронным. Поэтому я нашел решение, похожее на это:
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
всегда может подтвердить, что Движение исходило от правильного игрока.
Кажется идеальным. Слишком идеально, если вы спросите меня. Вы можете использовать его практически на любом языке ООП, и вы используете системы, уже существующие на языке, для решения проблемы. Тем не менее, я никогда не слышал об этом, и я не могу найти ссылки на это нигде.
Я просто что-то упускаю, когда ищу прецедент для этого? Возможно, я решаю проблему, которую решаю? Что-то еще происходит, что я скучаю? Или это просто очень простой, но надежный способ решения такой проблемы?