반응형
- 착수 금지 프리팹 생성
- 모든 금수 로직 적용
33금수에 관해서는 저번 포스팅에서 다뤘으니 넘어가고 44부터 로직을 살펴보자
착수 우선순위는 저번 포스팅에서 나왔듯이 오목을 만들 수 있는게 아니면
전부 금수가 될 수 있다.
금수 우선순위로는 1순위가 6목 이상, 2순위가 44, 3순위가 33이다.
int CountInLine(int y, int x, int dy, int dx)
{
int count = 1;
int nx = x + dx;
int ny = y + dy;
while (InBoard(ny, nx))
{
if (cells[ny][nx].GetStoneType != Define.StoneType.BLACK)
break;
count++;
nx += dx;
ny += dy;
}
nx = x - dx;
ny = y - dy;
while (InBoard(ny, nx))
{
if (cells[ny][nx].GetStoneType != Define.StoneType.BLACK)
break;
count++;
nx -= dx;
ny -= dy;
}
return count;
}
Define.OmokPlaceType GetOmokPlaceType(int y, int x)
{
Define.OmokPlaceType ret = Define.OmokPlaceType.VALID;
int len = Directions.GetLength(0);
bool is4 = false;
int max = 0;
if (Check33(y, x) == true)
ret = Define.OmokPlaceType.DOUBLE_THREE;
for (int i = 0; i < len; i++)
{
int dx = Directions[i, 1];
int dy = Directions[i, 0];
int cnt = CountInLine(y, x, dy, dx);
if (max < cnt)
max = cnt;
if (cnt == 4)
{
if (is4 == true)
ret = Define.OmokPlaceType.DOUBLE_FOUR;
else
is4 = true;
}
}
switch (max)
{
case 9:
ret = Define.OmokPlaceType.NINE;
break;
case 8:
ret = Define.OmokPlaceType.EIGHT;
break;
case 7:
ret = Define.OmokPlaceType.SEVEN;
break;
case 6:
ret = Define.OmokPlaceType.SIX;
break;
case 5:
ret = Define.OmokPlaceType.FIVE;
break;
}
return ret;
}
CountInLine은 단순히 연속된 돌의 갯수를 측정하는 함수이다.
이것으로 4방향(가로, 세로, 대각 2방향)을 체크하고 44인지, 6목이상인지 체크한다.
ret의 값에 따라 착수할때마다 보드판의 정보를 적절히 업데이트를 해주면 된다.
반응형
'프로젝트 일기' 카테고리의 다른 글
모바일 온라인 오목 프로젝트 - 4 (0) | 2025.05.04 |
---|---|
모바일 온라인 오목 프로젝트 - 2 (0) | 2025.04.30 |
모바일 온라인 오목 프로젝트 - 1 (1) | 2025.04.29 |