diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2022-11-22 00:15:32 -0800 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2022-11-22 00:15:32 -0800 |
| commit | bdbf21add98c05289d39904fa9c02ffc4c1dcde9 (patch) | |
| tree | 39d9650ce79371ebdd909a6f92d24054c10c11f8 | |
| parent | 5bda952a19edb1a51aa04bca9231c41d811af632 (diff) | |
minimax fully implemented
| -rw-r--r-- | ttt.c | 39 |
1 files changed, 22 insertions, 17 deletions
@@ -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) { |
