평소에는 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;
}