2017-11-28 1 views
2

이 코드는 Tic Tac Toe의 게임입니다. 게임이 끝난 후 프로그램은 사용자에게 다시 재생할지 여부를 묻는 메시지를 표시하고 예인 경우 다시 실행됩니다. 그러나 배열 값은 전역 적으로 선언되었으므로 업데이트 된 상태로 유지됩니다. 배열은 여러 함수에서 사용됨에 따라 전역 적으로 선언되어야합니다. 사용자가 다시 재생할 옵션을 선택할 때 배열 값을 원래 값으로 다시 설정하는 방법이 있습니까?C++에서 프로그램 다시 시작

#include <iostream> 
    #include <string> 
    using namespace std; 


    void contents(); //function to draw the tic tac toe board 
    char letters[9] = {'a','b','c','d','e','f','g','h','i'}; //array containing 
    the default characters of the board 
    string check(); //function to check whether the game is ongoing or has ended 
    in a win or draw 
    string result; // string telling us whether the game is ongoing or has ended 
    in a win or draw 





    void contents() 
    { 

    cout <<endl<<endl<<endl<<" Tic Tac Toe"<<endl<<endl<<endl; 


    cout << endl; 

    cout << "  |  |  " << endl; 
    cout << " " << letters[0] << " | " << letters[1] << " | " << letters[2] 
    << endl; 

    cout << "  |  |  " << endl; 
    cout << "----- ----- -----" << endl; 
    cout << "  |  |  " << endl; 

    cout << " " << letters[3] << " | " << letters[4] << " | " << letters[5] 
    << endl; 

    cout << "  |  |  " << endl; 
    cout << "----- ----- -----" << endl; 
    cout << "  |  |  " << endl; 

    cout << " " << letters[6] << " | " << letters[7] << " | " << letters[8] 
    << endl; 

    cout << "  |  |  " << endl << endl; 
    } 




    int main() 
    { 
    char selection1; //selection of the mark chosen by player 1 (X or O) 
    int player = 1; 
    char mark;//X or O 
    char selection2; //selection of the character to replace in the array chosen 
    by the players 
    char invalid; //character to enter if the user selects a character that 
    isn't present in the array 
    string choice; 



    while(selection1!='X' || selection1!='Y') 
    { 
    cout<<"Make your selection player 1 (X or O): "; 
    cin>>selection1; 
    if (selection1=='X' || selection1=='O') 
     break; 
     else 
     cout<<"Make a valid selection, press enter to select again"<<endl; 
     cin.ignore(); 
     cin.get(); 
    } 

    do 
    { 
    player=(player%2)?1:2; 

    if(selection1 =='X') 
    mark = (player == 1) ? 'X' : 'O'; 

    else if (selection1=='O') 
    mark = (player == 1) ? 'O' : 'X'; 


     contents(); 


     cout << "Player " << player << ", enter a letter: "; 
     cin >> selection2; 


     if (selection2 == 'a' && letters[0] == 'a') 

      letters[0] = mark; 
     else if (selection2 == 'b' && letters[1] == 'b') 

      letters[1] = mark; 
     else if (selection2 == 'c' && letters[2] == 'c') 

      letters[2] = mark; 
     else if (selection2 == 'd' && letters[3] == 'd') 

      letters[3] = mark; 
     else if (selection2 == 'e' && letters[4] == 'e') 

      letters[4] = mark; 
     else if (selection2 == 'f' && letters[5] == 'f') 

      letters[5] = mark; 
     else if (selection2 == 'g' && letters[6] == 'g') 

      letters[6] = mark; 
     else if (selection2 == 'h' && letters[7] == 'h') 

      letters[7] = mark; 
     else if (selection2 == 'i' && letters[8] == 'i') 

      letters[8] = mark; 
     else 
     { 
      cout<<"Invalid move, press enter to continue: "; 
      cin.ignore(); 
      cin.get(); 
      player--; 


     } 
     result=check(); 

     player++; 
    }while(result=="Ongoing"); 
    contents(); 
    if(result=="Over") 
{ 

     cout<<"Player "<<--player<<" wins "; 
     cin.ignore(); 
     cin.get(); 
     cout<<"Do you want to play again?"; 
     cin>>choice; 
     if (choice =="Yes") 
     main(); 

} 
    else 
    { 

     cout<<"Draw"; 
     cin.ignore(); 
     cin.get(); 
     cout<<"Do you want to play again?"; 
     cin>>choice; 
     if (choice =="Yes") 
     main(); 

    } 


    return 0; 
} 


string check() 
{ 
    if (letters[0] == letters[1] && letters[1] == letters[2]) 

    return "Over"; 


    else if (letters[3] == letters[4] && letters[4] == letters[5]) 

    return "Over"; 


    else if (letters[6] == letters[7] && letters[7] == letters[8]) 

    return "Over"; 


    else if (letters[0] == letters[3] && letters[3] == letters[6]) 

    return "Over"; 


    else if (letters[1] == letters[4] && letters[4] == letters[7]) 

    return "Over"; 


    else if (letters[2] == letters[5] && letters[5] == letters[8]) 

    return "Over"; 


    else if (letters[0] == letters[4] && letters[4] == letters[8]) 

    return "Over"; 


    else if (letters[2] == letters[4] && letters[4] == letters[6]) 

    return "Over"; 



    else if (letters[0] != 'a' && letters[1] != 'b' && letters[2] != 'c' 
      && letters[3] != 'd' && letters[4] != 'e' && letters[5] != 'f' 
      && letters[6] != 'g' && letters[7] != 'h' && letters[8] != 'i') 

     return "Draw"; 


    else 

    return "Ongoing"; 
} 
+3

게임을 함수로 만들고 기능을 true로 만듭니다. –

+7

전역 변수를 사용할 때의 함정에 오신 것을 환영합니다. 사용법을 배워 보는 것이 가장 좋습니다. – UKMonkey

+9

'main'을 호출하지 마세요. – stark

답변

2

확실한 방법은 당신은 아마 나중에 클래스에 대해 배우게됩니다 새로운 즉 정확하게 당신이 원하는 것을 기능 등 'a'

letters[0] 설정을 작성하는 것입니다. 클래스는 여러 함수와 여러 데이터 멤버를 보유합니다. 이러한 클래스의 각 인스턴스는 객체라고하며 게임의 각 라운드를 새 객체로 구현합니다.

0

항상 프로그램을 다시 시작하기 위해 main 함수를 참조 할 필요는 없습니다. 어떤 일을하는지에 따라 struct를 사용하여 다시 시작하는 프로그램을 작성할 수 있습니다. 나는 다른 사람들이있을 것이라고 확신하지만 이유는 무엇인지 여기에 있습니다.

#include <iostream> 
    using namespace std; 
    int main() { 
    struct X { 

      static void A(){ 
     cout << "This is how you restart using struct" << endl; 
     cout << ":D" << endl; 
    cout << ":D" << endl; 
int a; 
cout << "Type 1 to restart" << endl; 
cin >> a; 
if (a == 1){ 
X::B(); 
     } 
    }; 
    static void B(){ 
int A = 1; 
if (A = 1){ 
X::A(); 
    } 
    }; 
    }; 
    int Q = 1; 
    if (Q == 1){ 
    X::A(); 
    } 
    return 0; 
    } 
관련 문제