C++ 跳棋程序的设计

C++ 跳棋程序的设计,c++,oop,C++,Oop,我正在做一个跳棋游戏,我正在着手实际实现游戏部分,这部分是在“获取内容渲染”部分之后。目前我的作品逻辑如下: struct Square { Piece * piece; } struct Piece { bool king; Color color; } enum PieceType // similar to duskwuff's approach { PIECE_TYPE_EMPTY, PIECE_TYPE_BLACK_PIECE, PI

我正在做一个跳棋游戏,我正在着手实际实现游戏部分,这部分是在“获取内容渲染”部分之后。目前我的作品逻辑如下:

struct Square {
    Piece * piece;
}

struct Piece {
    bool king;
    Color color;
}
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);
};

使用渲染方法之类的东西。其背后的想法是,一个正方形有时可能是空的,在这种情况下,正方形中的指针可能是空的。但是,一个结构只是用来保存指针的想法困扰着我。我的问题是这是不是一个好主意,或者我是个白痴,把事情搞得太复杂了。

你把事情搞得太复杂了。在跳棋游戏中,没有必要对每一个棋子进行唯一的识别和跟踪;仅仅知道一块存在于给定的正方形上可能就足够了。因此:

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,但必须小心,不要只使用有效的位置。

您将事情复杂化了。在跳棋游戏中,没有必要对每一个棋子进行唯一的识别和跟踪;仅仅知道一块存在于给定的正方形上可能就足够了。因此:

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,但必须小心,不要只使用有效的位置。

对于这种情况,我建议您编写一个CheckerBoard类,如下所示:

struct Square {
    Piece * piece;
}

struct Piece {
    bool king;
    Color color;
}
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的方法相比,这肯定过于复杂了。但它允许通过在棋盘格、棋子和负责游戏性的类中添加新功能来增加变化,例如,该类可以实现游戏模式接口。移动件。。。功能应注意有效的移动。如果某些方块不能移动到,这将非常有用。此外,这通常允许您轻松更改CheckerBoard保存数据的方式

当然,如果您计划引入一些新内容,您可以将PieceType拆分为单独的枚举,例如PieceType和PieceColor,以便以后轻松添加更多类型。在这种情况下,我将添加一个名为Piece的结构,其中包含类似的信息,并让checkerboard保存指向片段的指针:


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

对于这种情况,我建议编写一个CheckerBoard类,如下所示:

struct Square {
    Piece * piece;
}

struct Piece {
    bool king;
    Color color;
}
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的方法相比,这肯定过于复杂了。但它允许通过在棋盘格、棋子和负责游戏性的类中添加新功能来增加变化,例如,该类可以实现游戏模式接口。移动件。。。功能应注意有效的移动。如果某些方块不能移动到,这将非常有用。此外,这通常允许您轻松更改CheckerBoard保存数据的方式

当然,如果您计划引入一些新内容,您可以将PieceType拆分为单独的枚举,例如PieceType和PieceColor,以便以后轻松添加更多类型。在这种情况下,我将添加一个名为Piece的结构,其中包含类似的信息,并让checkerboard保存指向片段的指针:


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

这是一种方法。然而,更常见的情况可能是有一个包含8x8数组的棋盘结构,虽然如果我这样做的话,我不会使用指针。这取决于你是否计划扩展棋盘格以获得额外的属性。比如,陷阱。啊哈!你激活了我的陷阱卡“国王降级”!这是一种方法。然而,更常见的情况可能是有一个包含8x8数组的棋盘结构,虽然如果我这样做的话,我不会使用指针。这取决于你是否计划扩展棋盘格以获得额外的属性。比如,陷阱。啊哈!你激活了我的陷阱卡“国王降级”!不过,我会使用[8][8]。[8] [4]节省内存,但过于复杂。你只浪费了24字节的内存。函数调用开销可能不止于此。我想我会在回答这个问题和原始问题的一半上做点什么。可能是一个可选板[8][8];这件衣服的颜色存放在哪里,以及它是否是国王。然后我将它封装在一个类中,该类公开了一个简单的move函数。这只是表示问题的另一种方式。你的系统更注重优化。我之所以想到这个系统,首先是为了在电路板上增加一些变化,比如可变尺寸,或者在电路板中心有洞之类的东西。有什么优雅的方法可以做到这一点吗?不过我会使用[8][8]。[8] [4]s
保存内存,但过于复杂。你只浪费了24字节的内存。函数调用开销可能不止于此。我想我会在回答这个问题和原始问题的一半上做点什么。可能是一个可选板[8][8];这件衣服的颜色存放在哪里,以及它是否是国王。然后我将它封装在一个类中,该类公开了一个简单的move函数。这只是表示问题的另一种方式。你的系统更注重优化。我之所以想到这个系统,首先是为了在电路板上增加一些变化,比如可变尺寸,或者在电路板中心有洞之类的东西。有什么优雅的方法可以做到这一点吗?