I rewrote the program entirely since the last time I posted. I didn't remember whether I had since posted it or not, but here it is, for convenience. @1st reply: I don't have any expertise in algorithms or game strategy, but my assignment showed a 3x3x3, so that's what I have to make.
2nd reply: Here is the new code (with a smaller class). I see that I could instantiate it three times for three boards (with a small rewrite to remove the 'turn' var), but I can't figure out how to usefully implement an inherited class...
Code:
#include <iostream>
class TicTacToe {
public:
char space[3][3]; // [row][col]
char turn; // X or O
char winner; //X O C or empty space
TicTacToe() { //constructor
int iTurn;
iTurn = (rand() % 2) + 1;
turn = (iTurn == 1) ? 'X' : 'O';
winner = ' ';
int i,j;
for (i=0; i<=2; i++) {
for (j=0; j<=2; j++) {
space[i][j] = ' ';
}
}
} //end constructor
void drawBoard(void);
void checkWin(void);
int userMove(void);
int AIMove(void);
int makeMove(int, char);
} ; //end class TicTacToe
void TicTacToe::drawBoard(void) {
using namespace std;
system("cls");
cout << "\n\n\t\t\t|\t|\t\n" ;
cout << "\t\t " << space[0][0] << "\t| " << space[0][1] << "\t| " << space[0][2] << endl;
cout << "\t\t\t|\t|\n" ;
cout << "\t\t--------|-------|--------\n" ;
cout << "\t\t\t|\t|\n" ;
cout << "\t\t " << space[1][0] << "\t| " << space[1][1] << "\t| " << space[1][2] << endl;
cout << "\t\t\t|\t|\n" ;
cout << "\t\t--------|-------|--------\n" ;
cout << "\t\t\t|\t|\n" ;
cout << "\t\t " << space[2][0] << "\t| " << space[2][1] << "\t| " << space[2][2] << endl;
cout << "\t\t\t|\t|\n" ;
} //end def drawBoard
void TicTacToe::checkWin(void) {
char returnValue = ' ';
//test for X or O win
//test rows
if ( (space[0][0] == space[0][1]) && (space[0][0] == space[0][2]) )
returnValue = space[0][0];
else if ( (space[1][0] == space[1][1]) && (space[1][0] == space[1][2]) )
returnValue = space[1][0];
else if ( (space[2][0] == space[2][1]) && (space[2][0] == space[2][2]) )
returnValue = space[2][0];
//test columns
else if ( (space[0][0] == space[1][0]) && (space[0][0] == space[2][0]) )
returnValue = space[0][0];
else if ( (space[0][1] == space[1][1]) && (space[0][1] == space[2][1]) )
returnValue = space[0][1];
else if ( (space[0][2] == space[1][2]) && (space[0][2] == space[2][2]) )
returnValue = space[0][2];
//test diagonals
else if ( (space[0][0] == space[1][1]) && (space[0][0] == space[2][2]) )
returnValue = space[0][0];
else if ( (space[0][2] == space[1][1]) && (space[0][2] == space[2][0]) )
returnValue = space[0][2];
if ( returnValue == ' ' ) { //then test for cat
int i, j, catCheck=0;
for (i=0; i<=2; i++) {
for (j=0; j<=2; j++) {
if ( space[i][j] == ' ' )
catCheck++;
}
}
if ( catCheck == 0 )
returnValue = 'C';
}
winner = returnValue;
} //end def checkWin
int TicTacToe::userMove(void) {
using namespace std;
int userChoice=0;
while ( userChoice < 1 || userChoice > 9 ) {
cout << "\n\nEnter a square [1-9]: ";
cin >> userChoice;
} //end while
return userChoice;
} //end def userMove
int TicTacToe::AIMove(void) {
int returnValue = (rand() % 9) + 1;
return returnValue;
} //end def AIMove
int TicTacToe::makeMove(int intSpace, char player) {
int returnValue;
switch (intSpace) {
case 1:
if ( space[0][0] == ' ' ) {
space[0][0] = player;
returnValue = 1;
}
else
returnValue = 0;
break;
case 2:
if ( space[0][1] == ' ' ) {
space[0][1] = player;
returnValue = 1;
}
else
returnValue = 0;
break;
case 3:
if ( space[0][2] == ' ' ) {
space[0][2] = player;
returnValue = 1;
}
else
returnValue = 0;
break;
case 4:
if ( space[1][0] == ' ' ) {
space[1][0] = player;
returnValue = 1;
}
else
returnValue = 0;
break;
case 5:
if ( space[1][1] == ' ' ) {
space[1][1] = player;
returnValue = 1;
}
else
returnValue = 0;
break;
case 6:
if ( space[1][2] == ' ' ) {
space[1][2] = player;
returnValue = 1;
}
else
returnValue = 0;
break;
case 7:
if ( space[2][0] == ' ' ) {
space[2][0] = player;
returnValue = 1;
}
else
returnValue = 0;
break;
case 8:
if ( space[2][1] == ' ' ) {
space[2][1] = player;
returnValue = 1;
}
else
returnValue = 0;
break;
case 9:
if ( space[2][2] == ' ' ) {
space[2][2] = player;
returnValue = 1;
}
else
returnValue = 0;
break;
} //end switch
return returnValue;
} //end def makeMove
main() {
using namespace std;
srand(time(NULL));
TicTacToe Game;
int intSpace;
while ( Game.winner == ' ' ) {
Game.drawBoard();
if ( Game.turn == 'X' ) {
doOver1:
intSpace = Game.AIMove();
if ( Game.makeMove(intSpace, 'X') == 0 )
goto doOver1;
Game.turn = 'O';
}
else if ( Game.turn == 'O' ) {
doOver2:
intSpace = Game.userMove();
if ( Game.makeMove(intSpace, 'O') == 0 )
goto doOver2;
Game.turn = 'X';
}
Game.checkWin();
} //end while
Game.drawBoard();
if ( Game.winner != 'C' )
cout << "\n\n" << Game.winner << " wins!" << endl;
else
cout << "\n\n Cat wins!" << endl;
system("pause");
} //end def main