【发布时间】:2015-04-04 23:45:19
【问题描述】:
我正在用 C 语言制作一个简单的国际象棋游戏,我想知道我可以对其进行哪些优化。目前,我有一个结构体游戏,它具有游戏的当前状态(主菜单、暂停菜单、正在播放等)、回合、3 个用作布尔值的整数、指向棋盘的指针和指向所选棋子的指针:
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;
每次玩家选择棋子时,程序都会计算并显示所选棋子的有效走法,在移动棋子后,程序会通过检查敌方国王可能的走法来验证敌方国王是否在被检查或被将死。棋子(如果棋子可以保护他,如果国王可以移动到别处)。
我看到人们为有效动作创建列表而不是每次都计算,但我必须为每个棋子创建一个列表并在轮到变化时计算玩家的所有可能动作?那会提高性能吗?我还看到板子只是一个数组,那会不会也有更好的性能呢?
基本上,我可以在代码中进行哪些优化以获得更好的性能?
【问题讨论】:
-
您可能想查看最小/最大算法和 alpha/beta 修剪算法。顺便说一句:如果您消除了结构定义上的 typedef 修饰符,则代码将更具可读性(首选方法是不使用 typedef,因为它们只会使代码混乱/模糊,使编译器命名空间混乱,并且可能会误导人类读者。)
-
我浏览了 main,.c 和 game.c 的代码。在 C 中,不应强制转换 malloc() (和函数族)的返回值。应始终检查 malloc() 和 family 的返回值 (!= NULL) 以确保操作成功
-
在调用scanf()和family时,一定要检查返回值(不是参数值),确保操作成功。用户可以很容易地溢出输入缓冲区,在转换参数上放置一个长度限制器以避免溢出问题。
-
在此函数中:'void InitializeBoard(ChessBoard *board){' 如果 board 为 NULL,则跳过初始化,但是,无法从该错误中恢复,也不会传播错误信息回到游戏的调用者/其余部分。
-
伙计们... 该程序应该通过国际象棋算法进行优化。做那些小事永远不会奏效。特别是,您可能想查看 alpha-beta、PVS、修剪等。
标签: c optimization chess