commit
3410f2c60e
@ -0,0 +1,3 @@ |
|||||||
|
# tic_tac_toe |
||||||
|
|
||||||
|
Simple tic_tac_toe game for linux terminal |
@ -0,0 +1,179 @@ |
|||||||
|
#include <stdio.h> |
||||||
|
#include <ctype.h> |
||||||
|
|
||||||
|
struct player { |
||||||
|
const unsigned char X; |
||||||
|
const unsigned char O; |
||||||
|
}; |
||||||
|
|
||||||
|
char field[5][5] = { '1', '|', '2', '|', '3', |
||||||
|
'-', '+', '-', '+', '-', |
||||||
|
'4', '|', '5', '|', '6', |
||||||
|
'-', '+', '-', '+', '-', |
||||||
|
'7', '|', '8', '|', '9' }; |
||||||
|
|
||||||
|
// сlear screen
|
||||||
|
void clrscr(void) |
||||||
|
{ |
||||||
|
printf("\033[2J"); /* Clear the entire screen. */ |
||||||
|
printf("\033[0;0f"); /* Move cursor to the top left hand corner */ |
||||||
|
} |
||||||
|
|
||||||
|
// clear stdin
|
||||||
|
void flush_input(void) { |
||||||
|
char c; |
||||||
|
while ( scanf("%c", &c) == 1 && c != '\n' ); |
||||||
|
} |
||||||
|
|
||||||
|
// checking players turn input
|
||||||
|
char turn_inp(char M[5][5], unsigned char player) { |
||||||
|
char ch; |
||||||
|
char N[9]; |
||||||
|
int err, c = 0; |
||||||
|
int i, j, g = 0; |
||||||
|
|
||||||
|
for (i = 0; i < 5; i++) { |
||||||
|
for (j = 0; j < 5; j++) { |
||||||
|
if (i%2 == 0 && j%2 == 0 ) { |
||||||
|
N[g] = M[i][j]; |
||||||
|
g++; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
printf("%c, your turn: ", player); |
||||||
|
for (;;) { |
||||||
|
err = 0; |
||||||
|
ch = getchar(); |
||||||
|
flush_input(); |
||||||
|
c = ch - 48; |
||||||
|
if (isdigit(ch)) { |
||||||
|
for (g = 1; g < 10; g++) { |
||||||
|
if (c == g && ch != N[g-1] ) { |
||||||
|
printf("Input error! %c, repeat your turn: ", player); |
||||||
|
err = 1; |
||||||
|
} |
||||||
|
} |
||||||
|
if (err == 0) {return ch;} |
||||||
|
} else { |
||||||
|
printf("Input error! %c, repeat your turn: ", player); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// checking victory conditions
|
||||||
|
int victory(char M[5][5], int free_turns) { |
||||||
|
int i, j, g = 0; |
||||||
|
char N[9]; |
||||||
|
for (i = 0; i < 5; i++) { |
||||||
|
for (j = 0; j < 5; j++) { |
||||||
|
if (i%2 == 0 && j%2 == 0 ) { |
||||||
|
N[g] = M[i][j]; |
||||||
|
g++; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if ((N[0] == N[1] && N[1] == N[2]) || |
||||||
|
(N[3] == N[4] && N[4] == N[5]) || |
||||||
|
(N[6] == N[7] && N[7] == N[8]) || |
||||||
|
(N[0] == N[3] && N[3] == N[6]) || |
||||||
|
(N[1] == N[4] && N[4] == N[7]) || |
||||||
|
(N[2] == N[5] && N[5] == N[8]) || |
||||||
|
(N[0] == N[4] && N[4] == N[8]) || |
||||||
|
(N[2] == N[4] && N[4] == N[6])) { |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
if (free_turns == 0) |
||||||
|
return 2; |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
// change gamefield
|
||||||
|
void field_change(char M[5][5], unsigned char turn, unsigned char player) { |
||||||
|
int i, j = 0; |
||||||
|
for (i = 0; i < 5; i++) { |
||||||
|
for (j = 0; j < 5; j++) { |
||||||
|
if (M[i][j] == turn ) { |
||||||
|
M[i][j] = player; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// print gamefield
|
||||||
|
void print_field(char M[5][5]) { |
||||||
|
int i,j = 0; |
||||||
|
for (i = 0; i < 5; i++) { |
||||||
|
for (j = 0; j < 5; j++) { |
||||||
|
if (j < 4) { |
||||||
|
if (M[i][j] == 'X') { |
||||||
|
printf("\x1b[31m%c\x1b[0m ", M[i][j]); |
||||||
|
} else if (M[i][j] == 'O') { |
||||||
|
printf("\x1b[32m%c\x1b[0m ", M[i][j]); |
||||||
|
} else { |
||||||
|
printf("%c ", M[i][j]); |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (M[i][j] == 'X') { |
||||||
|
printf("\x1b[31m%c\x1b[0m \n", M[i][j]); |
||||||
|
} else if (M[i][j] == 'O') { |
||||||
|
printf("\x1b[32m%c\x1b[0m \n", M[i][j]); |
||||||
|
} else { |
||||||
|
printf("%c \n", M[i][j]); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
int main(void) { |
||||||
|
|
||||||
|
char turn; |
||||||
|
struct player p = { 'X', 'O' }; |
||||||
|
int z = 1; |
||||||
|
int free_turns = 9; |
||||||
|
int win = victory(field, free_turns); |
||||||
|
|
||||||
|
do { |
||||||
|
print_field(field); |
||||||
|
printf("\n"); |
||||||
|
|
||||||
|
if (z == 1) { |
||||||
|
turn = turn_inp(field, p.X); |
||||||
|
field_change(field, turn, p.X); |
||||||
|
free_turns--; |
||||||
|
z = 0; |
||||||
|
} else { |
||||||
|
turn = turn_inp(field, p.O); |
||||||
|
field_change(field, turn, p.O); |
||||||
|
free_turns--; |
||||||
|
z = 1; |
||||||
|
} |
||||||
|
|
||||||
|
win = victory(field, free_turns); |
||||||
|
clrscr(); |
||||||
|
|
||||||
|
} while (win == 0); |
||||||
|
|
||||||
|
if (win == 1) { |
||||||
|
print_field(field); |
||||||
|
printf("\n\n"); |
||||||
|
if (z == 0) |
||||||
|
printf("Player \x1b[5;31m%c\x1b[0m wins!\n", p.X); |
||||||
|
else |
||||||
|
printf("Player \x1b[5;32m%c\x1b[0m wins!\n", p.O); |
||||||
|
} |
||||||
|
|
||||||
|
if (win == 2) { |
||||||
|
print_field(field); |
||||||
|
printf("\n"); |
||||||
|
const char go[] ="GAME OVER. Tie!"; |
||||||
|
printf("\x1b[5;32m%s\x1b[0m\n", go); |
||||||
|
} |
||||||
|
|
||||||
|
return 0; |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue