我正在进行一场跳棋游戏,而且我正在实施游戏"在" get things rendering"之后出现的部分部分。目前我的作品的逻辑是这样的:
struct Square {
Piece * piece;
}
struct Piece {
bool king;
Color color;
}
使用渲染方法和类似的东西。这背后的想法是方形有时可能是空的,在这种情况下,方形中的指针可以为空。但是,结构只是为了抓住指针的想法困扰着我。我的问题是这是一个好主意,还是我是一个白痴和过于复杂的事情。
答案 0 :(得分:4)
你过度复杂的事情。在棋盘游戏中唯一识别和跟踪每件棋子并不是必需的;只知道一块在给定的方格上存在就足够了。因此:
enum CheckersPiece {
SQUARE_EMPTY = 0,
SQUARE_BLACK_PIECE = 1,
SQUARE_BLACK_KING = 2,
SQUARE_RED_PIECE = -1,
SQUARE_RED_KING = -2,
};
enum CheckersPiece board[8][4];
枚举中的值是专门选择的,以便您可以检查值的符号以确定片段颜色,并检查绝对值以检查其类型。
请注意,电路板为8x4而不是8x8,因为电路板的每一行只能使用四个方块。 (你可以把它做到8x8,但是你必须小心,只能使用"有效的"位置。)
答案 1 :(得分:2)
对于这种情况,我建议写一个像这样的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);
};
现在,与duskwuff的方法相比,这确实过于复杂。但它允许通过向CheckersBoard
,Piece
和负责游戏玩法的类(例如可以实现GameMode
接口)添加新功能来添加变体。 movePiece(...)
函数应该处理有效的移动。如果不能移动某些正方形,那将非常有用。此外,这通常允许您轻松更改CheckersBoard
保存其数据的方式。
当然,如果您计划引入一些新内容,可以将PieceType
拆分为单独的枚举(例如,PieceType和PieceColor),以便以后轻松添加更多类型。在这种情况下,我会添加一个名为Piece
的结构,其中包含类似的信息,让CheckersBoard
保持指向Piece
的指针:
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);
...
最后,这是一个意见和可用资源问题。