Hello everyone,
I am having a slight problem in my function "startGame". My code works on Bloodshed and the code does compile. I am trying to refine the part on making sure that only a number gets input and not a letter or any other key gets input. I have try a couple different ways and it is not coming out the way I think it should. I have tried a do/while loop and a if/else statement. Does anyone have a sugestion.
#include <iostream>
#include <cstdlib>
using namespace std;
class ticTac
{
private:
int counter;
char posn[9];
char player;
public:
void nextPlayer();
char getPlayer();
void newBoard();
void startGame();
char checkWinner();
bool checkPosn(int spot, char player);
void updateBoard();
};
int main()
{
char ch;
ticTac Toe;
do{
Toe.newBoard(); //Brings up the new board
Toe.startGame(); //Starts the new game
cout << "Would you like to play again (Enter 'y')? ";
cin >> ch;
}while (ch == 'y');
return 0;
}
//The new board before the game starts
void ticTac::newBoard()
{
char posndef[9] = {'0', '1', '2', '3', '4', '5', '6', '7', '8'};
int i;
counter = 0;
player = 'x';
for (i=0; i<9; i++) posn[i]=posndef[i];
return;
}
//This will update the board with the 'X' or 'O'
void ticTac::updateBoard()
{
cout << "\n\n" <<endl;
cout << "\n\n\t\t" <<posn [0]<< " | " <<posn [1]<< " | " <<posn [2]<<endl;
cout << " \t\t | | " <<endl;
cout << " \t\t ___|____|___ " <<endl;
cout << "\n\n\t\t" <<posn [3]<< " | " <<posn [4]<< " | " <<posn [5]<<endl;
cout << " \t\t | | " <<endl;
cout << " \t\t ___|____|___ " <<endl;
cout << "\n\n\t\t" <<posn [6]<< " | " <<posn [7]<< " | " <<posn [8]<<endl;
cout << " \t\t | | " <<endl;
cout << " \t\t | | " <<endl;
cout << "\n" <<endl;
}
//Starts the game
void ticTac::startGame()
{
int spot;
char blank = ' ';
bool result = false;
char posndef[9] = {'0', '1', '2', '3', '4', '5', '6', '7', '8'};
cout << "\n\nPlayer " << getPlayer() <<" will be the first to play." <<endl;
do {
updateBoard(); // display update board
cout << "Player " << getPlayer() <<" choose a position between (0 - 8)." <<endl;
cin >> spot;
if (spot < 0 || spot > 8)
{
cout << "Invalid position! Please input a number of 0 thru 8." <<endl;
continue;}
result = checkPosn(spot, getPlayer()); // to check if the position is taken
system("CLS");
if (result == false){
nextPlayer(); }
if(checkWinner() == 'x' || checkWinner() == 'o' || checkWinner () == 't')
blank = 'v';
}
while ( blank != 'v' );
return;
}
//Checks to see who the winner will be
char ticTac::checkWinner()
{
char game = ' ';
int check = 1;
// Check if X wins
if (posn[0] == 'x' && posn[1] == 'x' && posn[2] == 'x') game = 'x';
if (posn[3] == 'x' && posn[4] == 'x' && posn[5] == 'x') game = 'x';
if (posn[6] == 'x' && posn[7] == 'x' && posn[8] == 'x') game = 'x';
if (posn[0] == 'x' && posn[3] == 'x' && posn[6] == 'x') game = 'x';
if (posn[1] == 'x' && posn[4] == 'x' && posn[7] == 'x') game = 'x';
if (posn[2] == 'x' && posn[5] == 'x' && posn[8] == 'x') game = 'x';
if (posn[0] == 'x' && posn[4] == 'x' && posn[8] == 'x') game = 'x';
if (posn[2] == 'x' && posn[4] == 'x' && posn[6] == 'x') game = 'x';
if (game == 'x' )
{cout << "Player1 wins the game." <<endl; return game; };
// Check if O wins
if (posn[0] == 'o' && posn[1] == 'o' && posn[2] == 'o') game = 'o';
if (posn[3] == 'o' && posn[4] == 'o' && posn[5] == 'o') game = 'o';
if (posn[6] == 'o' && posn[7] == 'o' && posn[8] == 'o') game = 'o';
if (posn[0] == 'o' && posn[3] == 'o' && posn[6] == 'o') game = 'o';
if (posn[1] == 'o' && posn[4] == 'o' && posn[7] == 'o') game = 'o';
if (posn[2] == 'o' && posn[5] == 'o' && posn[8] == 'o') game = 'o';
if (posn[0] == 'o' && posn[4] == 'o' && posn[8] == 'o') game = 'o';
if (posn[2] == 'o' && posn[4] == 'o' && posn[6] == 'o') game = 'o';
if (game == 'o' )
{cout << "Player2 wins the game." <<endl; return game; };
for(int i = 0; i < 8; i++ ){
if(posn[i] >= '1' && posn[i] <= '8' ){
check = 0;
break;
}
}
// Check if tie
if (game != 'x' && game != 'o' && check == 1) game = 't';
if (game == 't')
{cout << "Tie Game." <<endl; return game; };
return game;
}
//Checks to see if the position is taken
bool ticTac::checkPosn(int spot, char player)
{
if (posn[spot] == 'x' || posn[spot] == 'o'){
cout << "Position already taken, please choose another position." <<endl;
system ("pause");
return true;
}
else {
posn[spot] = player;
cout << "Nice move." <<endl;
system ("pause");
counter++;
return false;
}
return false;
}
//Tells the next player that it's thier turn
void ticTac::nextPlayer()
{
if (player == 'x')
player = 'o';
else player = 'x';
return;
}
//This switches between players
char ticTac::getPlayer()
{
return player;
}