【问题标题】:Optimizing Chess Game in C用 C 语言优化国际象棋游戏
【发布时间】: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;

每次玩家选择棋子时,程序都会计算并显示所选棋子的有效走法,在移动棋子后,程序会通过检查敌方国王可能的走法来验证敌方国王是否在被检查或被将死。棋子(如果棋子可以保护他,如果国王可以移动到别处)。

我看到人们为有效动作创建列表而不是每次都计算,但我必须为每个棋子创建一个列表并在轮到变化时计算玩家的所有可能动作?那会提高性能吗?我还看到板子只是一个数组,那会不会也有更好的性能呢?

基本上,我可以在代码中进行哪些优化以获得更好的性能?

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

【问题讨论】:

  • 您可能想查看最小/最大算法和 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


【解决方案1】:

基本上,我可以在我的代码中进行哪些优化 以获得更好的性能?

这是一个广泛而深刻的话题。我已经用 Java (https://github.com/amir650/BlackWidow-Chess) 编写了一个功能齐全的国际象棋引擎,我可以告诉你,你可以做很多事情。

从阅读开始:https://chessprogramming.wikispaces.com。首先关注引擎的正确性。它是否处理castling、en-passant、check、checkmate、discovered check等。如果不正确,性能无关紧要!

接下来编写一个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

无论您进行何种优化,请确保正确性不会倒退。这意味着编写体面的单元测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多