이 게임을 처음 만들 때는 FOR문을 2번 사용을 해서 만들었었다. 또한 배열을 사용했었다.
#include<iostream>
#include<ctime>
#include<vector>
using namespace std;
// 배스킨라빈스 31 게임
int main()
{
std::srand(time(NULL));
int BR31[31] = {};
int num = 0, count = 0;
int com = std::rand() % 3 + 1;
bool is_dup = false;
for (int i = 0; i < 31; i++)
{
BR31[i] = i + 1;
}
while (count < 32)
{
cout << "개수를 입력하세요. : ";
cin >> num;
if (num < 4 && num > 0 && is_dup == false)
{
cout << "사용자가 부른 숫자!! \n";
for (int j = 0; j < num; j++)
{
cout << BR31[count + j] << endl;
if (BR31[count + j] == 31)
{
cout << "게임 종료!! 컴퓨터의 승리입니다. \n";
break;
}
}
count = num + count;
is_dup = true;
}
else
{
cout << "1 ~ 3의 숫자를 입력해주세요. \n";
}
if (is_dup == true)
{
cout << "컴퓨터가 부른 숫자!! \n";
for (int j = 0; j < com; j++)
{
cout << BR31[count + j] << endl;
if (BR31[count + j] == 31)
{
cout << "게임 종료!! 사용자의 승리입니다. \n";
break;
}
}
count = com + count;
is_dup = false;
}
}
return 0;
}
이런식으로 사용자가 입력한 숫자, 컴퓨터가 입력한 숫자를 따로따로 FOR문을 동작하게 했다.
하지만 선생님께서 FOR문을 한번만 사용해도 되며, 배열을 쓸 필요가 없다고 피드백을 해주셨다.
생각해낸 방법은 BOOL 변수를 설정하여 사용자와 컴퓨터가 입력할 때마다 체크할 수 있도록 했다. 배열은 그냥 삭제했다.
즉, 사용자가 입력한 숫자도 NUM, 컴퓨터가 입력한 숫자도 NUM에 저장하지만 BOOL 변수를 통해 구분이 가능하도록 한 것이다.
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
// 배스킨라빈스 31 게임
int main()
{
int num = 0, count = 1;
bool turn = false;
while (count < 32)
{
if (turn == true)
{
std::srand(time(NULL));
int com = std::rand() % 3 + 1;
cout << "컴퓨터가 부른 숫자!! \n";
num = com;
turn = false;
}
else
{
cout << "개수를 입력하세요. : ";
cin >> num;
if (num > 3 || num < 1)
{
cout << "1 ~ 3의 숫자를 입력해주세요. \n";
num = 0;
}
else
{
cout << "사용자가 부른 숫자!! \n";
turn = true;
}
}
for (int i = 0; i < num; i++)
{
cout << count + i << endl;
}
count += num;
}
turn == true ? cout << "게임 종료!! 컴퓨터의 승리입니다. \n" : cout << "게임 종료!! 사용자의 승리입니다. \n";
return 0;
}
그 결과 이처럼 FOR문을 한번만 동작하도록 할 수 있었다.
배열을 사용하지 않는 것은 간단하였으나, FOR문을 하나만 사용하는 방법을 생각하는 것이 조금 오래 걸렸다.
그러나 막상 생각해내니 너무나 간단했다.
마지막으로 승리 판결을 삼항연산자를 사용하여 코드를 더 짧게 만들 수 있었다.