C++/C++입문

[C++] 빙고 게임 하드모드

나는야 개발자 2025. 3. 27. 07:20
반응형

이전학습

- 링크 : 빙고게임_이지모드

 

 

줄 체크용 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