본문 바로가기

코딩

더블포인터 빙고 vs Computer

평소에는 Com의 값이 랜덤으로 나오지만, Com의 빙고판에서 빙고까지 하나만 남았다면 무조건 그 값을 출력하도록

만들었다. 점점 코드가 길어져서 다시 보면 나도 이해 못 할지도...ㅠㅠ

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

//스왑
void Swap(int** bingo, 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(int** bingo, int size)
{
	for (int i = 0; i < 1000; i++)
	{
		int sour1 = rand() % size;
		int sour2 = rand() % size;
		int dest1 = rand() % size;
		int dest2 = rand() % size;
		Swap(bingo, sour1, sour2, dest1, dest2);
	}
}

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

//빙고 출력
void PrintBingo(int** bingo, int size) 
{
	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;
	}
}

//input값 bingo에 있는지 체크
int InputCheck(int** bingo,int size, int input)
{
	for (int y = 0; y < size; y++)
	{
		for (int x = 0; x < size; x++)
		{
			if (bingo[x][y] == input)
			{
				bingo[x][y] = -99;
				return 1;
			}
		}
	}
	return 0;
}

//빙고 가로체크
int BingoHorizontal(int** bingo, int size)
{
	int 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++;
		}
	}
	return line;
}

//빙고 세로체크
int BingoVertical(int** bingo, int size)
{
	int line = 0;
	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++;
		}
	}
	return line;
}

//빙고 대각선체크
int BingoDiagonal(int** bingo, int size)
{
	int line = 0, countR = 0, countL = 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++;
	}
	return line;
}

int main()
{
	srand(time(NULL));	
	int size, myline = 0, comline = 0;
	int input;
	int myturn = 1, inum = 0;
	bool NextComInput = false; //컴퓨터의 빙고까지 하나 남았을 때를 판별할 변수

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

	//내빙고, 컴빙고 생성
	int** myBingo = new int* [size];
	int** comBingo = new int* [size];
	for (int i = 0; i < size; i++)
		myBingo[i] = new int[size];
	for (int i = 0; i < size; i++)
		comBingo[i] = new int[size];

	//빙고판 초기화
	BingoReset(myBingo, size);
	BingoReset(comBingo, size);
	
	//셔플함수 호출
	Shuffle(myBingo, size);
	Shuffle(comBingo, size);

	//그냥 랜덤값 받기싫어 따로 컴퓨터input값 미리 저장해둘 배열 추가
	int* cominputArr = new int[pow(size, 2)];
	for (int i = 0; i < pow(size, 2); i++)
	{
		cominputArr[i] = i;
	}
	for (int i = 0; i < 1000; i++)
	{
		int sour = rand() % (size * size);
		int demp = rand() % (size * size);
		int temp = cominputArr[sour];
		cominputArr[sour] = cominputArr[demp];
		cominputArr[demp]=temp;
	}

	while (myline < 3 && comline < 3)
	{
		bool isChecking = false;

		//빙고 출력
		cout << "=========================================================" << endl << endl;
		cout << "내 빙고 개수 : " << myline << endl;
		PrintBingo(myBingo, size);		
		cout << "컴퓨터 빙고 개수 : " << comline << endl;
		PrintBingo(comBingo, size);
		cout << "=========================================================" << endl;
		
		//input값 입력(내턴, 컴퓨터턴 분할)
		if (myturn > 0)
		{
			cout << "!!마이 턴!! " << "입력 : ";
			cin >> input;

			//input 예외처리
			if (input > pow(size, 2) - 1 || input < 0)
			{
				cout << "※※※※※다시 입력해주세요※※※※※" << endl;
				continue;
			}
		}
		else
		{			
			if(!NextComInput)
			{
				//input = rand() % pow(size, 2); //왜 안됨??
				//input = rand() % (size * size);
				//자꾸 중복값 뜨는거 없앨라고 따로 컴퓨터input값을 배열에 담아둠
				input = cominputArr[inum++];
			}
			cout << "!!컴퓨터 턴!! " << "입력 : " << input << endl;
			NextComInput = false;
		}

		//input값 bingo에 있는지 체크
		isChecking = InputCheck(myBingo, size, input);
		isChecking = InputCheck(comBingo, size, input);
		if (!isChecking)
		{
			cout << "※※※※※다시 입력해주세요.※※※※※" << endl;
			continue;
		}

		//빙고 여부 확인
		myline = comline = 0;
		//가로
		myline += BingoHorizontal(myBingo, size);
		//comline += BingoHorizontal(comBingo, size);
		for (int y = 0; y < size; y++)
		{
			int count = 0;
			for (int x = 0; x < size; x++)
			{
				if (comBingo[x][y] == -99)
					count++;
			}
			if (count == (size - 1))
			{
				for (int x = 0; x < size; x++)
				{
					if (comBingo[x][y] != -99)
					{
						input = comBingo[x][y];
						NextComInput = true;
					}
				}
			}
			if (count == size)
			{
				comline++;
			}
		}

		//세로
		myline += BingoVertical(myBingo, size);
		//comline += BingoVertical(comBingo, size);
		for (int x = 0; x < size; x++)
		{
			int count = 0;
			for (int y = 0; y < size; y++)
			{
				if (comBingo[x][y] == -99)
					count++;
			}
			//컴퓨터에서 빙고까지 하나 남았을 때 그 값 자동으로 input
			if (count == (size - 1))
			{
				for (int y = 0; y < size; y++)
				{
					if (comBingo[x][y] != -99)
					{
						input = comBingo[x][y];
						NextComInput = true;
					}
				}
			}
			if (count == size)
			{
				comline++;
			}
		}

		//대각선
		myline += BingoDiagonal(myBingo, size);
		//comline += BingoDiagonal(comBingo, size);
		int countR = 0, countL = 0;
		for (int x = 0; x < size; x++)
		{
			if (comBingo[x][x] == -99)
				countL++;
			if (countL == (size - 1))
			{
				for (int i = 0; i < size; i++)
				{
					if (comBingo[i][i] != -99)
					{
						input = comBingo[i][i];
						NextComInput = true;
					}
				}
			}
			if (countL == size)
				comline++;

			if (comBingo[size - x - 1][x] == -99)
				countR++;
			if (countR == (size - 1))
			{
				for (int i = 0; i < size; i++)
				{
					if (comBingo[size - i - 1][i] != -99)
					{
						input = comBingo[size - i - 1][i];
						NextComInput = true;
					}
				}
			}
			if (countR == size)
				comline++;
		}

		//차례 바꾸기
		myturn *= -1;
	}

	//결과 출력
	cout << "내 빙고 : " << myline << endl << "컴퓨터 빙고 : " << comline << endl;
	if (myline == 3)
		cout << "축하합니다!! 컴퓨터를 이겼어요!!" << endl;
	else
		cout << "저런... 컴퓨터에게 졌어요ㅠㅠ" << endl;
	
    //동적할당 해제
	for (int i = 0; i < size; i++)
	{
		delete[] myBingo[i];
		delete[] comBingo[i];
	}
	delete[] myBingo;
	delete[] comBingo;
	delete[] cominputArr;
    
	cin >> input;
	return 0;
}

2.0 Ver Patch Note

Input값 중복 체크해줄 함수(InputCheck())의 반환형 변경

Mybingo의 빙고 검사 함수를 BingoCountCheck()함수로 하나로 묶음

BingoCountCheck()함수의 매개변수 line에 & 레퍼런스 추가

Computer의 input값을 미리 담아뒀든 cominputArr배열 삭제

Computer차례 때 input값 결정 방법 추가

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

//스왑
void Swap(int** bingo, 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(int** bingo, int size)
{
	for (int i = 0; i < 1000; i++)
	{
		int sour1 = rand() % size;
		int sour2 = rand() % size;
		int dest1 = rand() % size;
		int dest2 = rand() % size;
		Swap(bingo, sour1, sour2, dest1, dest2);
	}
}

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

//빙고 출력
void PrintBingo(int** bingo, int size)
{
	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;
	}
}

//input값 bingo에 있는지 체크
bool InputCheck(int** bingo, int size, int input)
{
	for (int y = 0; y < size; y++)
	{
		for (int x = 0; x < size; x++)
		{
			if (bingo[x][y] == input)
			{
				bingo[x][y] = -99;
				return true;
			}
		}
	}
	return false;
}

//빙고여부체크 함수
void BingoCountCheck(int** bingo,int size, __inout int& line)
{
	//가로
	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 countR = 0, countL = 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++;
	}
}

int main()
{
	srand(time(NULL));
	int size, myline = 0, comline = 0;
	int input;
	int myturn = 1, inum = 0;
	bool NextComInput = false; //컴퓨터의 빙고까지 하나 남았을 때를 판별할 변수

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

	//내빙고, 컴빙고 생성
	int** myBingo = new int* [size];
	int** comBingo = new int* [size];
	for (int i = 0; i < size; i++)
		myBingo[i] = new int[size];
	for (int i = 0; i < size; i++)
		comBingo[i] = new int[size];

	//빙고판 초기화
	BingoReset(myBingo, size);
	BingoReset(comBingo, size);

	//셔플함수 호출
	Shuffle(myBingo, size);
	Shuffle(comBingo, size);

	while (myline < 3 && comline < 3)
	{
		//빙고 출력
		cout << "=========================================================" << endl << endl;
		cout << "내 빙고 개수 : " << myline << endl;
		PrintBingo(myBingo, size);
		cout << "컴퓨터 빙고 개수 : " << comline << endl;
		PrintBingo(comBingo, size);
		cout << "=========================================================" << endl;

		//input값 입력(내턴, 컴퓨터턴 분할)
		if (myturn > 0)
		{
			cout << "!!마이 턴!! " << "입력 : ";
			cin >> input;

			//input 예외처리
			if (input > pow(size, 2) - 1 || input < 0)
			{
				cout << "※※※※※다시 입력해주세요※※※※※" << endl;
				continue;
			}
		}
		else
		{
			if (!NextComInput)
			{
				//ComputerBingo판에서 안뽑힌 숫자 찾아서 input하기
				input = -99;
				while (input == -99)
				{
					input = comBingo[rand() % size][rand() % size];
				}
			}
			cout << "!!컴퓨터 턴!! " << "입력 : " << input << endl;
			NextComInput = false;
		}

		//input값 bingo에 있는지 체크
		bool isChecking = false;
		isChecking = InputCheck(myBingo, size, input);
		isChecking = InputCheck(comBingo, size, input);
		if (!isChecking)
		{
			cout << "※※※※※다시 입력해주세요.※※※※※" << endl;
			continue;
		}

		//빙고 여부 확인
		myline = comline = 0;

		BingoCountCheck(myBingo, size, myline);
		//가로
		for (int y = 0; y < size; y++)
		{
			int count = 0;
			for (int x = 0; x < size; x++)
			{
				if (comBingo[x][y] == -99)
					count++;
			}
			if (count == (size - 1))
			{
				for (int x = 0; x < size; x++)
				{
					if (comBingo[x][y] != -99)
					{
						input = comBingo[x][y];
						NextComInput = true;
					}
				}
			}
			if (count == size)
			{
				comline++;
			}
		}

		//세로
		for (int x = 0; x < size; x++)
		{
			int count = 0;
			for (int y = 0; y < size; y++)
			{
				if (comBingo[x][y] == -99)
					count++;
			}
			//컴퓨터에서 빙고까지 하나 남았을 때 그 값 자동으로 input
			if (count == (size - 1))
			{
				for (int y = 0; y < size; y++)
				{
					if (comBingo[x][y] != -99)
					{
						input = comBingo[x][y];
						NextComInput = true;
					}
				}
			}
			if (count == size)
			{
				comline++;
			}
		}

		//대각선
		int countR = 0, countL = 0;
		for (int x = 0; x < size; x++)
		{
			if (comBingo[x][x] == -99)
				countL++;
			if (countL == (size - 1))
			{
				for (int i = 0; i < size; i++)
				{
					if (comBingo[i][i] != -99)
					{
						input = comBingo[i][i];
						NextComInput = true;
					}
				}
			}
			if (countL == size)
				comline++;

			if (comBingo[size - x - 1][x] == -99)
				countR++;
			if (countR == (size - 1))
			{
				for (int i = 0; i < size; i++)
				{
					if (comBingo[size - i - 1][i] != -99)
					{
						input = comBingo[size - i - 1][i];
						NextComInput = true;
					}
				}
			}
			if (countR == size)
				comline++;
		}

		//차례 바꾸기
		myturn *= -1;
	}

	//결과 출력
	cout << "내 빙고 : " << myline << endl << "컴퓨터 빙고 : " << comline << endl;
	if (myline == 3)
		cout << "축하합니다!! 컴퓨터를 이겼어요!!" << endl;
	else
		cout << "저런... 컴퓨터에게 졌어요ㅠㅠ" << endl;

	//동적할당 해제
	for (int i = 0; i < size; i++)
	{
		delete[] myBingo[i];
		delete[] comBingo[i];
	}
	delete[] myBingo;
	delete[] comBingo;
	
	cin >> input;
	return 0;
}

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

섯다 2.0 ver  (2) 2022.11.07
섯다  (0) 2022.11.03
더블포인터 빙고  (0) 2022.11.01
포인터 별찍기  (0) 2022.10.27
달팽이 배열  (0) 2022.10.27