#include #include #include "board.h" #define LARGE 100000 static inline int min(int a, int b) { return a < b ? a : b; } static inline int max(int a, int b) { return a < b ? b : a; } static int win_score[4] = { [WIN_NONE] = 0, [WIN_P0] = 1000, [WIN_P1] = -1000, [WIN_DRAW] = 0, }; static int evaluate(cboard_t B) { (void)B; return 0; } static int minimax_p0(cboard_t B, int alpha, int beta, int depth); static int minimax_p1(cboard_t B, int alpha, int beta, int depth) { if (depth == 0) return evaluate(B); enum win_t win = b_win(B); if (win != WIN_NONE) return win_score[win]; int best = LARGE; for (int i = 0; i < 16; i++) { if (b_stk_full(B, i)) continue; board_t C; b_set(C, B); b_drop(C, i, 1); int sc = minimax_p0(C, alpha, beta, depth - 1); best = min(sc, best); beta = min(best, beta); if (beta <= alpha) break; } return best; } static int minimax_p0(cboard_t B, int alpha, int beta, int depth) { if (depth == 0) return evaluate(B); enum win_t win = b_win(B); if (win != WIN_NONE) return win_score[win]; if (depth >= 36) { printf("depth=%d alpha=%d beta=%d\n", depth, alpha, beta); } int best = -LARGE; for (int i = 0; i < 16; i++) { if (b_stk_full(B, i)) continue; board_t C; b_set(C, B); b_drop(C, i, 0); int sc = minimax_p1(C, alpha, beta, depth - 1); best = max(sc, best); alpha = max(best, alpha); if (beta <= alpha) break; } return best; } int main(void) { board_t B = {0, 0}; printf("%d\n", minimax_p0(B, -LARGE, LARGE, 64)); }