summaryrefslogtreecommitdiff
path: root/main.c
blob: 6b5cac883eebfc58688031cad6971a8fc850bc33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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));
}