I know that an array matrix would have been better but Im taking a freshman course so coulnt use it.

1- Tic tac toe grid is defined from locations 1 to 9

2- For loop executes 9 times for 9 turns

3- A functions takes all 9 locations as argument to compute result after every turn

4- a switch() is used to assign X/O to the grid

5- every case in the switch first checks of location is already used or not- i really want this check to happen only once instead of in every case

6- Can I use just one swicth for both p1 and p2 ?

#include <iostream>
#include "conio.h"
#include "stdlib.h"

using namespace std;
void checkResult(char, char, char, char, char, char, char, char, char);
// this function checks whether P1 or P1 has won; it also displays the grid everytime it is called

int main()
{
char c1='-',c2='-',c3='-',c4='-',c5='-',c6='-', c7='-', c8='-', c9='-'; 
// 9 chars initialized. alternative could have been an array matrix[3][3]
int input;   // location input 

cout<<"\nNOTE:Position in Grid is allocated by numbers 1 to 9 from left to right.\n";

for ( int i=0; i<9; i++)
{
p1_input:
cout<<"\nPlayer 1 make your move. Choose locations 1 to 9 \n";
cin>>input;
switch (input)
       {
              case 1:  
                   if (c1=='-') 
                   c1='X'; 
                   else 
                   { cout<<"\n ***Error: already chosen***"; goto p1_input;}  
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 2: 
                   if (c2=='-') 
                   c2='X'; 
                   else 
                   { cout<<"\n ***Error: already chosen***"; goto p1_input;}    
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 3: 
                   if (c3=='-') 
                   c3='X'; 
                   else 
                   { cout<<"\n ***Error: already chosen***"; goto p1_input;}     
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 4: 
                   if (c4=='-') 
                   c4='X'; 
                   else 
                   { cout<<"\n ***Error: already chosen***"; goto p1_input;}     
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 5: 
                   if (c5=='-') 
                   c5='X'; 
                   else 
                   { cout<<"\n ***Error: already chosen***"; goto p1_input;}     
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 6: 
                   if (c6=='-') 
                   c6='X'; 
                   else 
                   { cout<<"\n ***Error: already chosen***"; goto p1_input;}     
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 7: 
                   if (c7=='-') 
                   c7='X'; 
                   else 
                   { cout<<"\n ***Error: already chosen***\n"; goto p1_input;}   
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 8: if (c8=='-') 
                   c8='X'; 
                   else 
                   { cout<<"\n ***Error: already chosen***\n"; goto p1_input;}     
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 9: if (c9=='-') 
                   c9='X'; 
                   else 
                   { cout<<"\n ***Error: already chosen***\n"; goto p1_input;}    
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              default: cout<<"\n**********invalid input*********\n"; goto p1_input;
              }

p2_input:              
cout<<"\nPlayer 2 make your move. Choose locations 1 to 9 \n";
cin>>input;
switch (input)
       {      case 1:  
                   if (c1=='-') 
                   c1='O'; 
                   else 
                   { cout<<"\n ***Error: already chosen***\n"; goto p2_input;}  
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 2: 
                   if (c2=='-') 
                   c2='O'; 
                   else 
                   { cout<<"\n ***Error: already chosen***\n"; goto p2_input;}    
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 3: 
                   if (c3=='-') 
                   c3='O'; 
                   else 
                   { cout<<"\n ***Error: already chosen***\n"; goto p2_input;}     
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 4: 
                   if (c4=='-') 
                   c4='O'; 
                   else 
                   { cout<<"\n ***Error: already chosen***\n"; goto p2_input;}     
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 5: 
                   if (c5=='-') 
                   c5='O'; 
                   else 
                   { cout<<"\n ***Error: already chosen***\n"; goto p2_input;}     
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 6: 
                   if (c6=='-') 
                   c6='O'; 
                   else 
                   { cout<<"\n ***Error: already chosen***\n"; goto p2_input;}     
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 7: 
                   if (c7=='-') 
                   c7='O'; 
                   else 
                   { cout<<"\n ***Error: already chosen***\n"; goto p2_input;}   
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 8: if (c8=='-') 
                   c8='O'; 
                   else 
                   { cout<<"\n ***Error: already chosen***\n"; goto p2_input;}     
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              case 9: if (c9=='-') 
                   c9='O'; 
                   else 
                   { cout<<"\n ***Error: already chosen***\n"; goto p2_input;}    
              checkResult(c1,c2,c3,c4,c5,c6,c7,c8,c9); break;

              default: cout<<"\n**********invalid input*********\n"; goto p2_input;

              }


}   //end of for loop. 9 tries over. result should be draw now if checkResult has not declared a winner yet
return 0;
    }




void checkResult (char c1 , char c2, char c3, char c4, char c5, char c6, char c7, char c8, char c9)
{    
 cout<<"\t"<<c1<<"\t"<<c2<<"\t"<<c3<<"\n\t"<<c4<<"\t"<<c5<<"\t"<<c6<<"\t\n\t"<<c7<<"\t"<<c8<<"\t"<<c9<<"\n";
if (             
              (c1=='X' && c2=='X' && c3=='X') ||
              (c4=='X' && c5=='X' && c6=='X') ||
              (c7=='X' && c8=='X' && c9=='X') ||
              (c1=='X' && c4=='X' && c7=='X') ||
              (c2=='X' && c5=='X' && c8=='X') ||
              (c3=='X' && c6=='X' && c9=='X') ||
              (c1=='X' && c5=='X' && c9=='X') ||
              (c3=='X' && c5=='X' && c7=='X')
    )
    { cout<<"\n PLAYER 1 Wins!!!"; getch(); exit(0); }              // the above 8 cases are when P1 wins; 3 vertical cases, 3 horizontal and 2 diagonal

    else
        if    (             
              (c1=='O' && c2=='O' && c3=='O') ||
              (c4=='O' && c5=='O' && c6=='O') ||
              (c7=='O' && c8=='O' && c9=='O') ||
              (c1=='O' && c4=='O' && c7=='O') ||
              (c2=='O' && c5=='O' && c8=='O') ||
              (c3=='O' && c6=='O' && c9=='O') ||
              (c1=='O' && c5=='O' && c9=='O') ||
              (c3=='O' && c5=='O' && c7=='O')
              )
              { cout<<"\n PLAYER 2 Wins!!!"; getch(); exit(0);}       // the above 8 cases are when P2 wins; 3 vertical cases, 3 horizontal and 2 diagonal

              else
                  if (c1!='-'&& c2!='-'&& c3!='-'&& c4!='-' && c5!='-' && c6!='-' && c7!='-' && c8!='-' && c9!='-')
                  { cout<<"\n Draw..."; getch(); exit(0);}              //over here the 3x3 matrix is full and none of the win cases exist for P1 and P2

}

Edited 3 Years Ago by pritaeas: Removed email

goto? really? Why not put the switch code into a function bool ValidInput(...) and then loop for each user's input until it is valid?

while (!ValidInput(...))
{
    cout<<"...make your move...";
    cin>>input;
}

You could then reuse one set of the switch code for each user input call. Though it is possible to do this with goto statements as well, I won't help you with that--very nasty stuff!:P

Edited 7 Years Ago by DdoubleD: additional &quot;goto&quot; comment

I know that an array matrix would have been better but Im taking a freshman course so coulnt use it.


1- Tic tac toe grid is defined from locations 1 to 9

2- For loop executes 9 times for 9 turns

3- A functions takes all 9 locations as argument to compute result after every turn

4- a switch() is used to assign X/O to the grid

5- every case in the switch first checks of location is already used or not- i really want this check to happen only once instead of in every case

6- Can I use just one swicth for both p1 and p2 ?

Yes, an array would be MUCH better, but if you're not supposed to use one, then you're not supposed to use one.

#2 - As you have it now, each trip through the for-loop has an X move and a Y move. The loop won't execute nine times. By the middle of the fifth trip through the loop, the program will have terminated with your function call.

#6 - You can definitely do a single switch case rather than two switch cases:

int playerNum;
char playerSymbol;

// decide whose turn it is.
if (playerNum == 1)
    playerSymbol = 'X';
else
    playerSymbol = 'Y';

cout<<"\nPlayer " << playerNum << " make your move. Choose locations 1 to 9 \n";
cin>>input;
switch (input)
{
    // same switch code, but don't hard-code 'X' or 'Y'.  Replace 'X' and 'Y' in code with playerSymbol.
}
int playerNum;
char playerSymbol;

// decide whose turn it is.
if (playerNum == 1)
    playerSymbol = 'X';
else
    playerSymbol = 'Y';

cout<<"\nPlayer " << playerNum << " make your move. Choose locations 1 to 9 \n";
cin>>input;
switch (input)
{
    // same switch code, but don't hard-code 'X' or 'Y'.  Replace 'X' and 'Y' in code with playerSymbol.
}

ELEGANT!!!!!!!!!!

int playerNum;
char playerSymbol;

// decide whose turn it is.
if (playerNum == 1)
    playerSymbol = 'X';
else
    playerSymbol = 'Y';

cout<<"\nPlayer " << playerNum << " make your move. Choose locations 1 to 9 \n";
cin>>input;
switch (input)
{
    // same switch code, but don't hard-code 'X' or 'Y'.  Replace 'X' and 'Y' in code with playerSymbol.
}

Modified to show how you can stop using goto statements:

bool ValidateMove (int location, char playerSymbol)
{
	switch (location)
	{
		// same switch code, but don't hard-code 'X' or 'Y'.  Replace 'X' and 'Y' in code with playerSymbol.

		// return false if invalid move and such, or true if valid
	}
}

void TicTacToe (void)
{

	int playerNum;
	char playerSymbol;
	bool done = false;
	int input;

	do
	{
		// decide whose turn it is.
		if (playerNum == 1)
			playerSymbol = 'X';
		else
			playerSymbol = 'Y';

		cout<<"\nPlayer " << playerNum << " make your move. Choose locations 1 to 9 \n";
		cin>>input;

		// TODO: use input to get sentinel to determine to exit

		// if valid, change players...otherwise, just loop and ask location again...
		if (ValidateMove(intput, playerSymbol))
		{
			// setup for next player
			if (1 == playerNum)
				playerNum = 2;
			else
				playerNum = 1;

			continue;
		}

		// TODO: if game is over, set done = true or just break

	} while (!done);
}
This question has already been answered. Start a new discussion instead.