2015-04-03 35 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); 
... 

最後,它的意見和可用資源的問題。