반응형
- 33 금수 로직 적용
- 오목판, 오목돌 프리팹 생성
33 금수 로직
렌주룰 33 금수 적용 방식은 아래와 같다.
- 흑돌만 해당된다.
- 돌을 놓을 칸 기준 놓는다면 열린3이 두개 이상이 되어야 한다. ex) 십자 중간
- 만약 5목을 만들 수 있다면 33금수는 무시된다.
- 6목 이상 금수가 우선순위, 그 다음 44 금수가 우선순위가 되어야 한다.
열린3 이란?
- 돌을 놓았을 때 연속으로 3개의 돌이 되어야함
- 양 옆으로 막혀있지 않은 경우
간단하게 우선순위를 코드로 짜본다면
if (IsInMap(y, x) == false)
return;
if (5목이 되는가?)
돌을 놓는다;
else if (6목 이상인가?)
6목 이상 금수;
else if (44인가?)
44 금수;
else if (33인가?)
33 금수;
else
돌을 놓는다;
이런식으로 우선순위를 짤 수 있다.
열린 3인지 확인하는 코드는 아래와 같다.
bool IsOpenThree(int x, int y, int dx, int dy)
{
int count = 1;
bool firstBlank = false;
bool forwardOpen = false;
bool backwardOpen = false;
// 전방 (한 방향)
int nx = x + dx;
int ny = y + dy;
while (InBoard(ny, nx))
{
if (cells[ny][nx].GetStoneType == Define.StoneType.BLACK)
{
count++;
nx += dx;
ny += dy;
}
else if (cells[ny][nx].GetStoneType == Define.StoneType.NONE)
{
if (!firstBlank)
{
firstBlank = true;
nx += dx;
ny += dy;
}
else
{
forwardOpen = true;
break;
}
}
else break;
}
// 후방 (반대 방향)
firstBlank = false;
nx = x - dx;
ny = y - dy;
while (InBoard(ny, nx))
{
if (cells[ny][nx].GetStoneType == Define.StoneType.BLACK)
{
count++;
nx -= dx;
ny -= dy;
}
else if (cells[ny][nx].GetStoneType == Define.StoneType.NONE)
{
if (!firstBlank)
{
firstBlank = true;
nx -= dx;
ny -= dy;
}
else
{
backwardOpen = true;
break;
}
}
else break;
}
// 쓰리 판단
return (count == 3) && forwardOpen && backwardOpen;
}
y, x는 놓을 칸이고 dy, dx는
{ 0, 1 }, // →
{ 1, 0 }, // ↓
{ 1, 1 }, // ↘
{ 1, -1 } // ↙
중에 하나이다.
- 중간에 빈칸이 나오더라도 오목에서는 연속된 3으로 처리할 수도 있다.
- 그렇기에 firstBlank를 이용해 첫 빈칸은 무시하도록 하고 이후의 빈칸이 나왔다면 해당 방향은 열린것으로 판단한다.
- 이 방법을 양 방향에 적용시켜서 만약 양 방향 모두 열려있으면서 count가 3이라면 열린3으로 처리
- 이 함수를 통해 열린3이 두번 이상 나오게 된다면 그것은 33 금수가 된다.
반응형
'프로젝트 일기' 카테고리의 다른 글
모바일 온라인 오목 프로젝트 - 4 (0) | 2025.05.04 |
---|---|
모바일 온라인 오목 프로젝트 - 3 (1) | 2025.05.01 |
모바일 온라인 오목 프로젝트 - 1 (1) | 2025.04.29 |