C++/C++입문

[C++] 빙고 게임_2

나는야 개발자 2025. 3. 26. 06:48
반응형

필수사항

- 빙고 게임_1

 

[C++] 빙고 게임_1

5,5 빙고판 만들기 srand((unsigned int)time(0));int iArray[25] = {};//1~25까지의 숫자를 넣는다.for (int i = 0; i  결과 입력부분 추가cout > iInput;//종료if (iInput == 0){ break;}//1~25 사이의 숫자가 아닌 경우else if (iIn

lhy-info.tistory.com

 

빙고를 위한 변수 추가

//섞기
int iTemp, idx1, idx2;
for (int i = 0; i < 100; ++i)
{
	idx1 = rand() % 25;
	idx2 = rand() % 25;
	iTemp = iArray[idx1];
	iArray[idx1] = iArray[idx2];
	iArray[idx2] = iTemp;
}

//빙고 확인을 위한 변수 추가
int iBingo = 0;

while (true)
{
	system("cls");

	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			if (iArray[i * 5 + j] == INT_MAX)
			{
				cout << "*\t";
			}
			else
			{
				cout << iArray[i * 5 + j] << "\t";
			}
		}
		cout << endl;
	}

	//빙고 갯수 체크
	cout << "Bingo Line : " << iBingo << endl;
    
    //빙고 줄 수가 2개일 때 종료 처리
	if (iBingo >= 2)
	{
		break;
	}

	cout << "숫자를 입력하세요(0 : 종료) : ";
	int iInput;
	cin >> iInput;
...기존 생략

 

- 빙고 확인을 위핸 iBingo 변수 추가

- 빙고 라인 갯수와 2개 라인일 때 종료 if문 추가

 

가로,세로 빙고

...기존 생략

//bAcc가 true일 경우 중복된 숫자를 입력해서 숫자*로 만들지 못했으므로
//다시 입력받기 위해 continue를 한다.
if (bAcc)
{
	continue;
}

//빙고 수 를 체크하는 것은 매번 숫자를 입력할때마다 처음부터 새로 카운트를 할 것이다
//그러므로 iBingo를 0으로 초기화 한다.
iBingo = 0;

//가로, 세로 줄 수를 구해준다
int iStar1 = 0, iStar2 = 0;
for (int i = 0; i < 5; i++)
{
	//한줄 체크하기 전 먼저 0으로 초기화
	iStar1 = iStar2 = 0;
	for (int j = 0; j < 5; j++)
	{
		//가로 별 갯수 구해준다
		if (iArray[i * 5 + j] == INT_MAX)
		{
			++iStar1;
		}
		//세로 별 개수	구해준다
		if (iArray[j * 5 + i] == INT_MAX)
		{
			++iStar2;
		}
	}

	//j for문이 끝났을 때 iStar1이 5라면 가로 한줄이 모두 *이라는 의미
	if (iStar1 == 5)
	{
		++iBingo;
	}
	if (iStar2 == 5)
	{
		++iBingo;
	}
}

- 이중 for문을 이용해 각각 한줄씩 INT_MAX인지를 체크하여 INT_MAX라면 별로 지정

- 지정한 iStar들이 5개라면 빙고추가

 

- 한줄했을때 Bingo Line : 1 로 되는 것 확인

 

대각선 체크

- 가로, 세로만 INT_MAX인지 체크 해주었기 때문에 대각선으로 했을땐 Bingo Line이 증가하지 않음

 

코드추가

...기존 생략
			if (iStar2 == 5)
			{
				++iBingo;
			}
		}
        
        //ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
		//왼쪽 상단 -> 오른쪽 하단 대각선 체크
		//대각선으로 6씩 증가
		iStar1 = 0;
		for (int i = 0; i < 25; i += 6)
		{
			if (iArray[i] == INT_MAX)
			{
				++iStar1;
			}
		}
		if (iStar1 == 5)
		{
			++iBingo;
		}

		//오른쪽 상단 -> 왼쪽 하단 대각선 체크
		//대각선으로 4씩 증가
		iStar1 = 0;
		for (int i = 4; i <= 20; i += 4)
		{
			if (iArray[i] == INT_MAX)
			{
				++iStar1;
			}
		}
		if (iStar1 == 5)
		{
			++iBingo;
		}
	}

	return 0;
}

- 가로, 세로를 확인하는 for문을 빠져나온 후 새로운 for문을 추가

- 왼쪽 상단 -> 오른쪽 상단은 6씩 증가하기 때문에 i += 6으로 진행

- 오른쪽 상단 -> 왼쪽 상단은 4씩 증가하기 때문에 i += 4로 진행

 

결과

 

 

최종코드

#include <iostream>

using namespace std;

int main()
{
	srand((unsigned int)time(0));
	int iArray[25] = {};

	//1~25까지의 숫자를 넣는다.
	for (int i = 0; i < 25; ++i)
	{
		iArray[i] = i + 1;
	}

	//섞기
	int iTemp, idx1, idx2;
	for (int i = 0; i < 100; ++i)
	{
		idx1 = rand() % 25;
		idx2 = rand() % 25;
		iTemp = iArray[idx1];
		iArray[idx1] = iArray[idx2];
		iArray[idx2] = iTemp;
	}

	int iBingo = 0;

	while (true)
	{
		system("cls");

		for (int i = 0; i < 5; i++)
		{
			for (int j = 0; j < 5; j++)
			{
				if (iArray[i * 5 + j] == INT_MAX)
				{
					cout << "*\t";
				}
				else
				{
					cout << iArray[i * 5 + j] << "\t";
				}
			}
			cout << endl;
		}

		cout << "Bingo Line : " << iBingo << endl;
		if (iBingo >= 2)
		{
			break;
		}



		cout << "숫자를 입력하세요(0 : 종료) : ";
		int iInput;
		cin >> iInput;

		//종료
		if (iInput == 0)
		{
			break;
		}
		//1~25 사이의 숫자가 아닌 경우
		else if (iInput < 1 || iInput > 25)
		{
			cout << "잘못된 숫자입니다." << endl;
			continue;
		}

		//중복 입력 체크하기 위한 변수
		bool bAcc = true;

		//모든 숫자를 차례대로 검사해 입력한 숫자와 같은 숫자가 있는지 찾아낸다
		for (int i = 0; i < 25; i++)
		{
			//같은 숫자가 있을 경우 
			if (iInput == iArray[i])
			{
				//숫자를 찾았을 경우 중복된 숫자가 아니므로 
				//bAcc를 false로 만든다
				bAcc = false;

				//숫자를 *로 만들기 위해 특수한 값인 INT_MAX로 변경
				iArray[i] = INT_MAX;

				//더이상 다른 숫자를 찾아볼 필요가 없으므로 for문을 빠져나간다.
				break;
			}
		}

		//bAcc가 true일 경우 중복된 숫자를 입력해서 숫자*로 만들지 못했으므로
		//다시 입력받기 위해 continue를 한다.
		if (bAcc)
		{
			continue;
		}

		//빙고 수 를 체크하는 것은 매번 숫자를 입력할때마다 처음부터 새로 카운트를 할 것이다
		//그러므로 iBingo를 0으로 초기화 한다.
		iBingo = 0;

		//가로, 세로 줄 수를 구해준다
		int iStar1 = 0, iStar2 = 0;
		for (int i = 0; i < 5; i++)
		{
			//한줄 체크하기 전 먼저 0으로 초기화
			iStar1 = iStar2 = 0;
			for (int j = 0; j < 5; j++)
			{
				//가로 별 갯수 구해준다
				if (iArray[i * 5 + j] == INT_MAX)
				{
					++iStar1;
				}
				//세로 별 개수	구해준다
				if (iArray[j * 5 + i] == INT_MAX)
				{
					++iStar2;
				}
			}

			//j for문이 끝났을 때 iStar1이 5라면 가로 한줄이 모두 *이라는 의미
			if (iStar1 == 5)
			{
				++iBingo;
			}
			if (iStar2 == 5)
			{
				++iBingo;
			}
		}
		//왼쪽 상단 -> 오른쪽 하단 대각선 체크
		//대각선으로 6씩 증가
		iStar1 = 0;
		for (int i = 0; i < 25; i += 6)
		{
			if (iArray[i] == INT_MAX)
			{
				++iStar1;
			}
		}
		if (iStar1 == 5)
		{
			++iBingo;
		}

		//오른쪽 상단 -> 왼쪽 하단 대각선 체크
		//대각선으로 4씩 증가
		iStar1 = 0;
		for (int i = 4; i <= 20; i += 4)
		{
			if (iArray[i] == INT_MAX)
			{
				++iStar1;
			}
		}
		if (iStar1 == 5)
		{
			++iBingo;
		}
	}

	return 0;
}
반응형

'C++ > C++입문' 카테고리의 다른 글

[C++] 빙고 게임 하드모드  (0) 2025.03.27
[C++] 빙고 게임_3  (0) 2025.03.26
[C++] 빙고 게임_1  (0) 2025.03.25
[C++] 로또 만들기  (0) 2025.03.25
[C++] 배열  (0) 2025.03.25