신입 개발자 공부 과정

C++로 빙고 게임 만들기 본문

C++/공부

C++로 빙고 게임 만들기

Lewisjkim 2022. 3. 20. 21:02

빙고게임을 만들기 위해서~
-번호를 랜덤으로 만들어주고
-0을 눌르면 게임 종료 표시
-번호를 출력해주고
-입력을 하게 해주고
-입력과 번화가 동일할 시에 *표시
-아니면 다시 입력
-숫자가 0~25까지가 아닌 숫자가 들어갔을 경우 다시 입력
-빙고 줄 체크(가로, 세로, 대가선(왼오, 오왼)

Output: 

게임 시작 화면

게임 종료 화면

//코드 확인:

더보기
#include <iostream>
#include <time.h>
using namespace std;

int main()
{
	srand((unsigned int)time(0));//양의 수로 시간기능을 이용해서 랜덤하게 출력한다
	int Random = rand();//변수 Random을 랜덤하게 정의

	int Number[25] = {};//Number 배열을 정의하고 25개의 입력칸에 0을 입력한다.
	
	for (int i = 0; i < 25; i++)
	{
		Number[i] = i + 1; //Number 배열에 1 부터 25까지 수를 차례대로 우선 입력
	}
	
	for (int i = 0; i < 100; i++)
	{
		int Idx1 = rand() % 25;//인덱스1을 25 까지의 랜덤 인덱스를 얻어오고
		int Idx2 = rand() % 25;

		int Temp = Number[Idx1];//인덱스 셔플
		Number[Idx1] = Number[Idx2];
		Number[Idx2] = Temp;
	}


	int Line = 0;//빙고 줄




	//---------------------------------------------------------
	while (true)//게임에서 반복해서 *을 표시해 주어야 되기 때문
	{
		system("cls");//화면 지워주기 

		for (int i = 0; i < 5; i++)
		{
			for (int j = 0; j < 5; j++)
			{
				if (Number[i * 5 + j] == INT_MAX)//만약 빙고 숫자가 INT_MAX값이 면 *로 출력해라
				{
					cout << "*\t";
				}
				else
					cout << Number[i * 5 + j] << "\t";//세로=i * 가로 개수 5 + 가로=j 로 출력
			}
			cout << endl;//5개마다 줄 띄워주기
		}

		cout << "Bingo: " << Line << endl;
		if (Line >= 5)//빙고 라인이 5개가 되면 
		{
			cout << "Player Win" << endl;//승리 표시
			break;//게임 종료
		}
		cout << "Input Number(0: Exit): ";//0을 입력하면 게임이 종료 될거라고 출력
		
		int CheckNumber = 0;//입력할 변수를 정의하고
		cin >> CheckNumber;//입력을 받게 해준다

		if (CheckNumber == 0)//만약 입력 받은 숫자가 0이라면
			break;//while문을 벗어나게 된다 = 곧, 게임이 끝나게 된다.
 		
		else if (CheckNumber < 1 || CheckNumber > 25)//빙고 게임은 0부터 25의 숫자 범위 안의 수이기에
			continue;								 //입력 받는 값이 0보다 작거나 25보다 크면 안된다
													 //고로 입력 받은 값이 0보다 작거나 25보다 크면 
													 //다시 실행해라.
		bool Check = false;//실행 안되게 false라 하고(조건이 성납하지 않으면 바뀌지 않게 하려고)
		for (int i = 0; i < 25; i++)
		{
			if (Number[i] == CheckNumber)//입력한 값이 배열 값하고 같다면
			{
				Number[i] = INT_MAX;
				Check = true;//(CheckNumber가 맞다면 실행되게 true라고 바꿔준다)
				break;//해당 값을 INT_MAX로 바꾸어 표시해 준다
					  //INT_MAX를 *로 바꾸어주기 위해
			}
			//이미 입력한 숫자를 다시 입력하지 못하게 반복시킨다
			if (!Check)
				continue;
		}

		Line = 0;
		for (int i = 0; i < 5; i++)
		{
			int CheckCount = 0, CheckCount2 = 0;//빙고 가로 줄 카운트 하는 변수
			for (int j = 0; j < 5; j++)
			{
				if (Number[i * 5 + j] == INT_MAX)//*하나씩 CheckCount 가로 줄 체크
					++CheckCount;
				if (Number[j * 5 + i] == INT_MAX)//*세로 줄
					++CheckCount2;
			}

			if (CheckCount == 5)//CheckCount가 5개면
				++Line;//빙고 가로 줄 1개 ++
			if (CheckCount2 == 5)//CheckCount가 5개면
				++Line;//빙고 가로 줄 1개 ++  
		}
		//
		int CheckCount3 = 0;//대각선 줄 체크 왼위->오아래
		for (int i = 0; i < 25; i += 6)
		{
			if(Number[i] == INT_MAX)
				CheckCount3++;
		}
		if (CheckCount3 == 5)//CheckCount가 5개면
			++Line;//빙고 가로 줄 1개 ++  
		//
		int CheckCount4 = 0;//대각선 줄 체크 오위->왼아래
		for (int i = 4; i <= 20; i += 4)
		{
			if (Number[i] == INT_MAX)
				++CheckCount4;
		}
		if (CheckCount4 == 5)//CheckCount가 5개면
			++Line;//빙고 가로 줄 1개 ++  
	}
	

	return 0;
}

AI랑 플레이 하는 빙고(easy mode)

코드 확인:

더보기
#include <iostream>
#include <time.h>

using namespace std;
//*****************
//*****************
//빙고 게임 with AI
//****************
//****************
enum class AIType
{
	None,
	Easy,
	Hard,
	Max
};
int main()
{
	srand((unsigned int)time(0));//양의 수로 시간기능을 이용해서 랜덤하게 출력한다
	int Random = rand();//변수 Random을 랜덤하게 정의

	int AIState = 0;//*************난이도 변수

	while (true)
	{
		system("cls");
		cout << "1.Easy Mode" << endl;
		cout << "2.Hard Mode" << endl;
		cout << "Choose the Game Mode: ";
		cin >> AIState;
		
		//AI 모드 숫자가 1~2가 나오면 break
		if (AIState > (int)AIType::None &&
			AIState < (int)AIType::Max)
			break;
	}

	int Number[25] = {};//Number 배열을 정의하고 25개의 입력칸에 0을 입력한다.
	int AINumber[25] = {};//**********AI 배열 만들어주고
	for (int i = 0; i < 25; i++)
	{
		Number[i] = i + 1; //Number 배열에 1 부터 25까지 수를 차례대로 우선 입력
		AINumber[i] = i + 1;//***********
	}

	for (int i = 0; i < 100; i++)
	{
		int Idx1 = rand() % 25;//인덱스1을 25 까지의 랜덤 인덱스를 얻어오고
		int Idx2 = rand() % 25;

		int Temp = Number[Idx1];//인덱스 셔플
		Number[Idx1] = Number[Idx2];
		Number[Idx2] = Temp;

		Idx1 = rand() % 25;//***************
		Idx2 = rand() % 25;

		Temp = AINumber[Idx1];//***************
		AINumber[Idx1] = AINumber[Idx2];
		AINumber[Idx2] = Temp;
	}


	int Line = 0;//빙고 줄
	int AILine = 0;//**************

	//***************인공지능이 선택하기 위해 선택되지 않은(*로 안바뀐) 값을 저장 할 배열 만들기
	int SelectArray[25] = {};
	int SelectCount = 0;//***************선택할 수 있는 숫자가 몇개인지를 저장할 변수


	//---------------------------------------------------------
	while (true)//게임에서 반복해서 *을 표시해 주어야 되기 때문
	{
		system("cls");//화면 지워주기 
		cout << "=========================Player=======================================AI===================" << endl;
		//빙고판 만들기
		for (int i = 0; i < 5; i++)
		{
			for (int j = 0; j < 5; j++)
			{
				if (Number[i * 5 + j] == INT_MAX)//만약 빙고 숫자가 INT_MAX값이 면 *로 출력해라
				{
					cout << "*\t";
				}
				else
					cout << Number[i * 5 + j] << "\t";//세로=i * 가로 개수 5 + 가로=j 로 출력
			}
			cout << "\t||\t";
			//AI 빙고판
			for (int j = 0; j < 5; j++)
			{
				cout << "*\t";//빙고판 안보이게 하기
				//if (AINumber[i * 5 + j] == INT_MAX)//만약 빙고 숫자가 INT_MAX값이 면 *로 출력해라
				//{
				//	cout << "*\t";
				//}
				//else
				//	cout << AINumber[i * 5 + j] << "\t";//세로=i * 가로 개수 5 + 가로=j 로 출력
			}
			cout << endl;//5개마다 줄 띄워주기
		}

		

		//빙고 수 확인 출력
		cout << "Bingo: " << Line<<"\t\t\t\t\t\t"<<"Bingo: "<<AILine << endl;
		if (Line >= 5)//빙고 라인이 5개가 되면 
		{
			cout << "Player Win" << endl;//승리 표시
			break;//게임 종료
		}
		else if (AILine >= 5)//***********************
		{
			cout << "AI Win" << endl;//*************패배 표시
			break;
		}
		else if (AILine >= 5 && Line >= 5)
			cout << "Draw" << endl;//***********무승부

		//종료하려면
		cout << "Input Number(0: Exit): ";//0을 입력하면 게임이 종료 될거라고 출력

		//입력받기
		int CheckNumber = 0;//입력할 변수를 정의하고
		cin >> CheckNumber;//입력을 받게 해준다

		if (CheckNumber == 0)//만약 입력 받은 숫자가 0이라면
			break;//while문을 벗어나게 된다 = 곧, 게임이 끝나게 된다.

		else if (CheckNumber < 1 || CheckNumber > 25)//빙고 게임은 0부터 25의 숫자 범위 안의 수이기에
			continue;								 //입력 받는 값이 0보다 작거나 25보다 크면 안된다
													 //고로 입력 받은 값이 0보다 작거나 25보다 크면 
													 //다시 실행해라.
		bool Check = false;//실행 안되게 false라 하고(조건이 성납하지 않으면 바뀌지 않게 하려고)
		
						   
						   
		//맞춘 숫자 *로 바꾸기
		for (int i = 0; i < 25; i++)
		{
			if (Number[i] == CheckNumber)//입력한 값이 배열 값하고 같다면
			{
				Number[i] = INT_MAX;
				Check = true;//(CheckNumber가 맞다면 실행되게 true라고 바꿔준다)
				break;//해당 값을 INT_MAX로 바꾸어 표시해 준다
					  //INT_MAX를 *로 바꾸어주기 위해
			}
			//이미 입력한 숫자를 다시 입력하지 못하게 반복시킨다
			if (!Check)
				continue;
		}
		//****************AI 숫자 *로 바꾸기
		for (int i = 0; i < 25; ++i) 
		{
			if (AINumber[i] == CheckNumber)
			{ 
				AINumber[i] = INT_MAX;
				break;
			}
		}
		//****************위에서 플레이어가 선택했으니
		//****************AI차례를 만들어준다
		switch ((AIType)AIState)
		{
		case AIType::Easy:
			//입력안된 값을 찾아서 배열에 넣어준다.
			SelectCount = 0;

			for (int i = 0; i < 25; i++)
			{
				if (AINumber[i] != INT_MAX)//AI 빙고판에 * 표시가 없다면
				{
					SelectArray[SelectCount] = AINumber[i];
					++SelectCount;
				}
			}

			CheckNumber = SelectArray[rand() % SelectCount];
			break;
		case AIType::Hard:
			break;
		default:
			break; 
		}
		//***************
		cout << "AI Select: " << CheckNumber << endl;
		/*system("pause");*/
		//*****************AI가 선택한 숫자도 *로 바꾸어준다.
		for (int i = 0; i < 25; i++)
		{
			if (Number[i] == CheckNumber)
			{
				Number[i] = INT_MAX;
				break;
			}
		}
		for (int i = 0; i < 25; i++)
		{
			if (AINumber[i] == CheckNumber)
			{
				AINumber[i] = INT_MAX;
				break;
			}
		}

		//빙고 라인 만들기
		Line = 0;
		AILine = 0; //****************
		for (int i = 0; i < 5; i++)
		{
			int CheckCount = 0, CheckCount2 = 0;//빙고 가로 줄 카운트 하는 변수
			int AICheckCount = 0, AICheckCount2 = 0;
			for (int j = 0; j < 5; j++)
			{
				if (Number[i * 5 + j] == INT_MAX)//*하나씩 CheckCount 가로 줄 체크
					++CheckCount;
				if (Number[j * 5 + i] == INT_MAX)//*세로 줄
					++CheckCount2;
				if (AINumber[i * 5 + j] == INT_MAX)//*******AI 가로 체크
					++AICheckCount;
				if (AINumber[j * 5 + i] == INT_MAX)//*******AI 세로 체크
					++AICheckCount2;
			}

			if (CheckCount == 5)//CheckCount가 5개면
				++Line;//빙고 가로 줄 1개 ++
			if (CheckCount2 == 5)//CheckCount가 5개면
				++Line;//빙고 가로 줄 1개 ++  
			if (AICheckCount == 5)//**********
				++AILine;
			if (AICheckCount2 == 5)//**********
				++AILine;
		}
		//
		int CheckCount3 = 0, AICheckCount3 = 0;//대각선 줄 체크 왼위->오아래
		for (int i = 0; i < 25; i += 6)
		{
			if (Number[i] == INT_MAX)
				CheckCount3++;
			if (AINumber[i] == INT_MAX)//********************
				AICheckCount3++;
		}
		if (CheckCount3 == 5)//CheckCount가 5개면
			++Line;//빙고 가로 줄 1개 ++ 
		if (AICheckCount3 == 5)//**************
			++AILine;

		

		int CheckCount4 = 0, AICheckCount4 = 0;//대각선 줄 체크 오위->왼아래
		for (int i = 4; i <= 20; i += 4)
		{
			if (Number[i] == INT_MAX)
				++CheckCount4;
			if (AINumber[i] == INT_MAX)//****************
				++AICheckCount4;
		}
		if (CheckCount4 == 5)//CheckCount가 5개면
			++Line;//빙고 가로 줄 1개 ++  
		if (AICheckCount4 == 5)//*************
			++AILine;
	}


	return 0;
}

AI랑 플레이 하는 빙고(hard mode) // 진행중

코드 확인:

'C++ > 공부' 카테고리의 다른 글

코테용 알고리즘 정리해보기  (0) 2023.05.09
코테용 알고리즘 정리해보기  (0) 2023.05.09
알고리즘  (0) 2023.05.01
자료구조 정리  (0) 2023.05.01
IMGUI - Docking버전 사용법  (0) 2023.01.11