对于这种情况,我建议写一个CheckersBoard类是这样的:
enum PieceType // similar to duskwuff's approach
{
PIECE_TYPE_EMPTY,
PIECE_TYPE_BLACK_PIECE,
PIECE_TYPE_BLACK_KING,
PIECE_TYPE_RED_PIECE,
PIECE_TYPE_RED_KING
};
class CheckersBoard
{
private:
// data
public:
CheckersBoard(int sizeX, int sizeY);
bool isSquareOccupied(int x, int y);
PieceType getPieceTypeAt(int x, int y);
movePiece(int fromX, int fromY, int toX, int toY);
};
现在这个确定与黄昏的做法相比过于复杂。但它允许通过向CheckersBoard
,Piece
和负责游戏玩法的类(例如可实现GameMode
接口)添加新功能来添加变体。 movePiece(...)
功能应该处理有效的移动。如果不能移动某些方块,这很有用。此外,这通常可以让您轻松更改数据的保存方式。当然,如果你打算引入一些新的东西,你可以将PieceType
分成单独的枚举(例如PieceType和PieceColor),以便以后轻松添加更多类型。在这种情况下,我会添加一个名为Piece
结构,包含这样的消息,让CheckersBoard
保持指针Piece
S:
enum PieceType
{
PIECE_TYPE_PIECE,
PIECE_TYPE_KING,
PIECE_TYPE_GODZILLA,
PIECE_TYPE_DOUBLE_RAINBOW
};
enum PieceColor
{
PIECE_COLOR_BLACK,
PIECE_COLOR_RED
};
struct Piece
{
PieceType type;
PieceColor color;
int turnsUntilSelfDestruction;
bool isFloating;
};
...
const Piece* getPieceAt(int x, int y);
...
最后,它的意见和可用资源的问题。
那么这是一个方法来做到这一点。然而,可能更常见的是有一个'Board'结构,它包含一个8×8的'Piece *'阵列(尽管如果我这样做了,我不会使用指针)。 – 2015-04-03 23:43:33
这取决于您是否打算扩展棋盘格以具有其他属性。就像陷阱。 “啊!你激活了我的陷阱卡,'国王降级'!” – jxh 2015-04-03 23:49:03