tags:

views:

171

answers:

2

So I am trying to program a way to replay a tic tac toe game after someone wins, loses, or ties. So basically my attempt to get replay to work, doesnt work. If player 1 won and I type 1 to replay, it would ask player 2 for their input A basic outline of my code looks like this:

do  
{    
  set entire 2d array to '*'  
  do  
  {  
    player 1 input  
    does game tie?  
    does player 1 win  
    player 2 input  
    does game tie?  
    does player 2 win      
  }while no one wins     
}while replay = 1

heres my code

//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 checkWin(int);
int tie(int);
int askReplay();
int main()
{
char board[3][3];
char end = '*';
int row1, column1, row2,column2;
int replay = 0;
int turns = 0;
//replay loop
do
{
 //set board to *
 initialize(board);
 display(board);
 do 
 {
  //player 1 turn
  player1(board);
  turns++;
  display(board);

  //if turns = 9 then tie
  replay = tie(turns);
  //check if player 1 won
  end = check(board); 
  replay = checkWin(end);

  //player 2 turn
  player2(board);
  turns++;
  display(board);

  //if turns = 9 then tie
  replay = tie(turns);
  //check if player 2 won
  end = check(board);
  replay = checkWin(end);

 }while (end == '*');

}while (replay == 1);

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);
}
}

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);
}
}
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])
{
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 '*';
}

int checkWin(int over)
{
if (over == '*')
 return 0;
if (over == 'X')
 cout << "Player 1 Won!\n";
else if (over == 'O')
 cout << "Player 2 Won!\n";

//ask if they want to play again
int answer;
answer = askReplay();

switch (answer)
{
 case 1:
  return 1;
  break;
 case 2:
  cout << "Thank you for playing.\n";
  exit(0);
  break;
}
}

int tie(int count)
{
if (count == 9)
{
 int answer;
 cout << "Tie game";

 answer = askReplay();

 switch (answer)
 {
  case 1:
   return 1;
   break;
  case 2:
   cout << "Thank you for playing.\n";
   exit(0);
   break;
 }
}
}
int askReplay()
{
int input;
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);

return input;
}
+2  A: 

It sounds like you're having troubles with your main loop.

I'd suggest making a variable that controls which player is running and just toggle that.

do  
{    
  set entire 2d array to '*'  
  current player = 0
  do  
  {  
    (current player + 1) input  
    does game tie?  
    does (current player + 1) win

    current player = (current player + 1) % 2  
  }while no one wins     
}while replay = 1

See if that gets you further along.

Epsilon Prime
+1. This will simplify the code significantly. It also makes sense to merge the `player1` and `player` functions (adding an argument to indicate which player is moving).
Brian
A: 

You may want to look up the Memento Design Pattern.

wentbackward
@wentbackward: This is way overkill for the OP's purposes. The OP isn't even defining classes to store game state.
Brian
I guess I read replay to mean replay the entire game step by step (as in instant-replay). I guess the OP meant replay to play again. I think you'll find the question was edited after my response.
wentbackward