为跳棋程序设计

时间:2015-04-03 23:36:02

标签: c++ oop

我正在进行一场跳棋游戏,而且我正在实施游戏"在" get things rendering"之后出现的部分部分。目前我的作品的逻辑是这样的:

struct Square {
    Piece * piece;
}

struct Piece {
    bool king;
    Color color;
}

使用渲染方法和类似的东西。这背后的想法是方形有时可能是空的,在这种情况下,方形中的指针可以为空。但是,结构只是为了抓住指针的想法困扰着我。我的问题是这是一个好主意,还是我是一个白痴和过于复杂的事情。

2 个答案:

答案 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的方法相比,这确实过于复杂。但它允许通过向CheckersBoardPiece和负责游戏玩法的类(例如可以实现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);
...

最后,这是一个意见和可用资源问题。