summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..6b5cac8
--- /dev/null
+++ b/main.c
@@ -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));
+}