2009-11-08 76 views
-1

因此,我试图编程一种方式来重播一个tic tac脚趾游戏后,有人赢,失去或关系。 所以基本上我试图让重播工作,没有工作。如果玩家1赢了,我输入1重放,它会向玩家2请求输入。Replay tic tac toe游戏

伪轮廓:

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 

我的实际代码:

//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

这是不危险的,你有一个问题的形式你的'问题'的短语;-) – mjv 2009-11-08 02:41:07

+0

如果没有任何问题,我不能回答。抱歉。 – Matias 2009-11-08 02:46:02

+0

我的回放不起作用,如果玩家1赢了,我输入1重播,它会要求玩家2输入 – Raptrex 2009-11-08 02:56:08

回答

2

这听起来像你遇到与你的主循环的烦恼。

我会建议做一个变量来控制哪个播放器正在运行,然后切换。

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 

看看是否让你更进一步。

+0

+1。这将显着简化代码。合并'player1'和'player'函数(添加一个参数来指示哪个播放器正在移动)也是有意义的。 – Brian 2010-06-29 20:03:59

0

您可能需要查看Memento设计模式。

+0

这对于OP的目的来说是过度的。 OP甚至没有定义类来存储游戏状态。 – Brian 2010-06-29 20:01:32

+1

我想我读重播是指一步一步重播整个游戏(如即时重播)。我猜测OP意味着重新播放。我想你会发现这个问题是在我的回应后编辑的。 – wentbackward 2010-07-02 01:19:57