2009-11-08 19 views
-1

Alors j'essaie de programmer un moyen de rejouer un jeu de tic tac toe après que quelqu'un gagne, perd ou lie. Donc, fondamentalement, ma tentative d'obtenir replay au travail, ne fonctionne pas. Si le joueur 1 a gagné et que je tape 1 pour rejouer, il demandera le joueur 2 pour sa contribution.Rejouer tic tac toe game

contour pseudocode:

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 

Mon code actuel:

//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; 
    case 2: 
     cout << "Thank you for playing.\n"; 
     exit(0); 
    } 
} 

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

     answer = askReplay(); 

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

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; 
} 
+3

Ce n'est pas un problème, vous avez une phrase votre 'question' sous la forme d'une question ;-) – mjv

+0

Je ne peux pas répondre s'il n'y a pas de question. Pardon. – Matias

+0

Mon replay ne marche pas, Si le joueur 1 a gagné et que je tape 1 pour rejouer, il demandera au joueur 2 pour son entrée – Raptrex

Répondre

2

On dirait que vous avez des problèmes avec votre boucle principale.

Je suggère de faire une variable qui contrôle quel joueur est en cours d'exécution et de simplement basculer cela.

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 

Voir si cela vous permet d'aller plus loin.

+0

+1. Cela va simplifier le code de manière significative. Il est également logique de fusionner les fonctions 'player1' et' player' (en ajoutant un argument pour indiquer quel joueur est en mouvement). – Brian

0

Vous pouvez rechercher le motif de conception Memento.

+0

C'est beaucoup trop pour les objectifs du PO. L'OP ne définit même pas les classes pour stocker l'état du jeu. – Brian

+1

Je suppose que j'ai lu rejouer à rejouer l'ensemble du jeu étape par étape (comme dans la relecture instantanée). Je suppose que l'OP signifiait rejouer pour rejouer. Je pense que vous trouverez la question a été édité après ma réponse. – wentbackward