我正在用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;
每次玩家选择一件作品时,程序会计算并显示所选作品的有效动作,并且在移动一件作品后,程序会通过检查作品的可能移动来验证敌人国王是否在检查中或是否是将死的(如果如果国王可以移动到其他地方,一块可以保护他 .
我看到人们为有效的移动创建列表而不是每次都计算,但是我必须为每个部分创建一个列表并计算转弯时玩家的所有可能移动?这会改善表现吗?我也看到电路板只是一个阵列,它会有更好的性能吗?
基本上,我可以在代码中进行哪些优化以获得更好的性能?
1 回答
这是一个广泛而深刻的话题 . 我用Java编写了一个功能齐全的国际象棋引擎(https://github.com/amir650/BlackWidow-Chess),我可以告诉你,你可以做很多事情 .
首先阅读:https://chessprogramming.wikispaces.com . 首先关注引擎的正确性 . 它是否处理铸造,en-passant,检查,将死,发现检查等 . 如果不正确,性能无关紧要!
接下来编写一个minimax和评估函数 - 作为您的基本搜索程序,并测量它每秒可以为您评估的电路板数量 .
从那里开始,事情就开始了:
无论您做什么优化,都要确保正确性不会消退 . 这意味着要编写好的单元测试 .