summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam T. Carpenter <Commodore@chunkybluegiant>2025-04-28 11:54:07 -0400
committerAdam T. Carpenter <Commodore@chunkybluegiant>2025-04-28 11:54:07 -0400
commite447b8844a4dd13a8b57599dcae767c513761793 (patch)
treed90ea9f24253026b1939f92a9544ed00bf8e699c /src
parent0976b24cad90547fec8a1252f7e962b13d711501 (diff)
downloadttt-c64-e447b8844a4dd13a8b57599dcae767c513761793.tar.xz
ttt-c64-e447b8844a4dd13a8b57599dcae767c513761793.zip
feat: rudimentary play with randomized opponent moves
Diffstat (limited to 'src')
-rw-r--r--src/consts.h3
-rw-r--r--src/main.c104
-rw-r--r--src/protos.h7
-rw-r--r--src/types.h3
4 files changed, 84 insertions, 33 deletions
diff --git a/src/consts.h b/src/consts.h
index b1eaab2..6a482bd 100644
--- a/src/consts.h
+++ b/src/consts.h
@@ -1,4 +1,3 @@
#define EMPTY 0
#define X 1
-#define O 2
-#define TIE 3 \ No newline at end of file
+#define O 2 \ No newline at end of file
diff --git a/src/main.c b/src/main.c
index ebccfd4..01a440d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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
+}
diff --git a/src/protos.h b/src/protos.h
index b658923..e914f5d 100644
--- a/src/protos.h
+++ b/src/protos.h
@@ -1,4 +1,7 @@
#include "types.h";
-char is_board_solved(BOARD board);
-void print_board(BOARD board); \ No newline at end of file
+SOLUTION is_board_solved(BOARD board);
+void print_board(BOARD board);
+void opponent_move(BOARD board, DIFFICULTY difficulty);
+void print_endgame(SOLUTION solution);
+void player_move(BOARD board);
diff --git a/src/types.h b/src/types.h
index 0e441ed..f8a3367 100644
--- a/src/types.h
+++ b/src/types.h
@@ -1 +1,4 @@
typedef char BOARD[3][3];
+
+typedef enum { MOVES_LEFT = 0, X_WON = 1, O_WON = 2, TIE = 3 } SOLUTION;
+typedef enum { EASY, MEDIUM, HARD } DIFFICULTY; \ No newline at end of file