我在C中制作了一个简单的国际象棋游戏,我想知道我可以对其进行的优化。目前,我有一个结构游戏,具有游戏的当前状态(主菜单,暂停菜单,播放等),转弯,作为布尔值的3个整数,指向棋盘的指针和指向选定棋子的指针:
typedef struct game{
ChessBoard *board;
ChessPiece *selectedPiece;
ChessColor turn;
State state;
//Booleans
int inGame;
int checkmate;
int check;
}Game;
董事会有一个2D数组指针,玩家和最后移动的部分(对于en passant):
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;
每次玩家选择一件作品时,程序会计算并显示所选作品的有效动作,并且在移动一件作品后,程序会通过检查敌人的可能动作来核实敌人王是否正在检查中碎片(如果一件可以保护他,如果国王可以移动到其他地方)。
我看到人们为有效的动作创建列表而不是每次都计算,但是我必须为每个部分创建一个列表并计算转弯时玩家的所有可能动作?这会改善表现吗?我还看到电路板只是一个阵列,它也会有更好的性能吗?
基本上,我可以在代码中进行哪些优化以获得更好的性能?
答案 0 :(得分:1)
基本上,我可以在代码中进行哪些优化 为了更好的表现?
这是一个广泛而深刻的话题。我用Java编写了一个功能齐全的国际象棋引擎(https://github.com/amir650/BlackWidow-Chess),我可以告诉你,你可以做很多事情。
首先阅读:https://chessprogramming.wikispaces.com。首先关注引擎的正确性。它是否处理铸造,en-passant,检查,将死,发现检查等。如果不正确,性能无关紧要!
接下来写一个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
无论你做了什么优化,都要确保正确性不会消退。这意味着要编写好的单元测试。