2009-11-03 3 views
0

터미널/콘솔을 통해 재생되는 tic tac toe 프로그램을 작성 중입니다. 플레이어 1 또는 2가이긴 후에 사용자가 다시 재생할 수있는 선택권을 부여합니다. 1 = 다시 재생하십시오. , 2를 종료하십시오. 그러나, 2를 입력하면 나던 작업을 종료스위치 케이스를 사용하여 C++ 프로그램이 종료되지 않음

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

코드가 냄새를 가지고 이상한. 'player1'과'player2' 함수는 본질적으로 동일합니다 ... 그들을 합칠 방법을 찾으십시오. – mpen

+2

그래 ... 나는 그 진부함에 꽤 아파. 복제 된 코드를 통합하면 버그 및 코드 업데이트가 줄어들 것이라고 새로운 사람에게 설명 할 수 있습니다. 나는 항상 "냄새"라는 단어를 사용하는 "냄새"라고 생각합니다. –

+0

마찬가지로, 승리 조건을 확인하는 코드는 플레이어간에 복제됩니다. 플레이어 특정 코드를 플레이어 번호를 사용하는 함수로 이동시키는 간단한 리팩터링을 사용하면 훨씬 간단하고 유지 관리가 쉬워집니다. – ceo

답변

8

그것은 당신의 switch 문처럼 보이는 문자 리터럴 값 ('1'과 '2')가 아닌 하나의 INT 값과 2

+0

빠른 도움을 주신 덕분에 해결해 주셨습니다. – Raptrex

+2

좋은 프로그래밍 연습으로, 마법의 숫자 대신 상징적 인 상수를 사용해야합니다. –

+0

어느 부분이 기호 상수 여야합니까? 행 x 열에 사용하는 숫자 3? – Raptrex