반응형
이전학습
- 링크 : 빙고게임_이지모드
줄 체크용 enum 추가
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
};
하드모드 선택 기능 추가
...생략
//AI가 선택할 수 있는 목록에서 숫자를 선택한다.
switch (iAIMode)
{
AI Easy 모드
...생략
case AM_HARD:
// 하드모드는 재 숫자중 빙고줄 완성 가능성이 가장 높은 줄을 찾아, 그 줄에 있는 숫자중 하나를 *로 만든다.
int iLine = 0;
int iStarCount = 0;
int iSaveCount = 0;
//가로 라인 중에 가장 *이 많은 라인을 찾아낸다.
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 5; ++j)
{
//가로줄 체크
if (iAIArray[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)
{
iStarCount = 0;
for (int j = 0; j < 5; ++j)
{
if (iAIArray[j * 5 + i] == 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 (iAIArray[i] == INT_MAX)
{
++iStarCount;
}
}
if (iStarCount < 5 && iSaveCount < iStarCount)
{
//왼쪽 -> 오른쪽 대각선 체크
//대각선은 10번으로 의미를 부여
iLine = LN_LT;
iSaveCount = iStarCount;
}
//오른쪽 -> 왼쪽 대각선 체크
iStarCount = 0;
for (int i = 4; i <= 20; i += 4)
{
if (iAIArray[i] == INT_MAX)
{
++iStarCount;
}
}
if (iStarCount < 5 && iSaveCount < iStarCount)
{
//오른쪽 -> 왼쪽 대각선 체크
//대각선은 11번으로 의미를 부여
iLine = LN_RT;
iSaveCount = iStarCount;
}
//모든 라인을 조사했으면 iLine에는 가장 별이 많은 라인이 저장되어 있다.
//그 라인에 있는 *이 아닌 숫자중 하나를 선택한다.
//가로줄일 경우
if (iLine <= LN_H5)
{
for (int i = 0; i < 5; ++i)
{
if (iAIArray[iLine * 5 + i] != INT_MAX)
{
iInput = iAIArray[iLine * 5 + i];
break;
}
}
}
//세로줄일 경우
else if (iLine <= LN_V5)
{
for (int i = 0; i < 5; ++i)
{
if (iAIArray[i * 5 + (iLine - 5)] != INT_MAX)
{
iInput = iAIArray[i * 5 + (iLine - 5)];
break;
}
}
}
//왼쪽 -> 오른쪽 대각선
else if (iLine == LN_LT)
{
for (int i = 0; i < 25; i += 6)
{
if (iAIArray[i] != INT_MAX)
{
iInput = iAIArray[i];
break;
}
}
}
//오른쪽 -> 왼쪽 대각선
else if (iLine == LN_RT)
{
for (int i = 4; i <= 20; i += 4)
{
if (iAIArray[i] != INT_MAX)
{
iInput = iAIArray[i];
break;
}
}
}
break;
}
...생략
- 하드모드는 재 숫자중 빙고줄 완성 가능성이 가장 높은 줄을 찾아, 그 줄에 있는 숫자중 하나를 *로 만든다.
- 가로, 세로, 대각선에 for문을 돌며 가장 별이 많은 라인을 찾아 그중에 숫자 하나를 선택
결과
- 가장 별이 많은 라인부터 하나씩 별로 변경
반응형
'C++ > C++입문' 카테고리의 다른 글
[C++] 1. TextRPG (0) | 2025.03.28 |
---|---|
[C++] 구조체와 문자열 (0) | 2025.03.28 |
[C++] 빙고 게임_3 (0) | 2025.03.26 |
[C++] 빙고 게임_2 (0) | 2025.03.26 |
[C++] 빙고 게임_1 (0) | 2025.03.25 |