c++ bingo 게임 while문 종료가 왜 안되는지 모르겠어요

조회수 820회

5x5 그리드판에서 사용자가 (x,y) 위치를 입력하면 그 부분에 'O'가 생기게하고 빙고가 될시 종료하는 코드를 짜고싶습니다.

int check = 0;을 선언하고 while 문 코드안에서 checkBingo 함수로 빙고가 되었을 때 check1로 만들고 check1이 되면 루프가 멈추게하고 싶은데 안돼요.

//
int check = 0;

int checkBingo(char a[5][5], int check) {
    for(int i =0; i<5;i++)
        if (a[i][1] == 'O' and a[i][2] == 'O' and a[i][3] == 'O' and a[i][4] == 'O' and a[i][0] == 'O') {
            cout << "당신이 이겼습니다." << endl;
            check = 1;
        }
    for (int j = 0; j < 5; j++)
        if (a[0][j] == 'O' and a[1][j] == 'O' and a[2][j] == 'O' and a[3][j] == 'O' and a[4][j] == 'O') {
            cout << "당신이 이겼습니다." << endl;
            check = 1;
        }
    if (a[0][0] == 'O' and a[1][1] == 'O' and a[2][2] == 'O' and a[3][3] == 'O' and a[4][4] == 'O') {
        cout << "당신이 이겼습니다." << endl;
        check = 1;
    }
    if (a[0][4] == 'O' and a[1][3] == 'O' and a[2][2] == 'O' and a[3][1] == 'O' and a[4][0] == 'O') {
        cout << "당신이 이겼습니다." << endl;
        check = 1;
    }
    return 0;

}

int main()
{
    char a[5][5] = {' '};
    cout << "---------------------";
    cout << endl;

    while (true) {
        print(a);
        checkBingo(a, check);
        if (check == 1)
            break;
        int x;
        int y;
        cout << "input : ";
        cin >> x >> y;

        a[x][y] = 'O';
        system("cls");
        cout << check;
    }
}

1 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    작성하신 코드를 보면 check의 값을 checkBingo 함수 안에서 변경하고 있는데요,

    이렇게 하면 check의 값이 변경되는 것은 checkBingo 함수 내에서만이고, 함수 밖으로 나오면 원래 가지고 있던 0 값을 그대로 가지고 있게 됩니다.

    그보다는 빙고가 완성되었을 때 checkBingo 함수의 반환값을 1로 하고, 그 값을 main 함수의 check에 저장하는 방식으로 하시면 될 듯 합니다.

    당장 문제를 해결할 수 있는 방법을 알려드리긴 했지만, 조금 더 고민해보시면 더 깔끔하게 작성하실 수 있으실거예요.


    약간 설명이 부족해서 오해의 소지가 있을 것 같아 덧붙입니다.

    제가 함수 내에서 전역변수를 수정하는 것이 불가능한 것처럼 설명을 했는데 그건 아니예요.

    check를 전역변수로 선언했기 때문에 사실은 위 함수에서 값을 변경하면 다른 함수에서도 이를 호출했을 때 바뀐 값이 출력되는 것이 맞습니다.

    그런데 작성하신 코드를 실행했을 때 값이 변경되지 않는 것은 check를 함수의 매개변수로 받았기 때문입니다.

    즉, checkBingo 함수의 scope 내에서 check라는 변수는 전역변수가 아니라 매개변수로 받은 값을 의미합니다.

    따라서 checkBingo 함수에서 값을 변경하더라도 해당 함수 밖으로 빠져나오면 여전히 기존에 전역변수로 선언한 값을 유지하게 되는 것입니다.

    따라서 매개변수로 전달하는 check를 삭제하면 의도하신 대로 코드가 실행될거예요.

    편하신 방법을 선택하시면 되겠지만, 공부하실 때에는 다양한 방식으로 다 구현해 보는 것이 좋을 듯 싶네요.

    • 감사합니다 hyj 2020.5.27 15:23

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)