Предупреждение, это длинный вопрос!
Я реализую карточную игру Solitaire на C ++ на Win32, и после того, как я задаю этот вопрос, становится ясно, что мне может потребоваться немного рекомендаций относительно фактического дизайна класса, а не деталей реализации.
Для реализации игры я использую шаблон контроллера вида модели. Модель - игра, карты, колонки и история ходов. Представление отвечает за рисование на экране, а управление отвечает за обработку сообщений и таймер.
Аспект игры, которую я сейчас пытаюсь реализовать, - это история действий, которая относится к Model
- я хочу иметь возможность "отменять" и "повторять" любые Action
.
Я описываю объект Move
как атомное перемещение одной карты из одной CardPile
в другую. И я описал Action
как состоящий из одного или нескольких Moves
. например сделка будет 10 Moves
от Deck
до конкретного Column
. (Deck
и Column
- это просто специализации CardPile
).
Я определяю Действие как деку Moves и предоставил некоторые функции для GetCurrentMove () и Advance () для перемещения, когда оно выполнено.
class Action
{
public:
void SetMoves( std::deque<Move> dmoves){ _m_deque = dmoves; }
void Advance();
std::deque<Move>::const_iterator GetCurrentMove();
private:
std::deque<Move> _m_deque;
std::deque<Move>::const_iterator currentmove;
};
При обработке (или настройке, или отмене) эти Move
объекты являются данными для анимации. Мне нужно иметь доступ к одному Move
объекту одновременно. Я извлекаю Move
, анализирую его в координаты x, y, а затем запускаю анимацию, чтобы переместить карту из одного места в другое на экране. Когда карта достигает места назначения, я вытаскиваю еще одну Move
из очереди.
Другие люди с большим опытом советуют мне не хранить итераторы в классе Action
. STL этого не делает, и для этого есть веские причины.
Но мой вопрос - разве у меня нет для хранения итераторов внутри класса Action
?
Вы видите, что и для моей модели, и для представления необходим доступ к текущему Move
, поэтому где еще я могу сохранить тот итератор, который ссылается на текущий Move
... внутри контроллера?
Моя игровая анимация основана (очень широко) на этой модели:
void control.game_loop( message )
{
switch( message )
{
case TIMER:
{
if( view.CardHasReachedDestination() )
{
game.AdvanceAnimation();
if( !game.AnimationFinished() )
view.Parse(game.GetNextMove());
}
view.MoveCardXY();
view.PaintToTheScreen();
controller.StartTheTimerAgain();
}
}
}
С наилучшими пожеланиями,
BeeBand