Print Friendly and PDF

C++/C++입문

[C++] 빙고 게임_3

나는야 개발자 2025. 3. 26. 07:27
반응형

필수사항

- 빙고게임_2

 

[C++] 빙고 게임_2

필수사항- 빙고 게임_1 iInput;//종료if (iInput == 0){ break;}//1~25 사이의 숫자가 아닌 경우else if (iIn" data-og-host="lhy-info.tistory.com" data-og-source-url="https://lhy-info.tistory.com/entry/C-%EB%B9%99%EA%B3%A0-%EA%B2%8C%EC%9E%841"

lhy-info.tistory.com

 

Easy Mode AI와 대전해보기

enum AI_MODE
{
	AM_EASY = 1,
	AM_HARD
};

- 난이도용 enum 추가

 

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

	//1~25까지의 숫자를 넣는다.
	for (int i = 0; i < 25; ++i)
	{
		iArray[i] = i + 1;
		iAIArray[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;

		//AI 숫자도 섞어준다.
		idx1 = rand() % 25;
		idx2 = rand() % 25;
		iTemp = iAIArray[idx1];
		iAIArray[idx1] = iAIArray[idx2];
		iAIArray[idx2] = iTemp;
	}
    
 ...생략

- AI용 int iAIArray[25] = {}; 를 추가 후 Player와 동일하게 초기화 

 

모드 선택

	int iBingo = 0, iAIBingo = 0;
	int iAIMode = 0;

	while (true)
	{
		cout << "1. Easy" << endl;
		cout << "2. Hard" << endl;
		cout << "AI 난이도를 선택하세요 : ";
		cin >> iAIMode;

		if (iAIMode >= AM_EASY && iAIMode <= AM_HARD)
		{
			break;
		}
	}
 ...생략

- 입력을 통해 모드 선택 추가

 

AI가 숫자를 선택할 수 있도록 *이 아닌 목록을 모아두는 배열 추가

...생략
        if (iAIMode >= AM_EASY && iAIMode <= AM_HARD)
		{
			break;
		}
	}

	//선택안된 목록 배열을 만들어준다
	int iNoneSelect[25] = {};
	int iNoneSelCnt = 0;


	while (true)
	{
		system("cls");
...생략

 

AI빙고판 추가 및 승리조건 추가

...생략
while (true)
{
	system("cls");

	//숫자를 5x5로 출력한다.
	cout << "================== Player ==================" << endl;

	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 << endl;

	cout << "================== AI ==================" << endl;
	cout << "AI 난이도 : ";
	switch (iAIMode)
	{
	case AM_EASY:
		cout << "Easy" << endl;
		break;
	case AM_HARD:
		cout << "Hard" << endl;
		break;
	}
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			if (iAIArray[i * 5 + j] == INT_MAX)
			{
				cout << "*\t";
			}
			else
			{
				cout << iAIArray[i * 5 + j] << "\t";
			}
		}
		cout << endl;
	}

	cout << "AI Bingo Line : " << iBingo << endl << endl;


	//줄수가 2이상일 경우 빙고라인을 체크한다.
	if (iBingo >= 2)
	{
		cout << "Player 승리" << endl;
		break;
	}
	else if (iAIBingo >= 2)
	{
		cout << "AI 승리" << endl;
		break;
	}

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

- Player와 AI용 빙고판 추가

- AI또한 Bingo가 2이상일 경우 승리하도록 추가

 

Player가 입력한 숫자 AI 빙고판에서도 *로 변경

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

//중복이 아니라면 AI도 숫자를 하나 선택해서 *로 만든다.
for (int i = 0; i < 25; i++)
{
	if (iAIArray[i] == iInput)
	{
		iAIArray[i] = INT_MAX;
		break;
	}
}

 

 

AI 숫자 선택

...생략
    if (iAIArray[i] == iInput)
	{
		iAIArray[i] = INT_MAX;
		break;
	}
}

//AI가 선택할 수 있는 목록에서 숫자를 선택한다.
switch (iAIMode)
{
	/*
	AI Easy 모드
	- 랜덤으로 숫자를 뽑아서 *로 만든다.
	*/
case AM_EASY:
	//선택 안된 숫자 개수는 목록을 만들때 카운트한다.
	iNoneSelCnt = 0;

	//선택 안된 숫자 목록 만들어준다
	for (int i = 0; i < 25; ++i)
	{
		//현재 숫자가 *이 아닐 경우
		if (iAIArray[i] != INT_MAX)
		{
			//*이 아닌 숫자일 경우 iNoneSelect를 인덱스로 활용
			//선택 안된 목록에 추가
			iNoneSelect[iNoneSelCnt] = iAIArray[i];
			++iNoneSelCnt;
		}
	}

	//for문을 빠져 나오게 되면 선택안된 목록이 만들어지고
	//선택안된 목록의 개수가 만들어진다.
	//그러므로 0~iNoneSelCnt-1까지의 숫자를 랜덤으로 뽑아서
	//그 숫자를 *로 만들어주면 된다.
	iInput = iNoneSelect[rand() % iNoneSelCnt];
	break;
case AM_HARD:
	break;
}

//AI가 선택한 숫자를 AI배열과 플레이어에서 *로 만들어준다.
for (int i = 0; i < 25; i++)
{
	if (iInput == iArray[i])
	{
		iArray[i] = INT_MAX;
		break;
	}
}
for (int i = 0; i < 25; i++)
{
	if (iInput == iAIArray[i])
	{
		iAIArray[i] = INT_MAX;
		break;
	}
}
...생략

- 선택되지 않은 숫자들 중 하나를 랜덤으로 골라 선택

- AI가 선택한 숫자를 Player와 AI 둘다 별로 만들어준다

 

AI 빙고처리

...생략
                iAIArray[i] = INT_MAX;
				break;
			}
		}

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

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

				//가로 별 갯수 구해준다
				if (iAIArray[i * 5 + j] == INT_MAX)
				{
					++iAIStar1;
				}
				//세로 별 개수	구해준다
				if (iAIArray[j * 5 + i] == INT_MAX)
				{
					++iAIStar2;
				}
			}

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

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

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

	return 0;
}

- Player와 동일하게 AI또한 가로,세로, 대각선 을 파악하여 빙고 개수 적립

 

결과

- 내가 선택한 숫자와 AI가 선택한 숫자가 하나씩 없어짐

 

최종코드

#include <iostream>

using namespace std;


enum AI_MODE
{
	AM_EASY = 1,
	AM_HARD
};

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

	//1~25까지의 숫자를 넣는다.
	for (int i = 0; i < 25; ++i)
	{
		iArray[i] = i + 1;
		iAIArray[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;

		//AI 숫자도 섞어준다.
		idx1 = rand() % 25;
		idx2 = rand() % 25;
		iTemp = iAIArray[idx1];
		iAIArray[idx1] = iAIArray[idx2];
		iAIArray[idx2] = iTemp;
	}

	int iBingo = 0, iAIBingo = 0;
	int iAIMode = 0;

	while (true)
	{
		cout << "1. Easy" << endl;
		cout << "2. Hard" << endl;
		cout << "AI 난이도를 선택하세요 : ";
		cin >> iAIMode;

		if (iAIMode >= AM_EASY && iAIMode <= AM_HARD)
		{
			break;
		}
	}

	//선택안된 목록 배열을 만들어준다
	int iNoneSelect[25] = {};
	int iNoneSelCnt = 0;


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

		//숫자를 5x5로 출력한다.
		cout << "================== Player ==================" << endl;

		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 << endl;

		cout << "================== AI ==================" << endl;
		cout << "AI 난이도 : ";
		switch (iAIMode)
		{
		case AM_EASY:
			cout << "Easy" << endl;
			break;
		case AM_HARD:
			cout << "Hard" << endl;
			break;
		}
		for (int i = 0; i < 5; i++)
		{
			for (int j = 0; j < 5; j++)
			{
				if (iAIArray[i * 5 + j] == INT_MAX)
				{
					cout << "*\t";
				}
				else
				{
					cout << iAIArray[i * 5 + j] << "\t";
				}
			}
			cout << endl;
		}

		cout << "AI Bingo Line : " << iBingo << endl << endl;


		//줄수가 2이상일 경우 빙고라인을 체크한다.
		if (iBingo >= 2)
		{
			cout << "Player 승리" << endl;
			break;
		}
		else if (iAIBingo >= 2)
		{
			cout << "AI 승리" << endl;
			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;
		}

		//중복이 아니라면 AI도 숫자를 하나 선택해서 *로 만든다.
		for (int i = 0; i < 25; i++)
		{
			if (iAIArray[i] == iInput)
			{
				iAIArray[i] = INT_MAX;
				break;
			}
		}

		//AI가 선택할 수 있는 목록에서 숫자를 선택한다.
		switch (iAIMode)
		{
			/*
			AI Easy 모드
			- 랜덤으로 숫자를 뽑아서 *로 만든다.
			*/
		case AM_EASY:
			//선택 안된 숫자 개수는 목록을 만들때 카운트한다.
			iNoneSelCnt = 0;

			//선택 안된 숫자 목록 만들어준다
			for (int i = 0; i < 25; ++i)
			{
				//현재 숫자가 *이 아닐 경우
				if (iAIArray[i] != INT_MAX)
				{
					//*이 아닌 숫자일 경우 iNoneSelect를 인덱스로 활용
					//선택 안된 목록에 추가
					iNoneSelect[iNoneSelCnt] = iAIArray[i];
					++iNoneSelCnt;
				}
			}

			//for문을 빠져 나오게 되면 선택안된 목록이 만들어지고
			//선택안된 목록의 개수가 만들어진다.
			//그러므로 0~iNoneSelCnt-1까지의 숫자를 랜덤으로 뽑아서
			//그 숫자를 *로 만들어주면 된다.
			iInput = iNoneSelect[rand() % iNoneSelCnt];
			break;
		case AM_HARD:
			break;
		}

		//AI가 선택한 숫자를 AI배열과 플레이어에서 *로 만들어준다.
		for (int i = 0; i < 25; i++)
		{
			if (iInput == iArray[i])
			{
				iArray[i] = INT_MAX;
				break;
			}
		}
		for (int i = 0; i < 25; i++)
		{
			if (iInput == iAIArray[i])
			{
				iAIArray[i] = INT_MAX;
				break;
			}
		}

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

		//가로, 세로 줄 수를 구해준다
		int iStar1 = 0, iStar2 = 0;
		int iAIStar1 = 0, iAIStar2 = 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;
				}

				//가로 별 갯수 구해준다
				if (iAIArray[i * 5 + j] == INT_MAX)
				{
					++iAIStar1;
				}
				//세로 별 개수	구해준다
				if (iAIArray[j * 5 + i] == INT_MAX)
				{
					++iAIStar2;
				}
			}

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

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

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

	return 0;
}
반응형

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

[C++] 구조체와 문자열  (0) 2025.03.28
[C++] 빙고 게임 하드모드  (0) 2025.03.27
[C++] 빙고 게임_2  (0) 2025.03.26
[C++] 빙고 게임_1  (0) 2025.03.25
[C++] 로또 만들기  (0) 2025.03.25