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