본문 바로가기

코딩

더블포인터 빙고

더블포인터로 2차원배열을 만들어서 각 함수의 매개변수로 활용하는 부분에서 조금 헷갈렸다.ㅠ

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

//스왑함수
void Swap(int sour1, int sour2, int demp1, int demp2, int** bingo)
{
	int temp = bingo[sour1][sour2];
	bingo[sour1][sour2] = bingo[demp1][demp2];
	bingo[demp1][demp2] = temp;
}

//셔플함수
void Shuffle(int size, int** bingo)
{
	int sour1 = rand() % size;
	int sour2 = rand() % size;
	int demp1 = rand() % size;
	int demp2 = rand() % size;	

	Swap(sour1, sour2, demp1, demp2, bingo);
}

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

	cout << "빙고판 사이즈를 입력해주세요 ex) 4 -> 4 x 4" << endl << "입력 : ";
	cin >> size;

	//빙고판 생성
	int** bingo = new int* [size];
	for (int i = 0; i < size; i++)
	{
		bingo[i] = new int[size];
	}

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

	//셔플
	for (int i = 0; i < 1000; i++)
	{
		Shuffle(size, bingo);
	}

	while (line < 3)
	{
		cout << "빙고 개수 : " << line << endl;
		//빙고판 출력
		for (int y = 0; y < size; y++)
		{
			for (int x = 0; x < size; x++)
			{
				if (bingo[x][y] == -99)
				{
					cout << "X" << "\t";
				}
				else
				{
					cout << bingo[x][y] << "\t";
				}
			}
			cout << endl << endl;
		}
		cout << "입력 : ";
		cin >> input;
		//input값 예외처리
		if (input < 0 || input > ((size * size) - 1))
		{
			cout << "다시 입력해주세요" << endl;
			continue;
		}

		//input값 검사 및 중복확인
		bool isChecking = false;
		for (int  y = 0; y < size; y++)
		{
			for (int x = 0; x < size; x++)
			{
				if (input == bingo[x][y])
				{
					bingo[x][y] = -99;
					isChecking = true;
				}
			}
		}
		if (!isChecking)
		{
			cout << "중복이거나 없습니다." << endl;
			continue;
		}

		//빙고 개수 초기화(값 중첩 방지)
		line = 0;

		//가로빙고 검사
		for (int y = 0; y < size; y++)
		{
			int count = 0;
			for (int x = 0; x < size; x++)
			{
				if (bingo[x][y] == -99)
				{
					count++;
				}
			}
			if (count == size)
			{
				line++;
			}
		}

		//세로빙고 검사
		for (int x = 0; x < size; x++)
		{
			int count = 0;
			for (int y = 0; y < size; y++)
			{
				if (bingo[x][y] == -99)
				{
					count++;
				}
			}
			if (count == size)
			{
				line++;
			}
		}

		//대각선빙고 검사
		int countL = 0;
		int countR = 0;		
		for (int x = 0; x < size; x++)
		{
			if (bingo[x][x] == -99)
			{
				countL++;
			}
			if (countL == size)
			{
				line++;
			}
			if (bingo[(size - x) - 1][x] == -99)
			{
				countR++;
			}
			if (countR == size)
			{
				line++;
			}
		}
	}
	for (int i = 0; i < size; i++)
	{
		delete[size] bingo[i];
	}
	delete[] bingo;

	cout << "축하합니다! " << line << "빙고 달성!!!" << endl;
	cin >> input;

	return 0;
}

2.0 Ver Patch Note

math.h 헤더파일을 추가하였습니다.

size * size 부분을 pow(size, 2)로 변경하였습니다.

Shuffle() 함수를 조금 수정하였습니다.

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

//스왑함수
void Swap(int sour1, int sour2, int demp1, int demp2, int** bingo)
{
	int temp = bingo[sour1][sour2];
	bingo[sour1][sour2] = bingo[demp1][demp2];
	bingo[demp1][demp2] = temp;
}

//셔플함수
void Shuffle(int size, int** bingo)
{
	for (int i = 0; i < 1000; i++)
	{
		int sour1 = rand() % size;
		int sour2 = rand() % size;
		int demp1 = rand() % size;
		int demp2 = rand() % size;

		Swap(sour1, sour2, demp1, demp2, bingo);
	}
}

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

	cout << "빙고판 사이즈를 입력해주세요 ex) 4 -> 4 x 4" << endl << "입력 : ";
	cin >> size;

	//빙고판 생성
	int** bingo = new int* [size];
	for (int i = 0; i < size; i++)
	{
		bingo[i] = new int[size];
	}

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

	//셔플
	Shuffle(size, bingo);	

	while (line < 3)
	{
		cout << "빙고 개수 : " << line << endl;
		//빙고판 출력
		for (int y = 0; y < size; y++)
		{
			for (int x = 0; x < size; x++)
			{
				if (bingo[x][y] == -99)
				{
					cout << "X" << "\t";
				}
				else
				{
					cout << bingo[x][y] << "\t";
				}
			}
			cout << endl << endl;
		}
		cout << "입력 : ";
		cin >> input;
		//input값 예외처리
		if (input < 0 || input > (pow(size, 2) - 1))
		{
			cout << "다시 입력해주세요" << endl;
			continue;
		}

		//input값 검사 및 중복확인
		bool isChecking = false;
		for (int  y = 0; y < size; y++)
		{
			for (int x = 0; x < size; x++)
			{
				if (input == bingo[x][y])
				{
					bingo[x][y] = -99;
					isChecking = true;
				}
			}
		}
		if (!isChecking)
		{
			cout << "중복이거나 없습니다." << endl;
			continue;
		}

		//빙고 개수 초기화(값 중첩 방지)
		line = 0;

		//가로빙고 검사
		for (int y = 0; y < size; y++)
		{
			int count = 0;
			for (int x = 0; x < size; x++)
			{
				if (bingo[x][y] == -99)
				{
					count++;
				}
			}
			if (count == size)
			{
				line++;
			}
		}

		//세로빙고 검사
		for (int x = 0; x < size; x++)
		{
			int count = 0;
			for (int y = 0; y < size; y++)
			{
				if (bingo[x][y] == -99)
				{
					count++;
				}
			}
			if (count == size)
			{
				line++;
			}
		}

		//대각선빙고 검사
		int countL = 0;
		int countR = 0;		
		for (int x = 0; x < size; x++)
		{
			if (bingo[x][x] == -99)
			{
				countL++; 
			}
			if (countL == size)
			{
				line++;
			}
			if (bingo[(size - x) - 1][x] == -99)
			{
				countR++;
			}
			if (countR == size)
			{
				line++;
			}
		}
	}
	for (int i = 0; i < size; i++)
	{
		delete[size] bingo[i];
	}
	delete[] bingo;

	cout << "축하합니다! " << line << "빙고 달성!!!" << endl;
	cin >> input;

	return 0;
}

'코딩' 카테고리의 다른 글

섯다  (0) 2022.11.03
더블포인터 빙고 vs Computer  (0) 2022.11.01
포인터 별찍기  (0) 2022.10.27
달팽이 배열  (0) 2022.10.27
빙고 ver2(문자열)  (2) 2022.10.26