954,535 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Tic Tac Toe game

This is what I have and having some problems with the checkPosn function. can anyone help me out. When I run the program and pick the posn it runs "posn already taken, please choose another. What I am doing wrong?

Melissa

#include <iostream>
using namespace std;
class ticTac
{
      private:
             int counter;
             char posn[9];
             char player;
      public:
             void nextPlayer();
             char getPlayer();
             void newBoard();
             void startGame();
             char checkWinner();
             void checkPosn(int spot);
             void currentBoard();
};

int main()
{
    char ch;
    ticTac Toe;
    do{
           Toe.newBoard();
           Toe.startGame();
           cout << "Would you like to play again (Enter 'y')? ";
           cin >> ch;
           }while (ch == 'y');
           
    return 0;    
}
void ticTac::newBoard()
{
          
     char posndef[9] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
     int i;
     counter = 0;
     player = 'x';
     for (i=0; i<9; i++) posn[i]=posndef[i];
     currentBoard();
     return;
     
};
void ticTac::currentBoard()
{
     cout << "\n\n" <<endl;
     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\n" <<endl;
     
};
void ticTac::startGame()
{
     int spot;
     char blank = ' ';
  
     cout << "Player " << getPlayer() <<" will go first and be the letter 'x'" <<endl;
        
     do {
         currentBoard();              // display current board   
              
         cout << "\n\n Player " << getPlayer() <<" choose a posn." <<endl;
         cin >> spot;
         
         do {
             checkPosn(spot);
             }while (posn[spot] != 'x' && posn[spot] != 'o');
             cout << "Nice move." <<endl;
         
         currentBoard();              // display current board   
          
         nextPlayer();  
         }while ( checkWinner() == blank );
              
};
     
char ticTac::checkWinner()
{
     char Winner = ' ';
     
     // Check if X wins   
     if (posn[1] == 'x' && posn[2] == 'x' && posn[3] == 'x') Winner = 'x';
     if (posn[4] == 'x' && posn[5] == 'x' && posn[6] == 'x') Winner = 'x';
     if (posn[7] == 'x' && posn[8] == 'x' && posn[9] == 'x') Winner = 'x';
     if (posn[1] == 'x' && posn[4] == 'x' && posn[7] == 'x') Winner = 'x';
     if (posn[2] == 'x' && posn[5] == 'x' && posn[8] == 'x') Winner = 'x';
     if (posn[3] == 'x' && posn[6] == 'x' && posn[9] == 'x') Winner = 'x';
     if (posn[1] == 'x' && posn[5] == 'x' && posn[9] == 'x') Winner = 'x';
     if (posn[3] == 'x' && posn[5] == 'x' && posn[7] == 'x') Winner = 'x';
     if (Winner == 'x' )  
       {cout << "Player1 wins the game." <<endl; return Winner; };
       
     // Check if O wins     
     if (posn[1] == 'o' && posn[2] == 'o' && posn[3] == 'o') Winner = 'o';
     if (posn[4] == 'o' && posn[5] == 'o' && posn[6] == 'o') Winner = 'o';
     if (posn[7] == 'o' && posn[8] == 'o' && posn[9] == 'o') Winner = 'o';
     if (posn[1] == 'o' && posn[4] == 'o' && posn[7] == 'o') Winner = 'o';
     if (posn[2] == 'o' && posn[5] == 'o' && posn[8] == 'o') Winner = 'o';
     if (posn[3] == 'o' && posn[6] == 'o' && posn[9] == 'o') Winner = 'o';
     if (posn[1] == 'o' && posn[5] == 'o' && posn[9] == 'o') Winner = 'o';
     if (posn[3] == 'o' && posn[5] == 'o' && posn[7] == 'o') Winner = 'o';
     if (Winner == 'o' )
       {cout << "Player2 wins the game." <<endl; return Winner; };
       
     // check for Tie
     
     return Winner;        
};
     
void ticTac::checkPosn(int spot)
{
          
     switch (spot)
     {
     case 1: (posn[1] == 'x' || posn[1] =='o'); cout << break;
     case 2: (posn[2] == 'x' || posn[2] =='o'); cout << break;
     case 3: (posn[3] == 'x' || posn[3] =='o'); cout << break;
     case 4: (posn[4] == 'x' || posn[4] =='o'); cout << break;
     case 5: (posn[5] == 'x' || posn[5] =='o'); cout << break;
     case 6: (posn[6] == 'x' || posn[6] =='o'); cout << break;
     case 7: (posn[7] == 'x' || posn[7] =='o'); cout << break;
     case 8: (posn[8] == 'x' || posn[8] =='o'); cout << break;
     case 9: (posn[9] == 'x' || posn[9] =='o'); cout << break;
     }
     cout << "That posn is already taken, please choose another." <<endl;
     counter++;
     
     return;
        
};
void ticTac::nextPlayer()
{
     if (player == 'x')
         player = 'o';
     else player = 'x';
     return;
};
         
char ticTac::getPlayer()
{
     return player;
};
countrygirl1970
Newbie Poster
23 posts since Feb 2007
Reputation Points: 10
Solved Threads: 0
 

You're forgetting that C/C++ arrays start at 0, not 1. So you're overrunning the array boundaries when you reference array[9], because that is in fact the 10th element.

You might do better to create a 2D array instead of a single dimension, as that is the shape of a Tic-Tac-Toe board...

[edit] Loops might also save you some time coding ;-)

John A
Vampirical Lurker
Team Colleague
7,630 posts since Apr 2006
Reputation Points: 2,240
Solved Threads: 339
 

Yes, you start using 0-8 but jump to 1-9. I'm not clear, in Checkposn what "cout << break" is supposed to do, but there's it's not going to get you past the cout line you're always seeing, right? It just stops the 'cascade' of the switch statement. Did you want that complaint cout to be the default for the switch?

You also will save a few steps - just check if its not a blank and then check what letter's there. Likewise, you can just ask if the 3 'win' positions are the same non-blank and, if so, say that letter wins.

afbach
Newbie Poster
7 posts since Mar 2006
Reputation Points: 11
Solved Threads: 0
 
switch (spot)
     {
     case 1: (posn[1] == 'x' || posn[1] =='o'); cout << break;
     case 2: (posn[2] == 'x' || posn[2] =='o'); cout << break;
     case 3: (posn[3] == 'x' || posn[3] =='o'); cout << break;
     case 4: (posn[4] == 'x' || posn[4] =='o'); cout << break;
     case 5: (posn[5] == 'x' || posn[5] =='o'); cout << break;
     case 6: (posn[6] == 'x' || posn[6] =='o'); cout << break;
     case 7: (posn[7] == 'x' || posn[7] =='o'); cout << break;
     case 8: (posn[8] == 'x' || posn[8] =='o'); cout << break;
     case 9: (posn[9] == 'x' || posn[9] =='o'); cout << break;
     }

This can be condensed to the following:

if (posn[spot] == 'x' || posn[spot] == 'o') {
    // spot is taken
}
else {
    // spot is empty
}


It would also be a good idea to validate the position given in the parameter...

John A
Vampirical Lurker
Team Colleague
7,630 posts since Apr 2006
Reputation Points: 2,240
Solved Threads: 339
 

There wasn't suposed to the cout << in the switch statement before the break. I forgot to delete that part. So, you are saying that I use an if statement instead of the switch statement.

Melissa

countrygirl1970
Newbie Poster
23 posts since Feb 2007
Reputation Points: 10
Solved Threads: 0
 

You can try the following TicTacToe program = TicTacToe in Plain C without using BGI graphics Its written by me

shabbirbhimani
Newbie Poster
1 post since Sep 2006
Reputation Points: 10
Solved Threads: 0
 

This TicTacToe game is my first and it has to be simple because I am just learning C++. I was able to fix the checkposn funtion, but now it won't go to the next player or input the 'x' or 'o'.

Here is what I have so far:

#include <iostream>
using namespace std;
class ticTac
{
      private:
             int counter;
             char posn[9];
             char player;
      public:
             void nextPlayer();
             char getPlayer();
             void newBoard();
             void startGame();
             char checkWinner();
             void checkPosn(int spot);
             void currentBoard();
};
 
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] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
     int i;
     counter = 0;
     player = 'x';
     for (i=0; i<9; i++) posn[i]=posndef[i];
     currentBoard();
     return;
 
};
//The board that each players play on
void ticTac::currentBoard()
{
     cout << "\n\n" <<endl;
     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\n" <<endl;
 
};
//Starts the game
void ticTac::startGame()
{
     int spot;
     char blank = ' ';
 
     cout << "Player " << getPlayer() <<" will go first and be the letter 'x'" <<endl;
 
     do {
         currentBoard();              // display current board   
 
         cout << "\n\n Player " << getPlayer() <<" choose a posn." <<endl;
         cin >> spot;
 
         do {
             checkPosn(spot);
             }while (posn[spot] != 'x' && posn[spot] != 'o');
             cout << "Nice move." <<endl;
 
         currentBoard();              // display current board   
 
         nextPlayer();  
         }while ( checkWinner() == blank );
 
         return;
 
};
//Checks to see who the winner will be     
char ticTac::checkWinner()
{
     char Winner = ' ';
 
     // Check if X wins   
     if (posn[1] == 'x' && posn[2] == 'x' && posn[3] == 'x') Winner = 'x';
     if (posn[4] == 'x' && posn[5] == 'x' && posn[6] == 'x') Winner = 'x';
     if (posn[7] == 'x' && posn[8] == 'x' && posn[9] == 'x') Winner = 'x';
     if (posn[1] == 'x' && posn[4] == 'x' && posn[7] == 'x') Winner = 'x';
     if (posn[2] == 'x' && posn[5] == 'x' && posn[8] == 'x') Winner = 'x';
     if (posn[3] == 'x' && posn[6] == 'x' && posn[9] == 'x') Winner = 'x';
     if (posn[1] == 'x' && posn[5] == 'x' && posn[9] == 'x') Winner = 'x';
     if (posn[3] == 'x' && posn[5] == 'x' && posn[7] == 'x') Winner = 'x';
     if (Winner == 'x' )  
       {cout << "Player1 wins the game." <<endl; return Winner; };
 
     // Check if O wins     
     if (posn[1] == 'o' && posn[2] == 'o' && posn[3] == 'o') Winner = 'o';
     if (posn[4] == 'o' && posn[5] == 'o' && posn[6] == 'o') Winner = 'o';
     if (posn[7] == 'o' && posn[8] == 'o' && posn[9] == 'o') Winner = 'o';
     if (posn[1] == 'o' && posn[4] == 'o' && posn[7] == 'o') Winner = 'o';
     if (posn[2] == 'o' && posn[5] == 'o' && posn[8] == 'o') Winner = 'o';
     if (posn[3] == 'o' && posn[6] == 'o' && posn[9] == 'o') Winner = 'o';
     if (posn[1] == 'o' && posn[5] == 'o' && posn[9] == 'o') Winner = 'o';
     if (posn[3] == 'o' && posn[5] == 'o' && posn[7] == 'o') Winner = 'o';
     if (Winner == 'o' )
       {cout << "Player2 wins the game." <<endl; return Winner; };
 
     // check for Tie
 
     return Winner;        
};
//Checks to see if the posn is taken     
void ticTac::checkPosn(int spot)
{
 
     if (posn[spot] == 'x' || posn[spot] == 'o') {
                  cout << "posn already taken, please choose another." <<endl;
                  }
                  else {
 
           };
 
     counter++;
 
     return;
 
};
//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;
};


Thanks for everyone that is helping me on this program. I am enjoying learning this language.

Melissa

countrygirl1970
Newbie Poster
23 posts since Feb 2007
Reputation Points: 10
Solved Threads: 0
 

By the way, I am using Bloodshed compiler for this program.

Melissa

countrygirl1970
Newbie Poster
23 posts since Feb 2007
Reputation Points: 10
Solved Threads: 0
 

>I was able to fix the checkposn funtion, but now it won't go to the next player or input the 'x' or 'o'.
That's because of 2 problems.

If you don't return anything from this function, how do you expect the other part of the code to know if the position is taken?

//Checks to see if the posn is taken     
void ticTac::checkPosn(int spot)
{
 
     if (posn[spot] == 'x' || posn[spot] == 'o') {
                  cout << "posn already taken, please choose another." <<endl;
                  }
                  else {
 
           };
 
     counter++;
 
     return;
};

I'd also advise against printing the error message in the function itself; the purpose of this function should be only to return the state of a given position. Let the function which invoked this function take care of the error messages.

Your second problem is here.

do {
             checkPosn(spot);
             }while (posn[spot] != 'x' && posn[spot] != 'o');

Just how do you expect 'posn' to contain a value when you never have any input here? Your while() loop is redundant too, because it checks the same thing that checkPosn does.

How about:

bool posTaken = true;
while (posTaken) {
    cout << "position is taken, please enter a valid space" << endl;
    cin >> spot; // not the prettiest thing to do,
                 // but this is just for demonstration
    posTaken = checkPosn(spot);
}
John A
Vampirical Lurker
Team Colleague
7,630 posts since Apr 2006
Reputation Points: 2,240
Solved Threads: 339
 

Thank you joeprogrammer,

I really glad that I can get help from this web site when I can't get it from the school.
Thanks for all the help.

Melissa

countrygirl1970
Newbie Poster
23 posts since Feb 2007
Reputation Points: 10
Solved Threads: 0
 

> I really glad that I can get help from this web site when I can't get it from the school.
No problem.

>Thanks for all the help.
You're welcome.

John A
Vampirical Lurker
Team Colleague
7,630 posts since Apr 2006
Reputation Points: 2,240
Solved Threads: 339
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You