2009-11-08 13 views
-1

그래서 누군가가이기거나, 잃거나, 동점이 된 후에 tic tac toe 게임을 재생하는 방법을 프로그램하려고합니다. 기본적으로 리플레이를 작동시키려는 시도는 작동하지 않습니다. 플레이어 1이 승리하고 I를 1로 입력하면 플레이어 2에게 입력을 요청합니다.재생 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

+0

질문이 없으면 대답 할 수 없습니다. 죄송합니다. – Matias

+0

나의 리플레이가 작동하지 않습니다. 플레이어 1이 플레이를하고 1을 타이핑하면 플레이어 2에게 자신의 입력을 묻습니다. – Raptrex

답변

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

0

Memento 디자인 패턴을 검색 할 수 있습니다.

+0

이것은 OP의 목적을위한 과잉 공격입니다. OP는 게임 상태를 저장하는 클래스도 정의하지 않습니다. – Brian

+1

나는 (인스턴트 리플레이에서와 같이) 단계별로 전체 게임을 재생하는 것을 의미하는 리플레이를 읽은 것 같다. OP는 다시 재생할 수있는 재생을 의미 한 것 같습니다. 내 질문에 답을 얻은 후에 편집 된 질문을 발견 할 것입니다. – wentbackward