From a7463156aaaa5d8d48b2765811fd9862b4a98f1b Mon Sep 17 00:00:00 2001 From: simonkellet Date: Sat, 21 May 2022 22:36:57 +0100 Subject: [PATCH] init push --- README.md | 14 +++++ build.sh | 6 ++ main.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ttt | Bin 0 -> 19528 bytes 4 files changed, 186 insertions(+) create mode 100755 build.sh create mode 100644 main.c create mode 100755 ttt diff --git a/README.md b/README.md index e69de29..c90a389 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,14 @@ +# TicTacToe in C + +A simple TicTacToe game written in C in under 2 hours! + +## Usage +```bash +./build +``` +then +```bash +./ttt +``` + +Enjoy! diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..707c08b --- /dev/null +++ b/build.sh @@ -0,0 +1,6 @@ + #!/bin/bash + +set -xe +CFLAGS="-Wall -Werror -std=c11 -ggdb" + +gcc $CFLAGS -o ttt main.c \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..5e4fa99 --- /dev/null +++ b/main.c @@ -0,0 +1,166 @@ +#include +#include +#include +#include + +#define ROWS 3 +#define COLUMNS 3 +#define RED "\033[31m" /* Red */ +#define BOLDGREEN "\033[1m\033[32m" /* Bold Green */ +#define BOLDYELLOW "\033[1m\033[33m" /* Bold Yellow */ +#define BOLDRED "\033[1m\033[31m" /* Bold Yellow */ +#define BOLDWHITE "\033[1m\033[37m" /* Bold White */ +#define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */ +#define RESET "\033[0m" + +char board[ROWS][COLUMNS]; +char ESC = 27; + +void print_board(); +void clear_board(); +void player_choice(char player); +void cpu_choice(char cpu); +char check_win(); +int free_spaces(); + +int main(int argc, char *argv[]){ + char flag = ' '; + clear_board(); + + do{ + flag = check_win(); + if(free_spaces() == 0){ + break; + } + + print_board(); + + player_choice('X'); + flag = check_win(); + print_board(); + + player_choice('O'); + flag = check_win(); + print_board(); + + } while(flag == ' '); + + if(flag == ' ') + printf(BOLDMAGENTA "\nNo-one won!" RESET); + else + printf(BOLDMAGENTA "\n%c won!" RESET, flag ); + + printf(BOLDWHITE "\nGame Over!\n" RESET); + return 0; +} + +void print_board(){ + system("clear"); + printf(BOLDWHITE " 1 2 3 \n" RESET); + + printf(BOLDWHITE "1 " RESET); + printf("%c | %c | %c ", board[0][0], board[0][1], board[0][2]); + printf("\n ---|---|---\n"); + + printf(BOLDWHITE "2 " RESET); + printf("%c | %c | %c ", board[1][0], board[1][1], board[1][2]); + printf("\n ---|---|---\n"); + + printf(BOLDWHITE "3 " RESET); + printf("%c | %c | %c ", board[2][0], board[2][1], board[2][2]); + + printf("\n"); +} + +void clear_board(){ + int r, c; + for(r = 0; r < ROWS; ++r){ + for(c = 0; c < COLUMNS; ++c){ + board[r][c] = ' '; + } + } +} + +int free_spaces(){ + int r, c, s; + s = 0; + for(r = 0; r < ROWS; ++r){ + for(c = 0; c < COLUMNS; ++c){ + if(board[r][c] == ' ') ++s; + } + } + return s; +} + +void player_choice(char player){ + + int pr, pc; + printf(BOLDGREEN "\n[%c] Enter row (1, 2 or 3) <---->\n> " RESET, player); + scanf("%d", &pr); + --pr; + + printf(BOLDYELLOW "\n[%c] Enter column (1, 2 or 3) ^ v\n> " RESET, player); + scanf("%d", &pc); + --pc; + + if(board[pr][pc] != ' ' ){ + printf(BOLDRED "\n[%c] Cannot play here, skipping...\n" RESET, player); + } else { + board[pr][pc] = player; + } +} + +void cpu_choice(char cpu){ + time_t t; + srand((unsigned)time(&t)); + + int cr, cc; + cr = cc = 0; + while(board[cr][cc] != ' '){ + cr = rand() % 3; + cc = rand() % 3; + } + board[cr][cc] = cpu; +} + +char check_win(){ + char flag = ' '; + /* + 00 |01 |02 + ---|---|--- + 10 |11 |12 + ---|---|--- + 20 |21 |22 + */ + //horizontal checks l to r + if(board[0][0] == board[0][1] && board[0][1] == board[0][2]){ + flag = board[0][0]; + } + if(board[1][0] == board[1][1] && board[1][1] == board[1][2]){ + flag = board[1][0]; + } + if(board[2][0] == board[2][1] && board[2][1] == board[2][2]){ + flag = board[2][0]; + } + + //horizontal check up n down + if(board[0][0] == board[1][0] && board[1][0] == board[2][0]){ + flag = board[0][0]; + } + if(board[0][1] == board[1][1] && board[1][1] == board[2][1]){ + flag = board[0][1]; + } + if(board[0][2] == board[1][2] && board[1][2] == board[2][2]){ + flag = board[0][2]; + } + + //diagonal checks + if(board[0][0] == board[1][1] && board[1][1] == board[2][2]){ + flag = board[0][0]; + } + if(board[0][2] == board[1][1] && board[1][1] == board[2][0]){ + flag = board[0][2]; + } + + return flag; +} diff --git a/ttt b/ttt new file mode 100755 index 0000000000000000000000000000000000000000..83d584f7dde50b16bc3d98b6e82aca94f4a119cd GIT binary patch literal 19528 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 F{|jMe8-D-* literal 0 HcmV?d00001