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