對於這種情況,我建議寫一個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