본문 바로가기

C 언어/연습문제

C언어 연습문제36

[문제]

야구 게임을 컴퓨터와 할 수 있도록 프로그램을 작성해보자.

게임의 방식은 다음과 같다.
컴퓨터는 0에서 9사이의 숫자 중에서 서로 다른 세 개의 숫자를 고르고, 사용자는 이것을 맞춰야 한다. 중요한 것은 숫자의 순서까지 정확히 맞춰야 한다는 것이다. 단 사용자가 예상한 숫자를 입력할 때마다 컴퓨터는 입력된 숫자와 컴퓨터 자신이 생각한 숫자가 얼마나 비슷한지를 알려줘야 한다.
예를 들어서 컴퓨터가 고른 숫자가 1 4 9이고, 사용자가 입력한 숫자가 4 0 9이면, 두 개의 숫자 4와 9가 일치한다. 9는 숫자와 위치까지 일치하지만(1 strike), 4는 숫자만 일치한다(1 ball).
이런 경우 컴퓨터는 다음과 같은 메시지를 출력해 준다.

1strike, 1ball

만약에 사용자가 1 4 9를 입력하였다면 "3strike, 0ball"이 되어서 프로그램은 종료가 된다. 이때 몇 번 만에 3 strike를 얻어냈는지에 대해서도 출력해 주기로 하자. 또한 진행하면서 "몇 번째 도전입니다."라는 메시지도 출력해보자.

 

[실행결과]

Game Start!
3개의 숫자 입력: 1 2 3
1번째 도전 결과: 0strike, 2ball!

3개의 숫자 입력: 1 1 2
잘못된 입력, 재입력: 2 3 1
2번째 도전 결과: 2strike, 0ball!

3개의 숫자 입력: 2 3 5
3번째 도전 결과: 3strike, 0ball!

Game Over!

 

[코드]

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void ComSel(int* arr); // 컴퓨터가 서로 다른 3개의 숫자를 선택
int IsValid(int* arr); // 사용자 입력 유효성 검사, 유효하면 1 리턴
void UsrSel(int* arr); // 사용자가 3개의 숫자를 입력
int Compare(int* arr1, int* arr2); // 선택 결과 비교

int main(void)
{
	int Com_arr[3];
	int Usr_arr[3];
	int result = 0;

	printf("Game Start! \n");
	ComSel(Com_arr);

	while (result != 1)
	{
		UsrSel(Usr_arr);
		result = Compare(Com_arr, Usr_arr);
		printf("\n");
	}

	printf("Game Over! \n");
	return 0;
}

void ComSel(int* arr)
{
	srand((unsigned int)time(NULL));

	arr[0] = rand() % 10; // 선택 1

	do
	{
		arr[1] = rand() % 10;
	} while (arr[0] == arr[1]); // 선택 2

	do
	{
		arr[2] = rand() % 10;
	} while ((arr[0] == arr[2]) || (arr[1] == arr[2])); // 선택 3
}

int IsValid(int* arr)
{
	if ((arr[0] == arr[1]) || (arr[0] == arr[2]) || (arr[1] == arr[2]))
		return 0;
	else
		return 1;
}

void UsrSel(int* arr)
{
	int valid;

	printf("3개의 숫자 입력: ");
	while (1)
	{
		scanf_s("%d %d %d", &arr[0], &arr[1], &arr[2]);
		valid = IsValid(arr);
		if (valid == 1)
			break;
		else
			printf("잘못된 입력, 재입력: ");

	}
}

int Compare(int* arr1, int* arr2)
{
	int i, j;
	int ball = 0, strike = 0;
	static int cnt = 0;

	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			if (arr1[i] == arr2[j])
			{
				i == j ? strike++ : ball++;
				break;
			}
		}
	}
	cnt++;
	printf("%d번째 도전 결과: %dstrike, %dball!\n", cnt, strike, ball);

	if (strike == 3)
		return 1;
	else
		return 0;
}

 

<참고>

윤성우의 열혈 C 프로그래밍

 

'C 언어 > 연습문제' 카테고리의 다른 글

C언어 연습문제38  (0) 2022.04.01
C언어 연습문제37  (0) 2022.04.01
C언어 연습문제35  (0) 2022.03.31
C언어 연습문제34  (0) 2022.03.31
C언어 연습문제33  (0) 2022.03.31