summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2022-11-22 00:15:32 -0800
committerKai Stevenson <kai@kaistevenson.com>2022-11-22 00:15:32 -0800
commitbdbf21add98c05289d39904fa9c02ffc4c1dcde9 (patch)
tree39d9650ce79371ebdd909a6f92d24054c10c11f8
parent5bda952a19edb1a51aa04bca9231c41d811af632 (diff)
minimax fully implemented
-rw-r--r--ttt.c39
1 files changed, 22 insertions, 17 deletions
diff --git a/ttt.c b/ttt.c
index c6f63e4..59181c1 100644
--- a/ttt.c
+++ b/ttt.c
@@ -118,28 +118,31 @@ struct PosInfo {
};
struct PosInfo minimax(int boardState[3][3], int turn) {
int eval;
- int* bestMove = calloc(2, sizeof(int));
+ int bestMove[2] = { -1, -1 };
int s = get_game_state(boardState);
- if(s == turn + 1) {
+ if(s == 1) {
eval = 10;
}
- else if(s == (!turn) + 1) {
+ else if(s == 2) {
eval = -10;
}
- else if(s == 4) {
+ else if(s == 3) {
eval = 0;
}
else {
- int eval = 0;
- for(int r = 0; r < 2; r++) {
- for(int c = 0; c < 2; c++) {
- int[3][3] simBoard;
- memcpy(simBoard, boardState, sizeof(boardState));
- if(simBoard[c][r] == 0) {
+ eval = -999;
+ for(int r = 0; r < 3; r++) {
+ for(int c = 0; c < 3; c++) {
+ if(boardState[c][r] == 0) {
+ int simBoard[3][3];
+ //deep copy boardState to simBoard
+ for(int i = 0; i < 9; i++) {
+ simBoard[i % 3][i / 3] = boardState[i % 3][i / 3];
+ }
simBoard[c][r] = turn + 1;
- struct PosInfo i = minimax(simBoard, !turn);
- if(i.eval > eval) {
- eval = i.eval;
+ struct PosInfo mr = minimax(simBoard, !turn);
+ if((turn == 0 && mr.eval > eval) || (turn == 1 && mr.eval < eval) || eval == -999) {
+ eval = mr.eval;
bestMove[0] = c;
bestMove[1] = r;
}
@@ -155,10 +158,12 @@ struct PosInfo minimax(int boardState[3][3], int turn) {
}
int* ai_input_pos(int boardState[3][3], int turn) {
struct PosInfo i = minimax(boardState, turn);
- return i.pos;
+ int* nPos = malloc(2 * sizeof(int));
+ nPos[0] = i.pos[0];
+ nPos[1] = i.pos[1];
+ return nPos;
}
-void clear_screen()
-{
+void clear_screen() {
system("@cls||clear");
}
int main() {
@@ -169,7 +174,7 @@ int main() {
clear_screen();
draw_board(board);
int* tl = get_move_ptrs[turn](board, turn);
- board[tl[0] - 1][3 - tl[1]] = turn + 1;
+ board[tl[0]][tl[1]] = turn + 1;
free(tl);
int s = get_game_state(board);
if(s == 1 || s == 2) {