diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 77 |
1 files changed, 0 insertions, 77 deletions
@@ -1,77 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#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)); -} |