tags:

views:

487

answers:

1

I'm writing a tic tac toe program that plays throuh the terminal/console After Player 1 or 2 wins, I give the choice for the user to play again, 1 = play again, 2 to quit. However, entering 2 to quit doesnt work

//tie check, replay, use pointer notation
#include <iostream>
using namespace std;

void initialize(char [][3]);
void player1(char [][3]);
void player2(char [][3]);
void display(char [][3]);
char check(char [3][3]);
int main()
{
    char board[3][3];
    char end = '*';
    int row1, column1, row2,column2;
    bool replay = true;
    //replay loop
    do
    {
     //set board to *
     initialize(board);
     //game loop
     display(board);
     do 
     {
      //player 1 turn
      player1(board);

      //check if player 1 won
      end = check(board); 
      if(end != '*')
      {
       int input;
       /* winner!*/
       cout << "Player 1 Won!\n";
       do
       {
        cout << "Play Again?\n1.Yes\n2.No\nEnter 1 or 2: ";
        cin >> input;
        if (input > 2 || input < 1)
         cout << "Invalid Option\n";

       }while(input > 2 || input < 1);

       switch (input)
       {
        case '1':
         replay = true;
         break;
        case '2':
         cout << "Thank you for playing.\n";
         exit(0);
         break;
       }
      }

      //player 2 turn
      player2(board);

      //check if player 2 won
      end = check(board);
      if (end == 'O')
      {
       int input;
       /* winner!*/
       cout << "Player 2 Won!\n";
       do
       {
        cout << "Play Again?\n1.Yes\n2.No\nEnter 1 or 2: ";
        cin >> input;
        if (input > 2 || input < 1)
         cout << "Invalid Option\n";
       }while(input > 2 || input < 1);

       switch (input)
       {
        case '1':
         replay = true;
         break;
        case '2':
         cout << "Thank you for playing.\n";
         exit(0);
         break;
       }
      }
     }while (end == '*');

    }while (replay == true);

    return 0;
}

void initialize(char array[][3])
{
    for (int i = 0;i < 3;i++)
    {
     for (int j = 0;j < 3;j++)
      array[i][j] = '*';
    }
    cout << "New Game\n";
}

void player1(char array[][3])
{
    int row1, column1;
    cout << "Player 1\nRow: ";
    cin >> row1;
    while (row1 < 0 || row1 > 2)
    {
     cout << "Enter a number between 0 and 2 for Row:: ";
     cin >> row1;
    }

    cout << "Column: ";
    cin >> column1;
    while (column1 < 0 || column1 > 2)
    {
     cout << "Enter a number between 0 and 2 for Column: ";
     cin >> column1;
    }

    if (array[row1][column1] == '*')
     array[row1][column1] = 'X';
    else
    {
     cout << "Space Occupied\n";
     player1(array);
    }
    display(array);
}

void player2(char array[][3])
{
    int row2,column2;
    cout << "Player 2\nRow: ";
    cin >> row2;
    while (row2 < 0 || row2 > 2)
    {
     cout << "Enter a number between 0 and 2 for Row: ";
     cin >> row2;
    }

    cout << "Column: ";
    cin >> column2;
    while (column2 < 0 || column2 > 2)
    {
     cout << "Enter a number between 0 and 2 for Column: ";
     cin >> column2;
    }

    if (array[row2][column2] == '*')
     array[row2][column2] = 'O';
    else
    {
     cout << "Space Occupied\n";
     player2(array);
    }
    display(array);
}
void display(char array[][3])
{
    for (int x = 0;x < 3;x++)
    {
     for (int y = 0;y < 3;y++)
      cout << array[x][y] << " ";
    cout << endl;
    }
}

char check(char array[3][3])
{
    int i;

    /* check rows */
    for(i=0; i<3; i++)
        if(array[i][0] == array[i][1] && array[i][0] == array[i][2]) 
      return array[i][0];

    /* check columns */
    for(i=0; i<3; i++)
        if(array[0][i] == array[1][i] && array[0][i] == array[2][i]) 
      return array[0][i];

    /* test diagonals */
    if(array[0][0] == array[1][1] && array[1][1] == array[2][2])
     return array[0][0];

    if(array[0][2] == array[1][1] && array[1][1] == array[2][0])
     return array[0][2];

  return '*';
}
+8  A: 

It looks like your switch statement has character literal values ('1' and '2') rather than int values of 1 and 2.

sean e
wow thanks for the quick helpthat solved it
Raptrex
As a good progamming practice, you should use symbolic constants instead of magic numbers.
Loadmaster
which part should be symbolic constants?the number 3 that I use for the row x column?
Raptrex