diff options
| author | Adam T. Carpenter <Commodore@chunkybluegiant> | 2025-04-28 11:54:07 -0400 |
|---|---|---|
| committer | Adam T. Carpenter <Commodore@chunkybluegiant> | 2025-04-28 11:54:07 -0400 |
| commit | e447b8844a4dd13a8b57599dcae767c513761793 (patch) | |
| tree | d90ea9f24253026b1939f92a9544ed00bf8e699c /src/main.c | |
| parent | 0976b24cad90547fec8a1252f7e962b13d711501 (diff) | |
| download | ttt-c64-e447b8844a4dd13a8b57599dcae767c513761793.tar.xz ttt-c64-e447b8844a4dd13a8b57599dcae767c513761793.zip | |
feat: rudimentary play with randomized opponent moves
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 104 |
1 files changed, 75 insertions, 29 deletions
@@ -1,10 +1,11 @@ #include <conio.h> #include <stdio.h> +#include <stdlib.h> #include "consts.h" #include "protos.h" -char is_board_solved(BOARD board) { +SOLUTION is_board_solved(BOARD board) { char cases[8] = {EMPTY}; char i; @@ -22,10 +23,10 @@ char is_board_solved(BOARD board) { for (i = 0; i < 8; i++) { if (cases[i] == 1) { // X won - return X; + return X_WON; } else if (cases[i] == 8) { // O won - return O; + return O_WON; } } @@ -33,7 +34,7 @@ char is_board_solved(BOARD board) { for (i = 0; i < 9; i++) { if (cases[i] == EMPTY) { // more spaces left; game continues - return EMPTY; + return MOVES_LEFT; } } @@ -44,6 +45,7 @@ char is_board_solved(BOARD board) { void print_board(BOARD board) { char i, j; + printf("\n"); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { printf("%d ", board[i][j]); @@ -52,41 +54,85 @@ void print_board(BOARD board) { } } +void opponent_move(BOARD board, DIFFICULTY difficulty) { + char move, move_x, move_y; + printf("Opponent is moving..."); + + // take winning moves (medium) + // if (difficulty > EASY) { + // } + + // prevent winning move (hard) + // if (difficulty > MEDIUM) { + // } + + // take random move (easy) + do { + move = rand() % 9; + move_x = move % 3; + move_y = move / 3; + } while (board[move_y][move_x] != EMPTY); + + board[move_y][move_x] = O; +} + +void print_endgame(SOLUTION solution) { + switch (solution) { + case X_WON: + printf("X won"); + break; + case O_WON: + printf("O won"); + break; + case TIE: + printf("Stalemate"); + break; + } + printf("\n"); +} + +void player_move(BOARD board) { + char move = EMPTY; + char move_x = EMPTY; + char move_y = EMPTY; + + printf("Enter a move..."); + + move = cgetc() - '0' - 1; + // if move is not a number then bail + // if (move < 1 || move > 8) { invalid! } + move_x = move % 3; + move_y = move / 3; + // if move not already taken + board[move_y][move_x] = X; +} + int main() { - char solution = EMPTY; + SOLUTION solution = MOVES_LEFT; char move = EMPTY; char move_x = EMPTY; char move_y = EMPTY; BOARD board = {{EMPTY}, {EMPTY}, {EMPTY}}; - while (1) { + cursor(1); + + while (solution == MOVES_LEFT) { print_board(board); + player_move(board); - solution = is_board_solved(board); - switch (solution) { - case X: - printf("X won"); - break; - case O: - printf("O won"); - break; - case TIE: - printf("Stalemate"); - break; - default: - printf("Enter a move..."); + if ((solution = is_board_solved(board)) != MOVES_LEFT) { + print_endgame(solution); + return 0; } - printf("\n"); - cursor(1); - move = cgetc() - '0' - 1; - // if move is not a number then bail - // if (move < 1 || move > 8) { invalid! } - move_x = move % 3; - move_y = move / 3; - // if move not already taken - board[move_y][move_x] = X; + print_board(board); + opponent_move(board, EASY); + + if ((solution = is_board_solved(board)) != MOVES_LEFT) { + print_endgame(solution); + return 0; + } } return 0; -}
\ No newline at end of file +} |