๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[inflearn ๊ฐ์] ๋น๊ณ ๊ฒ์ - ๋น๊ณ ๊ฒ์ AI Hard Mode ๋ณธ๋ฌธ
๐ฉ๐ป IoT (Embedded)/C++
[inflearn ๊ฐ์] ๋น๊ณ ๊ฒ์ - ๋น๊ณ ๊ฒ์ AI Hard Mode
์ง์ง์ํ์นด 2023. 7. 3. 23:58728x90
๋ฐ์ํ
<๋ณธ ๋ธ๋ก๊ทธ๋ ์ด์ํธ๋ฝ ๊ฒ์์์นด๋ฐ๋ฏธ ๋์ ์ ํ๋ธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค :-)>
=> C++ Let's Make Games
๐ซง ๋น๊ณ ๊ฒ์ AI Hard Mode
#include <iostream>
#include <time.h>
using namespace std;
enum AI_MODE {
AM_EASY = 1,
AM_HARD
};
enum LINE_NUMBER {
LN_H1,
LN_H2,
LN_H3,
LN_H4,
LN_H5,
LN_V1,
LN_V2,
LN_V3,
LN_V4,
LN_V5,
LN_LT,
LN_RT,
};
int main()
{
srand((unsigned int)time(0));
int iNumber[25] = {};
int iAINumber[25] = {};
// 1~25 ์ซ์ ๋ฃ๊ธฐ
for (int i = 0; i < 25; i++) {
iNumber[i] = i + 1;
iAINumber[i] = i + 1;
}
// ์ซ์ ์๊ธฐ
int iTemp, idx1, idx2;
for (int i = 0; i < 100; ++i) {
idx1 = rand() % 25;
idx2 = rand() % 25;
iTemp = iNumber[idx1];
iNumber[idx1] = iNumber[idx2];
iNumber[idx2] = iTemp;
// AI ์ซ์ ์๊ธฐ
idx1 = rand() % 25;
idx2 = rand() % 25;
iTemp = iAINumber[idx1];
iAINumber[idx1] = iAINumber[idx2];
iAINumber[idx2] = iTemp;
}
int iBingo = 0, iAIBingo = 0;
int iAIMode;
while (true) {
system("cls");
// AI ๋์ด๋
cout << "1. Easy" << endl;
cout << "2. Hard" << endl;
cout << "AI ๋ชจ๋ ์ ํํ์ธ์ : ";
cin >> iAIMode;
if (iAIMode >= AM_EASY && iAIMode <= AM_HARD) {
break;
}
}
// ์ ํ ์๋ ๋ชฉ๋ก ๋ฐฐ์ด
int iNoneSelect[25] = {};
// ์ ํ ์๋ ์ซ์ ๊ฐ์
int iNoneSelectCount = 0;
while (true) {
system("cls");
// ์ซ์๋ฅผ 5x5 ์ถ๋ ฅ
cout << "########### Player ############" << endl;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (iNumber[i * 5 + j] == INT_MAX) {
cout << "*\t";
}
else {
cout << iNumber[i * 5 + j] << "\t";
}
}
cout << endl;
}
// Player ๋น๊ณ ์ค ์
cout << "Bingo Line : " << iBingo << endl << endl;
cout << "########### AI ############" << endl;
switch (iAIMode) {
case AM_EASY:
cout << "AIMode : Easy" << endl;
break;
case AM_HARD:
cout << "AIMode : Hard" << endl;
break;
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (iAINumber[i * 5 + j] == INT_MAX) {
cout << "*\t";
}
else {
cout << iAINumber[i * 5 + j] << "\t";
}
}
cout << endl;
}
// AI ๋น๊ณ ์ค ์
cout << "AIBingo Line : " << iAIBingo << endl << endl;
// ์ค ์๊ฐ 5 ์ด์์ด๋ฉด ๊ฒ์ ์ข
๋ฃ
if (iBingo > 5) {
cout << "Player ์น๋ฆฌ" << endl;
break;
}
if (iAIBingo > 5) {
cout << "AI ์น๋ฆฌ" << endl;
break;
}
cout << "์ซ์ ์
๋ ฅ (์ข
๋ฃ : 0) : ";
int iInput;
cin >> iInput;
if (iInput == 0) {
break;
}
else if (iInput < 1 || iInput > 25) {
continue;
}
// ์ค๋ณต ์
๋ ฅ ๋ฐฉ์ง ์ฒดํฌ
bool bAcc = true;
// ๋ชจ๋ ์ซ์๋ฅผ ์ฐจ๋ก๋๋ก ๊ฒ์ฌ
// ์
๋ ฅํ ์ซ์์ ๊ฐ์ ์ซ์๊ฐ ์๋์ง ์ฐพ๊ธฐ
for (int i = 0; i < 25; ++i) {
// ๊ฐ์ ์ซ์
if (iInput == iNumber[i]) {
// ์ซ์ ์ฐพ์์ ๊ฒฝ์ฐ ์ค๋ณต๋ ์ซ์ ์๋
bAcc = false;
// ์ซ์๋ฅผ *๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํ ํน์ ๊ฐ INT_MAX
iNumber[i] = INT_MAX;
// ์ฐพ์๋ณผ ์ซ์ ์์
break;
}
}
// bAcc ๋ณ์๊ฐ true ์ผ ๊ฒฝ์ฐ ์ค๋ณต๋ ์ซ์ ์
๋ ฅํด์
// ์ซ์๋ฅผ *๋ก ๋ฐ๊พธ์ง ๋ชปํ์ผ๋ฏ๋ก ๋ค์ ์
๋ ฅ๋ฐ๊ฒ continue
if (bAcc) {
continue;
}
// ์ค๋ณต ์๋๋ผ๋ฉด AI์ ์ซ์๋ *๋ก ๋ฐ๊พธ๊ธฐ
for (int i = 0; i < 25; ++i) {
// ๊ฐ์ ์ซ์
if (iInput == iAINumber[i]) {
// ์ซ์๋ฅผ *๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํ ํน์ ๊ฐ INT_MAX
iAINumber[i] = INT_MAX;
// ์ฐพ์๋ณผ ์ซ์ ์์
break;
}
}
// AI ๋ชจ๋์ ๋ค๋ผ ์ ํํ๋๊ฒ ๋ฌ๋ผ์ง๋ค
switch (iAIMode) {
/*
AI Easy : AI์ ์ซ์๋ชฉ๋ก ์ค *๋ก ๋ฐ๋์ง ์์ ์ซ์ ๋ชฉ๋ก ๋ง๋ค์ด์
๊ทธ ๋ชฉ๋ก ์ค ํ๋๋ฅผ ์ ํํ๊ฒ ํจ (๋๋คํ๊ฒ)
*/
case AM_EASY:
// ์ ํ ์๋ ์ซ์ ๋ชฉ๋ก ๋ง๋ค๊ธฐ
// ์ ํ ์๋ ์ซ์ ๊ฐ์๋ ๋ชฉ๋ก์ ๋ง๋ค ๋ ์นด์ดํ
iNoneSelectCount = 0;
for (int i = 0; i < 25; ++i) {
// ํ์ฌ ์ซ์๊ฐ *์ด ์๋ ๊ฒฝ์ฐ
if (iAINumber[i] != INT_MAX) {
// *์ด ์๋ ์ซ์์ผ ๊ฒฝ์ฐ iNoneSelectCount ์ธ๋ฑ์ค๋ก ํ์ฉ
// ์ด ์ ํ ์๋ ๊ฐ์ ๊ตฌํ๊ธฐ
iNoneSelect[iNoneSelectCount] = iAINumber[i];
++iNoneSelectCount;
}
}
// ์ ํ ์๋ ๋ชฉ๋ก์ ๊ฐ์ ๋ง๋ค์ด์ง
// ์ ํ ์๋ ๋ชฉ๋ก์ ์ซ์ ์ค ๋๋คํ ํ๋์ ์ซ์ ์ป์ด์ค๊ธฐ ์ํด ์ธ๋ฑ์ค ๋๋คํ๊ฒ ๊ตฌํ๊ธฐ
iInput = iNoneSelect[rand() % iNoneSelectCount];
break;
case AM_HARD:
// ํ์ฌ ์ซ์ ์ค ๋น๊ณ ์ค ์์ฑ ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ฅ ๋์ ์ค ์ฐพ์์
// ๊ทธ ์ค์ ์๋ ์ซ์ ์ค ํ๋๋ฅผ *๋ก ๋ง๋ ๋ค
int iLine;
int iStarCount = 0;
int iSaveCount = 0;
// ๊ฐ๋ก ๋ผ์ธ ์ค ๊ฐ์ฅ *์ด ๋ง์ ์ค ์ฐพ๊ธฐ
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (iAINumber[i * 5 + j] == INT_MAX) {
++iStarCount;
}
}
// ๋ณ์ด 5๊ฐ ๋ฏธ๋ง์ด์ด์ผ ๋น๊ณ ์ค์ด ์๋๊ณ ,
// ๊ธฐ์กด์ ๊ฐ์ฅ ๋ง์ ๋ผ์ธ์ ๋ณ๋ณด๋ค ์ปค์ผ ๊ฐ์ฅ ๋ณ์ด ๋ง์ ๋ผ์ธ์
// ๋ผ์ธ ๊ต์ฒดํด์ฃผ๊ณ ์ ์ฅ๋ ๋ณ ์ ๊ต์ฒด
if (iStarCount < 5 && iSaveCount < iStarCount) {
// ๊ฐ๋ก ๋ผ์ธ ์ค ๊ฐ์ฅ ๋ณ์ด ๋ง์ ๋ผ์ธ ์ฒดํฌ
// 0~4๋ก ์๋ฏธ ๋ถ์ฌ
iLine = i;
iSaveCount = iStarCount;
}
}
// ๊ฐ๋ก ๋ผ์ธ ์ค ๊ฐ์ฅ ๋ณ์ด ๋ง์ ๋ผ์ธ ๊ตฌํจ
// ์ธ๋ก ๋ผ์ธ๋ค์ ๋น๊ตํ์ฌ ๋ณ์ด ๊ฐ์ฅ ๋ง์ ๋ผ์ธ ๊ตฌํ๋ค
// ์ธ๋ก ๋ผ์ธ ์ค ๊ฐ์ฅ *์ด ๋ง์ ์ค ์ฐพ๊ธฐ
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (iAINumber[i * 5 + j] == INT_MAX) {
++iStarCount;
}
}
if (iStarCount < 5 && iSaveCount < iStarCount) {
// ์ธ๋ก๋ผ์ธ์ 5~9 ๋ก ์๋ฏธ ๋ถ์ฌ
iLine = i + 5;
iSaveCount = iStarCount;
}
}
// ์ผ์ชฝ -> ์ค๋ฅธ์ชฝ ๋๊ฐ์
iStarCount = 0;
for (int i = 0; i < 25; i += 6) {
if (iAINumber[i] == INT_MAX) {
++iStarCount;
}
}
if (iStarCount < 5 && iSaveCount < iStarCount) {
iLine = LN_LT;
iSaveCount = iStarCount;
}
// ์ค๋ฅธ์ชฝ -> ์ผ์ชฝ ๋๊ฐ์
iStarCount = 0;
for (int i = 4; i < 20; i += 4) {
if (iAINumber[i] == INT_MAX) {
++iStarCount;
}
}
if (iStarCount < 5 && iSaveCount < iStarCount) {
iLine = LN_RT;
iSaveCount = iStarCount;
}
// iLine ์ ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ฅ ๋์ ์ค ๋ฒํธ ์ ์ฅ๋จ
// ๊ทธ ์ค์ * ์ด ์๋ ์ซ์์ค ํ๋ ์ ํ
if (iLine <= LN_H5) {
// ๊ฐ๋ก์ค
for (int i = 0; i < 5; ++i) {
// *์ด ์๋ ์ซ์
if (iAINumber[iLine * 5 + i] != INT_MAX) {
iInput = iAINumber[iLine * 5 + i];
break;
}
}
}
else if (iLine <= LN_V5) {
// ์ธ๋ก์ค
for (int i = 0; i < 5; ++i) {
// *์ด ์๋ ์ซ์
if (iAINumber[i * 5 + iLine - 5] != INT_MAX) {
iInput = iAINumber[i * 5 + iLine - 5];
break;
}
}
}
else if (iLine <= LN_LT) {
// ๋๊ฐ์
for (int i = 0; i < 25; i += 6) {
// *์ด ์๋ ์ซ์
if (iAINumber[i] != INT_MAX) {
iInput = iAINumber[i];
break;
}
}
}
else if (iLine <= LN_RT) {
// ๋๊ฐ์
for (int i = 4; i < 20; i += 4) {
// *์ด ์๋ ์ซ์
if (iAINumber[i] != INT_MAX) {
iInput = iAINumber[i];
break;
}
}
}
break;
}
// AI ๊ฐ ์ซ์ ์ ํํ์ผ๋ฏ๋ก ํ๋ ์ด์ด์ AI์ ์ซ์๋ฅผ *๋ก ๋ฐ๊พธ๊ธฐ
for (int i = 0; i < 25; ++i) {
if (iNumber[i] == iInput) {
iNumber[i] == INT_MAX;
break;
}
}
// AI ์ซ์ ๋ฐ๊พธ๊ธฐ
for (int i = 0; i < 25; ++i) {
if (iAINumber[i] == iInput) {
iAINumber[i] == INT_MAX;
break;
}
}
// ๋น๊ณ ์ค ์ ์ฒดํฌ
// ์ฒ์๋ถํฐ ์๋ก ์นด์ดํธ ํ๊ธฐ
// iBingo ๋ณ์๋ฅผ 0์ผ๋ก ๋งค๋ฒ ์ด๊ธฐํ
iBingo = 0;
iAIBingo = 0;
// ๊ฐ๋ก, ์ธ๋ก ์ค ์
int iStar1 = 0, iStar2 = 0;
int iAIStar1 = 0, iAIStar2 = 0;
for (int i = 0; i < 5; ++i) {
// ๋ณ ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ
iStar1 = iStar2 = 0;
iAIStar1 = iAIStar2 = 0;
for (int j = 0; j < 5; ++j) {
// ๊ฐ๋ก ๋ณ ๊ฐ์
if (iNumber[i * 5 + j] == INT_MAX) {
++iStar1;
}
// ์ธ๋ก ๋ณ ๊ฐ์
if (iNumber[j * 5 + i] == INT_MAX) {
++iStar2;
}
// AI ๊ฐ๋ก ๋ณ ๊ฐ์
if (iAINumber[i * 5 + j] == INT_MAX) {
++iAIStar1;
}
// AI ์ธ๋ก ๋ณ ๊ฐ์
if (iAINumber[j * 5 + i] == INT_MAX) {
++iAIStar2;
}
}
// ํ์ฌ ์ค์ ๊ฐ๋ก ๋ณ ๊ฐ์๊ฐ ๋ช๊ฐ์ธ์ง iStar1์ ๋ค์ด๊ฐ
// iStar1์ด 5์ด๋ฉด ํ์ค์ด ๋ชจ๋ * ์ด๋ฏ๋ก ๋น๊ณ ์ค ์นด์ดํธ ์ฆ๊ฐ
if (iStar1 == 5) {
++iBingo;
}
if (iStar2 == 5) {
++iBingo;
}
if (iAIStar1 == 5) {
++iAIBingo;
}
if (iAIStar2 == 5) {
++iAIBingo;
}
}
// ์ผ์ชฝ -> ์๋์ชฝ ํ๋จ ๋๊ฐ์
iStar1 = 0;
iAIStar1 = 0;
for (int i = 0; i < 25; i += 6) {
if (iNumber[i] == INT_MAX) {
++iStar1;
}
if (iAINumber[i] == INT_MAX) {
++iAIStar1;
}
}
if (iStar1 == 5) {
++iBingo;
}
if (iAIStar1 == 5) {
++iAIBingo;
}
// ์ค๋ฅธ์ชฝ ์๋จ -> ์ผ์ชฝ ํ๋จ ๋๊ฐ์
iStar1 = 0;
iAIStar1 = 0;
for (int i = 4; i <= 20; i += 4) {
if (iNumber[i] == INT_MAX) {
++iStar1;
}
if (iAINumber[i] == INT_MAX) {
++iAIStar1;
}
}
if (iStar1 == 5) {
++iBingo;
}
if (iAIStar1 == 5) {
++iAIBingo;
}
}
return 0;
}
728x90
๋ฐ์ํ
'๐ฉโ๐ป IoT (Embedded) > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[inflearn ๊ฐ์] ๊ตฌ์กฐ์ฒด - ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์ฉํ ํ์๊ด๋ฆฌํ๋ก๊ทธ๋จ 1 (0) | 2023.07.04 |
---|---|
[inflearn ๊ฐ์] ๊ตฌ์กฐ์ฒด - ๊ตฌ์กฐ์ฒด์ ๋ฌธ์์ดํจ์ (0) | 2023.07.04 |
[inflearn ๊ฐ์] ๋น๊ณ ๊ฒ์ - ๋น๊ณ ๊ฒ์ AI Easy Mode (0) | 2023.07.03 |
[inflearn ๊ฐ์] ๋น๊ณ ๊ฒ์ - ๋น๊ณ ๊ฒ์ 2 (0) | 2023.07.03 |
[inflearn ๊ฐ์] ๋น๊ณ ๊ฒ์ - ๋น๊ณ ๊ฒ์ 1 (0) | 2023.07.03 |
Comments