본문 바로가기
Programming/C, C++

C++ 빙고 게임 만들기

by Dev_카페인 2022. 12. 8.
반응형

[C/C++] 빙고 게임 만들기

빙고 규칙

1. N * N 개의 2차원 형태의 빙고판을 만든다.

2. 빙고판 안에 1 ~ M 사이의 숫자를 중복없이 랜덤으로 배치한다.

3. 빙고판을 화면에 출력한다.

4. 숫자를 입력 받아 빙고 결과와 일치한다면 빙고판에 있는 숫자를 공개한다.

5. 빙고의 개수가 5개 이상이면 클리어

6. 빙고는 가로, 세로, 대각선을 포함한다.

 

// 빙고게임

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

typedef unsigned int uint;

#define BINGO_SIZE 5
#define MAX_BINGO_COUNT 5
#define MAX_ATTEMP_COUNT 25
#define MIN_LIMIT_NUBER 1
#define MAX_LIMIT_NUBER 25

int GetRandomRange(const int& minRange, const int& maxRange);
void SetNumber(int arr[]);
void Shuffle(int arr[]);
void SetBingo(int targetArr[][BINGO_SIZE], int shuffleArr[]);
int UserInputNumber();
bool CheckNumber(const int number, int computerArr[][BINGO_SIZE], int resultArr[][BINGO_SIZE]);
int CheckBingo(int resultArr[][BINGO_SIZE]);
void DrawStatus(int inputNum, int atmpCnt, int bingoCnt, bool isAnswer);
void DrawBingo(int arr[][BINGO_SIZE]);

int main()
{
	srand((uint)time(0));

	int computerBingo[BINGO_SIZE][BINGO_SIZE] = {};	// 셔플된 배열 순차적으로 입력
	int shuffleBingo[MAX_LIMIT_NUBER] = {};		// 배열에 1 ~ 최대숫자까지 넣고 섞음
	int resultBingo[BINGO_SIZE][BINGO_SIZE] = {};	// 0으로 초기화하고 맞추면 숫자 넣음

	int inputNumber = 0;	// 입력 숫자
	int attempCount = 0;	// 시도 숫자
	int bingoCount = 0;		// 빙고 개수
	bool isAnswer = false;	// 빙고안에 숫자가 있는지 체크

	SetNumber(shuffleBingo);	// 셔플 숫자 넣기
	Shuffle(shuffleBingo);		// 넣은 숫자 섞기
	SetBingo(computerBingo, shuffleBingo);	// 인덱스 순차적으로 넣기


	while (true)
	{
		DrawStatus(inputNumber, attempCount++, bingoCount, isAnswer);	//현황
		DrawBingo(resultBingo);	// 빙고 그리기
		inputNumber = UserInputNumber();	// 입력
		isAnswer = CheckNumber(inputNumber, computerBingo, resultBingo);// 빙고안에 숫자 있는지 체크
		system("cls");
		if (isAnswer)
		{
			bingoCount = CheckBingo(resultBingo);	// 빙고개수 다시세기
		}

		if (MAX_BINGO_COUNT <= bingoCount) break;
		if (attempCount == MAX_ATTEMP_COUNT) break;
	}

	printf("끝!");

}

// 랜덤 숫자 뽑기
int GetRandomRange(const int& minRange, const int& maxRange)
{
	//int randomNumber = rand() % (maxRange - minRange + 1) + minRange;
	int randomNumber = rand() % maxRange;
	return randomNumber;
}

// 숫자 셋팅
void SetNumber(int arr[])
{
	for (int i = 0; i < MAX_LIMIT_NUBER; i++)
	{
		arr[i] = i + 1;
	}
}
// 숫자 섞기
void Shuffle(int arr[])
{
	// 중복없이 섞기
	int randomIndex;
	int temp;
	for (int i = 0; i < MAX_LIMIT_NUBER; i++)
	{
		randomIndex = GetRandomRange(MIN_LIMIT_NUBER, MAX_LIMIT_NUBER);
		temp = arr[i];
		arr[i] = arr[randomIndex];
		arr[randomIndex] = temp;
	}
}

// 빙고 채우기
void SetBingo(int targetArr[][BINGO_SIZE], int shuffleArr[])
{
	for (int i = 0; i < BINGO_SIZE; i++)
	{
		for (int j = 0; j < BINGO_SIZE; j++)
		{
			targetArr[i][j] = shuffleArr[i * BINGO_SIZE + j];
		}
	}
}

// 숫자 입력
int UserInputNumber()
{
	int inputNumber;
	while (true)
	{
		printf("숫자를입력해주세요 : ");
		scanf_s("%d", &inputNumber);
		if (inputNumber < MIN_LIMIT_NUBER || inputNumber > MAX_LIMIT_NUBER)
			printf("입력 범위 %d ~ %d \n", MIN_LIMIT_NUBER, MAX_LIMIT_NUBER);
		else
			break;
	}
	return inputNumber;
}

// 해당 빙고에 숫자가 있는지 확인
bool CheckNumber(const int number, int computerArr[][BINGO_SIZE], int resultArr[][BINGO_SIZE])
{
	for (int i = 0; i < BINGO_SIZE; i++)
	{
		for (int j = 0; j < BINGO_SIZE; j++)
		{
			if (number == computerArr[i][j])
			{
				resultArr[i][j] = computerArr[i][j];
				return true;
			}
		}
	}
	return false;
}

// 빙고 검사
int CheckBingo(int resultArr[][BINGO_SIZE])
{
	int bingo = 0;

	int bingoCount[2][BINGO_SIZE] = {};
	int crossCount[2] = {};

	for (int i = 0; i < BINGO_SIZE; i++)
	{
		for (int j = 0; j < BINGO_SIZE; j++)
		{
			if (resultArr[i][j] != 0)
			{
				bingoCount[0][i]++;	// 가로 카운트
				bingoCount[1][j]++;	// 세로 카운트

				if (i == j)
				{
					crossCount[0]++;
				}
				if (BINGO_SIZE - i - 1 == j)
				{
					crossCount[1]++;
				}
			}
		}
	}

	for (int i = 0; i < BINGO_SIZE; i++)
	{
		if (bingoCount[0][i] == BINGO_SIZE) bingo++;
		if (bingoCount[1][i] == BINGO_SIZE) bingo++;
	}
	if (crossCount[0] == BINGO_SIZE) bingo++;
	if (crossCount[1] == BINGO_SIZE) bingo++;

	return bingo;
}

// 상태창 출력
void DrawStatus(int inputNum, int atmpCnt, int bingoCnt, bool isAnswer)
{
	if (inputNum != 0) 
	{
		printf("입력한 숫자 : %d, 시도 횟수 : %d / %d, BINGO 개수 : %d \n", inputNum, atmpCnt, MAX_ATTEMP_COUNT, bingoCnt);
		printf("%d, %s \n", inputNum, isAnswer ? "정답" : "땡");
	}
}

// 현재 빙고 
void DrawBingo(int arr[][BINGO_SIZE])
{
	for (int i = 0; i < BINGO_SIZE; i++)
	{
		printf("----------------\n");
		for (int j = 0; j < BINGO_SIZE; j++)
		{
			printf("|");
			printf("%.2d", arr[i][j]);
		}
		printf("|\n");
	}
	printf("----------------\n");
}

반응형

'Programming > C, C++' 카테고리의 다른 글

C++ 다차원 배열  (0) 2022.12.08
C++ 슬라이딩 퍼즐 구현  (0) 2022.12.08
C++ 숫자 야구게임 만들기  (0) 2022.12.07
C++ 지역변수, 전역변수, 정적변수  (0) 2022.12.07
C++ 배열의 여러가지 사용 방법  (0) 2022.12.07