2015-04-03 157 views
1

我正在开发一个跳棋游戏,而且我正在接触“实现游戏”部分,它是在“获取渲染”部分之后提出的。目前我有我的作品的逻辑是这样的:设计一个跳棋程序

struct Square { 
    Piece * piece; 
} 

struct Piece { 
    bool king; 
    Color color; 
} 

与渲染的方法和类似的东西。背后的想法是,有时一个正方形可以是空的,在这种情况下,正方形中的指针可以为空。但是,仅仅用于容纳指针的结构的想法困扰着我。我的问题是这是否是一个好主意,或者如果我是一个白痴和过分复杂的事情。

+0

那么这是一个方法来做到这一点。然而,可能更常见的是有一个'Board'结构,它包含一个8×8的'Piece *'阵列(尽管如果我这样做了,我不会使用指针)。 – 2015-04-03 23:43:33

+0

这取决于您是否打算扩展棋盘格以具有其他属性。就像陷阱。 “啊!你激活了我的陷阱卡,'国王降级'!” – jxh 2015-04-03 23:49:03

回答

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

虽然我会使用[8] [8]。 [8] [4]节省内存,但过于复杂。而你只会浪费24个字节的内存。函数调用开销可能不止于此。 – 2015-04-03 23:45:06

+0

我想我会为这个答案和原来的问题做一半的事情。也许是'可选板[8] [8];''Piece'存储颜色以及它是否是国王。然后,我将它包装在一个暴露了简单的“移动”功能的类中。代表问题的另一种方式。你的更关注于优化。 – 2015-04-03 23:49:43

+0

我首先想到这个系统的原因是在板子上添加了一些变化,比如可变尺寸,或者它的中心或者那种东西。有没有一种优雅的方式来做到这一点? – MadDoctor5813 2015-04-04 00:03:16

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); 
}; 

现在这个确定与黄昏的做法相比过于复杂。但它允许通过向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); 
... 

最后,它的意见和可用资源的问题。