tictactoe

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
Atictactoe.c | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atictactoe.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; +}