commit 1ab6db826eac5460a6a030aa062c16410c9bf4c5
Author: Wilson Gheen <wilson@wilsonrgheen.com>
Date: Tue, 13 Dec 2022 16:46:18 -0600
Initial commit. Simple tic-tac-toe game.
Diffstat:
A | tictactoe.c | | | 65 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | tictactoe.h | | | 27 | +++++++++++++++++++++++++++ |
2 files changed, 92 insertions(+), 0 deletions(-)
diff --git a/tictactoe.c b/tictactoe.c
@@ -0,0 +1,65 @@
+#include <stdint.h>
+#include <stdio.h>
+#define TB_IMPL
+#include <termbox.h>
+
+#include "../life/print_box.h"
+#include "tictactoe.h"
+
+#define SIDE_BY_SIDE 0
+
+void print_board_offset(char *board, int offx, int offy, int clear) {
+ if(clear) tb_clear();
+ print_box_offset(7, 7, offx, offy, 0);
+ for(int i=0; i < 9; i++) {
+ print_bw(((i%3) * 2) + 2 + offx, (i/3*2) + 2 + offy, board[i]);
+ }
+ tb_present();
+}
+void print_board(char *board) {
+ print_board_offset(board, 0, 0, 1);
+}
+
+int main(void) {
+ struct tb_event ev;
+ char board[9] = " ";
+ char winner = 0;
+ char last_played = 'O';
+ void (*get_move)(char*, char) = get_move_from_human;
+ tb_init();
+ if(!SIDE_BY_SIDE)
+ print_board(board);
+ for(int turns=0; !winner && turns <= 9; turns++) {
+ get_move(board, (last_played = (last_played == 'O' ? 'X' : 'O')));
+ if(SIDE_BY_SIDE)
+ print_board_offset(board, turns * 10, 0, 0);
+ else
+ print_board(board);
+ tb_peek_event(&ev, 300);
+ char center = board[4];
+ for(int i=-4; center != ' ' && i < 0; i++) {
+ if(board[4+i] == center && board[4-i] == center) {
+ winner = center;
+ break;
+ }
+ }
+ for(int i=1; !winner && i <= 7; i+=2){
+ if(board[i] == ' ') continue;
+ if((i+1) & 4) { /* column */
+ if(board[i-3] == board[i] && board[i+3] == board[i])
+ winner = board[i];
+ } else { /* row */
+ if(board[i-1] == board[i] && board[i+1] == board[i])
+ winner = board[i];
+ }
+ }
+ }
+ if(winner)
+ print_msg("%c wins.", winner);
+ else
+ print_msg("SCRATCH");
+ tb_present();
+ while(tb_poll_event(&ev) == TB_OK)
+ if (ev.type == TB_EVENT_KEY && ev.key == TB_KEY_CTRL_C)
+ tb_shutdown();
+}
diff --git a/tictactoe.h b/tictactoe.h
@@ -0,0 +1,27 @@
+int m = 0;
+
+#define SCRATCH_BOARD "XXOOOXXOX"
+#define X_WINS_COLUMN "XXOXOOXOX"
+#define X_WINS_DIAG "XOO XOOXX"
+#define X_WINS_ROW " OOOXOXXX"
+#define O_WINS_COLUMN "OOXOXXOX "
+#define O_WINS_DIAG "OXXOOXX O"
+#define O_WINS_ROW " XXXOXOOO"
+
+void get_move_preset_board(char *board, char player) {
+ char desired_board[9] = SCRATCH_BOARD;
+ for(int i=0; i < 9; i++) {
+ if(desired_board[i] == player && board[i] == ' ') {
+ board[i] = player;
+ return;
+ }
+ }
+}
+
+void get_move_from_human(char *board, char player) {
+ int n;
+ print_msg("%c's move? [1-9]: ", player);
+ tb_present();
+ scanf("%d", &n);
+ board[n-1] = player;
+}