Я работаю над хобби-проектом игры Шахматы в стиле барокко . Для тех, кто не играл в нее, у нее те же основные правила, что и в шахматах, но методы передвижения и захвата разные.
Естественно, я создал стандартные классы для игры: GameState
, Board
, Square
и класс, предназначенный для каждой фигуры, наследуемой от BasePiece
.
Каждая часть имеет 2 основных виртуальных метода, GetPossibleMoves(Board board)
и GetCapturedSquares(Board board, Square toSquare)
.
Теперь одна из фигур, Имитатор , захватывает фигуры, "подражая" фигуре, которую она захватывает. Например, длинный прыгун может захватывать фигуры, перепрыгивая через них. Это означает, что Имитатор может перепрыгнуть через вражеских Длинных Прыгунов, чтобы захватить их (но не может перепрыгнуть ничего другого).
Я выполнил функциональность GetCapturedSquares()
для всех произведений, кроме Имитатора (который, безусловно, самый сложный из произведений).
Мой основной алгоритм для Imitator был:
- найти все квадраты с вражескими фигурами на них
- за каждую вражескую фигуру ...
- создать смоделированный предмет в том же месте, что и Имитатор
- найти действительные снимки, если имитируемая фигура движется к выбранному квадрату
- проверить, есть ли вражеский квадрат в этом списке захваченных квадратов
Поскольку я уже написал код для движений других фигур, я подумал, что просто создаю новые экземпляры и использую их методы GetCapturedSquares()
в зависимости от того, какой тип фигур был врагом. Для этого я настроил Dictionary
, как вы можете видеть здесь, который отображает System.Type
на экземпляр объекта указанного типа:
var typeToPiece = new Dictionary<Type, BasePiece>()
{
{typeof(Pincer), new Pincer() { Color = this.Color, CurrentSquare = this.CurrentSquare}},
{typeof(Withdrawer), new Withdrawer() { Color = this.Color, CurrentSquare = this.CurrentSquare }},
{typeof(Coordinator), new Coordinator() { Color = this.Color, CurrentSquare = this.CurrentSquare }},
{typeof(LongLeaper), new LongLeaper() { Color = this.Color, CurrentSquare = this.CurrentSquare }},
{typeof(King), new King() { Color = this.Color, CurrentSquare = this.CurrentSquare }},
};
//...
var possibleMoves = typeToPiece[enemySquare.Occupant.GetType()].GetPossibleMoves(board, toSquare);
От этого я чувствую себя грязно внутри. Более уместно создать enum
или string
, который представляет тип куска в качестве ключа словаря, или это действительно не имеет значения? Есть ли другой способ справиться с этим? Я придерживаюсь мнения, что все в порядке, но мне интересно услышать ваши мысли.