first commit
This commit is contained in:
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# tic_tac_toe
|
||||
|
||||
Simple tic_tac_toe game for linux terminal
|
||||
179
src/game.c
Normal file
179
src/game.c
Normal file
@@ -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;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user