Я предпочитаю избегать использования указателей, так как вы должны помнить, чтобы очистить их.
В этом дизайне используется шаблон стратегии.Интерфейс PieceType
, который позволяет отображать действительные позиции на доске или показывать начальные позиции на доске.Я уверен, что есть еще кое-что, что вы хотели бы сделать для каждой стратегии:
class Board;
class PieceType
{
public:
virtual showValidMoves(Board& board) const = 0;
virtual showInitialPosition(Board& board) const = 0;
// ...
};
class Pawn : public PieceType
{
public:
virtual showValidMoves(Board& board) const;
virtual showInitialPosition(Board& board) const;
// ...
};
class Rook : public PieceType
{
// ...
};
//...
Нам нужен только один из каждого PieceType
, и поскольку этот тип является общим для шахматистов, он также может быть постоянным.:
const Pawn PAWN;
const Rook ROOK;
const Knight KNIGHT;
Мы используем эти стратегии для инициализации шахматистов, которые мы храним в векторе:
class ChessMan
{
public:
enum Colour {Black, White};
ChessMan(const Colour& colour, PieceType& pieceType);
void showValidMoves(Board& board);
void showInitialPosition(Board& board);
private:
Colour m_colour;
PieceType& m_pieceType;
};
Я заверну код для добавления ChessMan
к вектору всвоя собственная функция:
void add(vector<ChessMan>& chessmen,
const ChessMan::Colour& colour,
const PieceType& pieceType,
const unsigned int amount)
{
chessmen.insert(chessmen.end(), ChessMan(colour, pieceType), amount);
}
void main()
{
using std::vector;
vector<ChessMan> chessmen;
add(chessmen, 16, ChessMan::Black, PAWN);
add(chessmen, 2, ChessMan::Black, ROOK);
add(chessmen, 2, ChessMan::Black, KNIGHT);
//...
}
Боннский шанс!