[포스코x코딩온] 스마트팩토리 3주차 회고 | C++ 야구게임

이남웅·2023년 4월 9일
0

규칙 1. 컴퓨터가 1 ~ 9 범위의 3개의 중복되지 않는 난수를 생성한다.
규칙 2. 사용자에게 1 ~ 9 범위의 3개의 숫자를 입력을 받고, 만약 이외의 숫자를 입력받으면 프로그램을 종료한다.
규칙 3. 입력받은 수가 자리수가 맞으면 strike, 자리수가 맞지 않으면 ball
규칙 4. 3 strike가 될 경우 도전한 횟수를 출력하고 프로그램을 종료한다.

#include <iostream>
using namespace std;

int chk_num_dup(int num, int num_arr[3])
{
    for (int i = 0; i < 3; i++)
        if (num == num_arr[i])
            return (1);
    return (0);
}

int main(void)
{
    srand(time(NULL));
    int i = 0;
    int rand_num = 0, stk_num = 0, bal_num = 0, count = 0;
    int hum_num_arr[3] = {};
    int com_num_arr[3] = {};

    for (i = 0; i < 3; i++)
    {
        do
            rand_num = rand() % 9 + 1;
        while (chk_num_dup(rand_num, com_num_arr));
        com_num_arr[i] = rand_num;
    }

    cout << "야구 게임" << endl;
    while (stk_num != 3)
    {
        stk_num = 0, bal_num = 0, count++;
        cout << endl << "1 ~ 9 사이의 숫자 3개를 입력 하시오 (이외의 숫자: 종료)" << endl;
        for (int i = 0; i < 3; i++)
        {
            cin >> hum_num_arr[i];
            if (hum_num_arr[i] < 1 || hum_num_arr[i] > 9)
            {
                cout << "게임을 종료하였습니다.";
                return (0);
            }
        }
        for (i = 0; i < 3; i++)
        {
            if (hum_num_arr[i] == com_num_arr[i])
                stk_num++;
            else if (chk_num_dup(hum_num_arr[i], com_num_arr))
                bal_num++;
        }
        cout << "Strike : " << stk_num << "      Ball : " << bal_num << endl;
    }
    cout << endl << count << "번 만에 맞췄습니다.";

    return (0);
}

규칙 하나하나씩 프로그래밍을 해보자.

규칙 1. 컴퓨터가 1 ~ 9 범위의 3개의 중복되지 않는 난수를 생성한다.

이번 규칙은 이전에 작성했던 난수 생성과 비슷하다.

int chk_num_dup(int num, int num_arr[3])
{
    for (int i = 0; i < 3; i++)
        if (num == num_arr[i])
            return (1);
    return (0);
}

for (i = 0; i < 3; i++)
{
	do
		rand_num = rand() % 9 + 1;
	while (chk_num_dup(rand_num, com_num_arr));
	com_num_arr[i] = rand_num;
}

do while을 통해 숫자 중복 검사 함수(chk_num_dup)의 조건식을 걸어 반복해준다. 함수에서 숫자 중복이 나오게 되면 조건식이 1이기 때문에 계속해서 반복한다. 만약 중복되지 않는 숫자가 나오게 되면 조건식이 0이 되고 while을 빠져나오게 된다. 반복문에서 빠져나오면 중복되지 않는 난수를 벡터에 대입해준다.

규칙 2. 사용자에게 1 ~ 9 범위의 3개의 숫자를 입력을 받고, 만약 이외의 숫자를 입력받으면 프로그램을 종료한다.

cout << endl << "1 ~ 9 사이의 숫자 3개를 입력 하시오 (이외의 숫자: 종료)" << endl;
for (int i = 0; i < 3; i++)
{
	cin >> hum_num_arr[i];
	if (hum_num_arr[i] < 1 || hum_num_arr[i] > 9)
	{
		cout << "게임을 종료하였습니다.";
		return (0);
	}
}

사용자에게 3개의 숫자를 입력받기 위해 3번 반복해주는 반복문을 만들어준다. 만약 입력받는 숫자가 1 ~ 9범위의 숫자가 아니라면 return(0)를 해주어 프로그램을 종료시켜준다.

규칙 3. 입력받은 수가 자리수가 맞으면 strike, 자리수가 맞지 않으면 ball

for (i = 0; i < 3; i++)
{
	if (hum_num_arr[i] == com_num_arr[i])
		stk_num++;
	else if (chk_num_dup(hum_num_arr[i], com_num_arr))
		bal_num++;
}

이번에도 3번 반복해주는 반복문을 만들어 strike를 계산해준다. 사용자가 입력한 벡터의 인덱스와 컴퓨터가 생성한 난수 벡터의 인덱스를 비교해준다. 여기서 만약 strike가 아니라면 ball인 경우가 있을 수 있으므로 else if를 통해 숫자 중복 검사 함수를 통해 중복된 숫자가 있을 경우 bal_num을 증가시켜준다.

규칙 4. 3 strike가 될 경우 도전한 횟수를 출력하고 프로그램을 종료한다.

while (stk_num != 3)
{
	cout << "Strike : " << stk_num << "      Ball : " << bal_num << endl;
}
cout << endl << count << "번 만에 맞췄습니다.";

위의 코드를 모두 반복문에 넣어 만약 strike가 3일 경우 반복이 종료되게 하고 마지막으로 맞춘 횟수를 출력해준다.

문제를 보고 프로그래밍을 하려고 하면 어떤 것부터 해야할지 막막한 경우가 많다. 이 글에서 작성한 것처럼 하나하나씩 문제를 접근해가며 해결해나가다 보면 코드가 차차 완성되는 것을 볼 수 있다. 코드를 완성한 후 예외처리와 테스트를 처리하는 것은 필수이다. 예를 정수형을 입력받는 상황일 때 문자형을 입력하게 되면 ASCII 코드값의 정수형으로 입력이 되어 while문이 0이 아닌 경우 조건이 충족되어 무한반복되는 경우가 있다. 이런 경우 조건식에 입력범위를 지정하여 이외의 숫자는 break문을 통해 while문을 빠져나오게 하는 등 조치를 해주어야 한다.

4주차부터는 C++의 진도가 끝나, 데이터베이스를 진행하게 된다. 이후에 작성되는 글은 데이터베이스로 아마 작성될 것 같지만 데이터베이스에 C++를 조합하여 사용한다고 하니 C++의 공부도 소훌히 하면 안될 것 같다.

0개의 댓글