I am having some issues with a TIC TAC TOE program I'm working on for a challenge. It works fine except if I try to play as 'O' it goes on with me playing as 'X' anyway, and when a game should theoretically end in a draw it just keeps asking me to enter a valid place to put 'X' and I can't, because all the spaces are taken.
I'm thinking the first problem has something to do with the 'if' statement in my main function. I don't understand why the game never ends in a draw. I tried to make it so that if the main game loop ran more than 9 times (the maximum number of moves) it would default to a draw, but something is wrong.
Any help would be immensely appreciated. These problems with it are really bothering me.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void srand ();
void printBoard(char ary[3][3]);
void cAction(char ary[3][3], int p);
void pAction(char ary[3][3], int p);
int chkGame(char ary[3][3], int p);
int main(void)
{
char board[3][3] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'}
};
int turn = 0;
int player = 0;
int winner = 0;
int i = 0;
printf("\nName: Ryan Slater\n");
printf("\nLet's play TIC-TAC-TOE!\n");
do
{
printf("\nDo you want to be X or O (X moves first)?\n");
printf("Enter 1 for X and 2 for O: ");
scanf("%d", &player);
} while (player != 1 && player != 2);
for(i = 0; i < 9 && winner == 0; i++)
{
if (player = 1)
{
printBoard(board);
pAction(board, player);
winner = chkGame(board, player);
cAction(board, player);
winner = chkGame(board, player);
}
else
{
cAction(board, player);
winner = chkGame(board, player);
printBoard(board);
pAction(board, player);
winner = chkGame(board, player);
}
}
printf("\nIt's a cat's game!\n");
printf("\nThe game has ended in a draw.\n");
return 0;
}
void printBoard(char ary[3][3])
{
printf("\n");
printf(" %c | %c | %c\n", ary[0][0], ary[0][1], ary[0][2]);
printf(" ---|---|---\n");
printf(" %c | %c | %c\n", ary[1][0], ary[1][1], ary[1][2]);
printf(" ---|---|---\n");
printf(" %c | %c | %c\n\n", ary[2][0], ary[2][1], ary[2][2]);
}
void pAction(char ary[3][3], int p)
{
int spot;
int row;
int col;
do
{
printf("Enter the number of an available space, you are %c: ", (p == 1) ? 'X' : 'O');
scanf("%d", &spot);
row = --spot / 3;
col = spot % 3;
} while (spot < 0 || spot > 9 || ary[row][col] > '9');
ary[row][col] = (p == 1) ? 'X' : 'O';
}
void cAction (char ary[3][3], int p)
{
int x;
int spot;
int row;
int col;
srand(time(NULL));
do
{
x = rand();
x = (x % 9) + 1;
row = --x / 3;
col = x % 3;
} while (x < 0 || x > 9 || ary[row][col] > '9');
printf("The computer picked space %c\n", ary[row][col]);
ary[row][col] = (p == 1) ? 'O' : 'X';
}
int chkGame (char ary[3][3], int p)
{
if (p = 1)
{
if ((ary[0][0] == ary[1][1] && ary[0][0] == ary[2][2] && ary[0][0] == 'X') ||
(ary[0][2] == ary[1][1] && ary[0][2] == ary[2][0] && ary[0][2] == 'X') ||
(ary[0][0] == ary[0][1] && ary[0][0] == ary[0][2] && ary[0][0] == 'X') ||
(ary[1][0] == ary[1][1] && ary[1][0] == ary[1][2] && ary[1][0] == 'X') ||
(ary[2][0] == ary[2][1] && ary[2][0] == ary[2][2] && ary[2][0] == 'X') ||
(ary[0][0] == ary[1][0] && ary[0][0] == ary[2][0] && ary[0][0] == 'X') ||
(ary[0][1] == ary[1][1] && ary[0][1] == ary[2][1] && ary[0][1] == 'X') ||
(ary[0][2] == ary[1][2] && ary[0][2] == ary[2][2] && ary[0][2] == 'X'))
{
printf("\nYou Win!\n");
printf("A WinRAR is YOU!!!\n");
printBoard(ary);
exit(0);
}
else if((ary[0][0] == ary[1][1] && ary[0][0] == ary[2][2]) ||
(ary[0][2] == ary[1][1] && ary[0][2] == ary[2][0]) ||
(ary[0][0] == ary[0][1] && ary[0][0] == ary[0][2]) ||
(ary[1][0] == ary[1][1] && ary[1][0] == ary[1][2]) ||
(ary[2][0] == ary[2][1] && ary[2][0] == ary[2][2]) ||
(ary[0][0] == ary[1][0] && ary[0][0] == ary[2][0]) ||
(ary[0][1] == ary[1][1] && ary[0][1] == ary[2][1]) ||
(ary[0][2] == ary[1][2] && ary[0][2] == ary[2][2]))
{
printf("\nYou Lose!\n");
printf("You are a FAILURE!!!\n");
printBoard(ary);
exit(0);
}
}
else if (p = 2)
{
if ((ary[0][0] == ary[1][1] && ary[0][0] == ary[2][2] && ary[0][0] == 'O') ||
(ary[0][2] == ary[1][1] && ary[0][2] == ary[2][0] && ary[0][2] == 'O') ||
(ary[0][0] == ary[0][1] && ary[0][0] == ary[0][2] && ary[0][0] == 'O') ||
(ary[1][0] == ary[1][1] && ary[1][0] == ary[1][2] && ary[1][0] == 'O') ||
(ary[2][0] == ary[2][1] && ary[2][0] == ary[2][2] && ary[2][0] == 'O') ||
(ary[0][0] == ary[1][0] && ary[0][0] == ary[2][0] && ary[0][0] == 'O') ||
(ary[0][1] == ary[1][1] && ary[0][1] == ary[2][1] && ary[0][1] == 'O') ||
(ary[0][2] == ary[1][2] && ary[0][2] == ary[2][2] && ary[0][2] == 'O'))
{
printf("\nYou Win!\n");
printf("A WinRAR is YOU!!!\n");
printBoard(ary);
exit(0);
}
else if((ary[0][0] == ary[1][1] && ary[0][0] == ary[2][2]) ||
(ary[0][2] == ary[1][1] && ary[0][2] == ary[2][0]) ||
(ary[0][0] == ary[0][1] && ary[0][0] == ary[0][2]) ||
(ary[1][0] == ary[1][1] && ary[1][0] == ary[1][2]) ||
(ary[2][0] == ary[2][1] && ary[2][0] == ary[2][2]) ||
(ary[0][0] == ary[1][0] && ary[0][0] == ary[2][0]) ||
(ary[0][1] == ary[1][1] && ary[0][1] == ary[2][1]) ||
(ary[0][2] == ary[1][2] && ary[0][2] == ary[2][2]))
{
printf("\nYou Lose!\n");
printf("You are a FAILURE!!!\n");
printBoard(ary);
exit(0);
}
}
return 0;
}