c++ bingo 게임 while문 종료가 왜 안되는지 모르겠어요
조회수 820회
5x5 그리드판에서 사용자가 (x,y) 위치를 입력하면 그 부분에 'O'
가 생기게하고 빙고가 될시 종료하는 코드를 짜고싶습니다.
int check = 0;
을 선언하고
while
문 코드안에서 checkBingo
함수로 빙고가 되었을 때 check
를 1
로 만들고 check
가 1
이 되면 루프가 멈추게하고 싶은데 안돼요.
//
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 답변
-
작성하신 코드를 보면
check
의 값을checkBingo
함수 안에서 변경하고 있는데요,이렇게 하면
check
의 값이 변경되는 것은checkBingo
함수 내에서만이고, 함수 밖으로 나오면 원래 가지고 있던 0 값을 그대로 가지고 있게 됩니다.그보다는 빙고가 완성되었을 때
checkBingo
함수의 반환값을 1로 하고, 그 값을 main 함수의check
에 저장하는 방식으로 하시면 될 듯 합니다.당장 문제를 해결할 수 있는 방법을 알려드리긴 했지만, 조금 더 고민해보시면 더 깔끔하게 작성하실 수 있으실거예요.
약간 설명이 부족해서 오해의 소지가 있을 것 같아 덧붙입니다.
제가 함수 내에서 전역변수를 수정하는 것이 불가능한 것처럼 설명을 했는데 그건 아니예요.
check
를 전역변수로 선언했기 때문에 사실은 위 함수에서 값을 변경하면 다른 함수에서도 이를 호출했을 때 바뀐 값이 출력되는 것이 맞습니다.그런데 작성하신 코드를 실행했을 때 값이 변경되지 않는 것은
check
를 함수의 매개변수로 받았기 때문입니다.즉,
checkBingo
함수의 scope 내에서check
라는 변수는 전역변수가 아니라 매개변수로 받은 값을 의미합니다.따라서
checkBingo
함수에서 값을 변경하더라도 해당 함수 밖으로 빠져나오면 여전히 기존에 전역변수로 선언한 값을 유지하게 되는 것입니다.따라서 매개변수로 전달하는 check를 삭제하면 의도하신 대로 코드가 실행될거예요.
편하신 방법을 선택하시면 되겠지만, 공부하실 때에는 다양한 방식으로 다 구현해 보는 것이 좋을 듯 싶네요.
댓글 입력