2015-04-04 39 views
0

我在C中做了一個簡單的國際象棋遊戲,我想知道我可以對它做出的優化。目前,我有一個結構遊戲,其中包含遊戲的當前狀態(主菜單,暫停菜單,播放等),轉彎,作爲布爾值的3個整數,指向棋盤的指針和指向所選棋子的指針:在C中優化國際象棋遊戲

typedef struct game{ 
    ChessBoard *board; 
    ChessPiece *selectedPiece; 

    ChessColor turn; 
    State state; 

    //Booleans 
    int inGame; 
    int checkmate; 
    int check; 
}Game; 

董事會有指針的二維數組件,球員和最後的感動件(用於順便):

typedef struct chessboard{ 
    ChessPiece *pieces[8][8]; 

    Player *player1; 
    Player *player2; 

    ChessPiece *lastMovedBlackPiece; 
    ChessPiece *lastMovedWhitePiece; 
} ChessBoard; 

最後一塊:

typedef struct chesspiece{ 
    //Properties 
    int x; 
    int y; 
    ChessColor color; 

    //Type 
    Type type; 

    int numberOfMoves; 
} ChessPiece; 

每次玩呃選擇一件作品,程序會計算並顯示所選作品的有效移動,移動一個作品之後,程序將通過檢查作品中可能的移動來驗證敵方國王是否處於檢查狀態,保護他,如果國王可以移動到其他地方)。

我看到人們爲有效移動創建列表而不是每次計算,但是我必須爲每個棋子創建一個列表,並且在轉彎時計算所有可能的棋步。這會提高性能嗎?我也看到了這個板子只是一個陣列,會有更好的表現嗎?

基本上,我可以在我的代碼中執行哪些優化以獲得更好的性能?

代碼:https://github.com/WalrusNine/chess-game-c

+0

很難在不看到它的情況下對代碼進行改進。 – 2015-04-04 23:58:39

+0

@PM我一直在考慮一般的棋類遊戲的優化,因爲我根本沒有進行過優化,而且我的代碼的某些部分確實(真的)需要更改哈哈,但無論如何:https:// github .com/WalrusNine/chess-game-c在代碼更好後,我打算將它交給一些朋友,以幫助他們學習C中的一些遊戲。它使用Allegro btw – WalrusNine 2015-04-05 00:05:42

+0

由於發佈您的問題太廣泛現場。 – 2015-04-05 00:07:04

回答

1

基本上,這是可能的優化,我可以在我的代碼 有更好的表現呢?

這是一個廣泛而深刻的話題。我用Java寫了一個功能齊全的國際象棋引擎(https://github.com/amir650/BlackWidow-Chess),我可以告訴你,有很多事情可以做。

首先閱讀:https://chessprogramming.wikispaces.com。首先關注你的引擎的正確性。它是否可以處理castling,en-passant,check,checkmate,發現支票等等。如果沒有得到正確的結果,表現並不重要!

接下來寫一個minimax和評估函數 - 作爲您的基本搜索過程,並測量它可以爲您每秒評估的電路板數量。

從那裏,事情開始開拓:

1) Alpha Beta Pruning 
2) Board representation (bit-board vs array) 
3) Null Move Heuristic 
4) DB for opening 
5) DB end engame 
6) Transposition tables 
7) ..it goes on 

你做任何優化,確保正確性不會倒退。這意味着要編寫體面的單元測試。