코딩

빙고 게임

찬이2 2022. 10. 25. 01:15

빙고 검출 부분의 코드가 좀 비효율적으로 된 것 같다... 함수도 다시 정리가 필요할 것 같다.

#include<iostream>
#include<string>
#include<time.h>
using namespace std;

int bingo[5][5];

struct SubP
{
	int x;
	int y;	
};

int Randi()
{
	return rand() % 5;
}

void Swap(SubP a, SubP b)
{
	int temp = bingo[a.x][a.y];
	bingo[a.x][a.y] = bingo[b.x][b.y];
	bingo[b.x][b.y] = temp;
}

void Shuffle()
{
	for (int i = 0; i < 100; i++)
	{
		SubP num1;
		num1.x = Randi();
		num1.y = Randi();

		SubP num2;
		num2.x = Randi();
		num2.y = Randi();

		Swap(num1, num2);		
	}
}

int Horizon(int y) //가로
{	
	int count = 0;
	for (int x = 0; x < 5; x++)
	{
		if (bingo[x][y] == 99)
		{
			count++;
		}
	}
	if (count == 5)
		return 1;
	else
		return 0;
}

int Vertical(int x) //세로
{
	int count = 0;
	for (int y = 0; y < 5; y++)
	{
		if (bingo[x][y] == 99)
		{
			count++;
		}
	}
	if (count == 5)
		return 1;
	else
		return 0;
}

int Diagonal1() //첫번째 대각선
{
	int count = 0;
	int x = 0, y = 0;
	for (int i = 0; i < 5; i++)
	{
		if (bingo[x++][y++] == 99)
		{
			count++;
		}
	}
	if (count == 5)
		return 1;
	else
		return 0;
}

int Diagonal2() //두번째 대각선
{
	int count = 0;
	int x = 4, y = 0;
	for (int i = 0; i < 5; i++)
	{
		if (bingo[x--][y++] == 99)
		{
			count++;
		}
	}
	if (count == 5)
		return 1;
	else
		return 0;
}

int main()
{
	srand(time(NULL));	
	int input, line = 0;

	//빙고 초기화
	for (int x = 0; x < 5; x++)
	{
		for (int y = 0; y < 5; y++)
		{
			bingo[x][y] = y * 5 + x;
		}
	}

	//셔플
	Shuffle();

	while (true)
	{
		//빙고판 출력
		cout << "빙고갯수 : " << line << endl;
		for (int y = 0; y < 5; y++)
		{
			for (int x = 0; x < 5; x++)
			{
				switch (bingo[x][y])
				{
				case 99:
					cout << "X" << "\t";
					break;
				default:
					cout << bingo[x][y] << "\t";
					break;
				}				
			}
			cout << endl << endl;
		}
		cout << "입력 : ";
		cin >> input;
		//input 예외처리
		if (0 > input || 24 < input)
		{
			cout << "해당하는 숫자가 없습니다." << endl;
			continue;
		}
		
		//input값 위치 확인
		for (int y = 0; y < 5; y++)
		{
			for (int x = 0; x < 5; x++)
			{
				if (bingo[x][y] == input)
				{
					bingo[x][y] = 99;
				}
			}
		}
				
		//bingo 체크
		line = 0; //중첩방지용 초기화
		//가로
		for (int y = 0; y < 5; y++)
		{
			if (Horizon(y))
				line += Horizon(y);
		}
		
		//세로
		for (int x = 0; x < 5; x++)
		{
			if (Vertical(x))
			{
				line += Vertical(x);
			}
		}

		//대각선		
		if (Diagonal1())
		{
			line += Diagonal1();
		}
		if (Diagonal2())
		{
			line += Diagonal2();
		}

		//종료 조건
		if (line == 3)
		{
			cout << "\t축하합니다" << endl << "~~~~~~~~~3 BINGO~~~~~~~~~" << endl;
			cout << "  프로그램을 종료합니다."<<endl;
			cin >> input;
			return 0;
		}
	}
}

빙고 ver1.5 Patch Note

필요없는 함수 정리 및 Swap함수, Shuffle함수 재정의

빙고 검출용 count변수 / 중복 체크용 isChecking변수 추가

3빙고 종료조건 if문에서 while문의 조건으로 변경

빙고 출력부분 swtich문을 if문으로 변경

isChecking변수를 통한 중복검출 추가

빙고검출 부분 재정의

#include<iostream>
#include<string>
#include<time.h>
using namespace std;

int bingo[5][5];

void Swap(int sour1, int sour2, int dest1, int dest2)
{
	int temp = bingo[sour1][sour2];
	bingo[sour1][sour2] = bingo[dest1][dest2];
	bingo[dest1][dest2] = temp;
}

void Shuffle()
{
	for (int i = 0; i < 1000; i++)
	{		
		int sour1 = rand() % 5;
		int sour2 = rand() % 5;
		int dest1 = rand() % 5;
		int dest2 = rand() % 5;

		Swap(sour1, sour2, dest1, dest2);
	}
}

int main()
{
	srand(time(NULL));	
	int input, line = 0, count = 0;

	//빙고 초기화
	for (int x = 0; x < 5; x++)
	{
		for (int y = 0; y < 5; y++)
		{
			bingo[x][y] = y * 5 + x;
		}
	}

	//셔플
	Shuffle();

	while (line < 3) //while문 종료 조건(3빙고)
	{
		//빙고판 출력
		cout << "빙고갯수 : " << line << endl;
		for (int y = 0; y < 5; y++)
		{
			for (int x = 0; x < 5; x++)
			{
				if (bingo[x][y] == 99)
				{
					cout << "X" << "\t";
				}
				else
				{
					cout << bingo[x][y] << "\t";
				}						
			}
			cout << endl << endl;
		}
		cout << "입력 : ";
		cin >> input;
		//input 예외처리
		if (0 > input || 24 < input)
		{
			cout << "해당하는 숫자가 없습니다." << endl;
			continue;
		}
		
		//중복 체크용 변수
		bool isChecking = false;

		//Bingo에 input값 있는지 확인
		for (int y = 0; y < 5; y++)
		{
			for (int x = 0; x < 5; x++)
			{
				if (bingo[x][y] == input)
				{
					bingo[x][y] = 99;
					isChecking = true;
				}
			}
		}
		if (!isChecking) //input값이 없을 때, 또는 똑같은 값을 다시 입력 시
		{
			cout << "다시 입력해주세요" << endl;
			continue;
		}
				
		//bingo 체크
		line = 0; //중첩방지용 초기화
		//가로
		for (int y = 0; y < 5; y++)
		{
			count = 0;
			for (int x = 0; x < 5; x++)
			{
				if (bingo[x][y] == 99)
				{
					count++;
				}
			}
			if (count == 5)
			{
				line++;
			}
		}

		//세로
		for (int x = 0; x < 5; x++)
		{
			count = 0;
			for (int y = 0; y < 5; y++)
			{
				if (bingo[x][y] == 99)
				{
					count++;
				}
			}
			if (count == 5)
			{
				line++;
			}
		}

		//대각선
		int countL = 0;
		int countR = 0;
		for (int x = 0; x < 5; x++)
		{
			//왼쪽대각선
			if (bingo[x][x] == 99)
			{
				countL++;
			}
			if (countL == 5)
			{
				line++;
			}
			//오른쪽대각선
			if (bingo[4 - x][x] == 99)
			{
				countR++;
			}
			if (countR == 5)
			{
				line++;
			}
		}
		

		
		
	}

	//종료 시 출력
	cout << "\t축하합니다" << endl << "~~~~~~~~~3 BINGO~~~~~~~~~" << endl;
	cout << "  프로그램을 종료합니다." << endl;
	cin >> input;
	return 0;
}