Degullmok-client/Assets/Script/Renju/RenjuOverlineDetector.cs

103 lines
3.2 KiB
C#

public class RenjuOverlineDetector : ForbiddenDetectorBase
{
/// <summary>
/// 장목 여부를 검사합니다.
/// </summary>
/// <param name="board">현재 보드 상태</param>
/// <param name="row">행 (y 좌표)</param>
/// <param name="col">열 (x 좌표)</param>
/// <returns>장목이면 true, 아니면 false</returns>
public bool IsOverline(Enums.PlayerType[,] board, int row, int col)
{
// 임시로 돌 놓기
board[row, col] = Black;
// 장목 검사
bool isOverline = CheckOverline(board, row, col);
board[row, col] = Space;
return isOverline;
}
/// <summary>
/// 장목(6목 이상) 여부를 검사합니다.
/// </summary>
private bool CheckOverline(Enums.PlayerType[,] board, int row, int col)
{
// 4개의 방향 쌍에 대해 검사
for (int i = 0; i < 4; i++)
{
int dir1 = DirectionPairs[i, 0];
int dir2 = DirectionPairs[i, 1];
// 해당 방향 쌍에서 연속된 돌의 총 개수 계산
int count = CountConsecutiveStones(board, row, col, dir1, dir2);
// 6목 이상이면 장목
if (count >= 6)
{
return true;
}
}
return false;
}
/// <summary>
/// 특정 방향 쌍에서 연속된 돌의 개수를 계산합니다.
/// </summary>
/// <param name="board">현재 보드 상태</param>
/// <param name="row">시작 행</param>
/// <param name="col">시작 열</param>
/// <param name="dir1">첫 번째 방향 인덱스</param>
/// <param name="dir2">두 번째(반대) 방향 인덱스</param>
/// <returns>연속된 돌의 총 개수</returns>
private int CountConsecutiveStones(Enums.PlayerType[,] board, int row, int col, int dir1, int dir2)
{
int count = 1; // 현재 위치의 돌 포함
// 첫 번째 방향으로 연속된 돌 확인
count += CountInDirection(board, row, col, dir1);
// 두 번째(반대) 방향으로 연속된 돌 확인
count += CountInDirection(board, row, col, dir2);
return count;
}
/// <summary>
/// 특정 방향으로의 연속된 돌 개수를 계산합니다.
/// </summary>
/// <param name="board">현재 보드 상태</param>
/// <param name="startRow">시작 행</param>
/// <param name="startCol">시작 열</param>
/// <param name="dirIndex">방향 인덱스</param>
/// <param name="playerType">검사할 플레이어 타입</param>
/// <returns>해당 방향의 연속된 돌 개수</returns>
private int CountInDirection(Enums.PlayerType[,] board, int startRow, int startCol, int dirIndex)
{
int count = 0;
int dRow = Directions[dirIndex, 0];
int dCol = Directions[dirIndex, 1];
for (int i = 1; i < _boardSize; i++)
{
int newRow = startRow + dRow * i;
int newCol = startCol + dCol * i;
if (IsInBounds(newRow, newCol) && board[newRow, newCol] == Black)
{
count++;
}
else
{
break;
}
}
return count;
}
}