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