코딩
빙고 게임
찬이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;
}