diff --git a/Assets/Script/Renju/RenjuForbiddenMoveDetector.cs b/Assets/Script/Renju/RenjuForbiddenMoveDetector.cs new file mode 100644 index 0000000..557ed90 --- /dev/null +++ b/Assets/Script/Renju/RenjuForbiddenMoveDetector.cs @@ -0,0 +1,120 @@ +using System.Collections.Generic; +using UnityEngine; + +/// +/// 렌주 규칙의 모든 금수 규칙(3-3, 4-4, 장목)을 검사하는 통합 클래스 +/// +public class RenjuForbiddenMoveDetector +{ + // 3-3, 4-4, 장목 감지기 + private DoubleThreeDetector _doubleThreeDetector; + private DoubleFourDetector _doubleFourDetector; + private OverlineDetector _overlineDetector; + + private int _boardSize = 15; + + /// + /// 렌주 금수 감지기 생성자 + /// + public RenjuForbiddenMoveDetector() + { + // 각 감지기 초기화 + _doubleThreeDetector = new DoubleThreeDetector(); + _doubleFourDetector = new DoubleFourDetector(); + _overlineDetector = new OverlineDetector(); + } + + /// + /// 모든 금수 위치를 찾아 반환 + /// + /// 현재 보드 상태 + /// 금수 위치 목록 (각 위치별 금수 타입 정보 포함) + public List<(Vector2Int position, ForbiddenType type)> FindAllForbiddenMoves(Enums.PlayerType[,] board) + { + List<(Vector2Int, ForbiddenType)> forbiddenMoves = new List<(Vector2Int, ForbiddenType)>(); + + // 흑돌 차례에만 금수 규칙 적용 + for (int row = 0; row < _boardSize; row++) + { + for (int col = 0; col < _boardSize; col++) + { + // 빈 위치만 검사 + if (board[row, col] != Enums.PlayerType.None) + { + continue; + } + + // 금수 타입 확인 + ForbiddenType type = CheckForbiddenType(board, row, col); + + // 금수인 경우 목록에 추가 + if (type != ForbiddenType.None) + { + forbiddenMoves.Add((new Vector2Int(row, col), type)); + } + } + } + + return forbiddenMoves; + } + + /// + /// 특정 위치의 금수 타입 확인 + /// + /// 현재 보드 상태 + /// 행 좌표 + /// 열 좌표 + /// 금수 타입 (None, DoubleThree, DoubleFour, Overline) + public ForbiddenType CheckForbiddenType(Enums.PlayerType[,] board, int row, int col) + { + // 빈 위치가 아니면 금수가 아님 + if (board[row, col] != Enums.PlayerType.None) + { + return ForbiddenType.None; + } + + // 장목 검사 (장목이 가장 우선) + if (_overlineDetector.IsOverline(board, row, col)) + { + return ForbiddenType.Overline; + } + + // 4-4 검사 + if (_doubleFourDetector.IsDoubleFour(board, row, col)) + { + return ForbiddenType.DoubleFour; + } + + // 3-3 검사 + if (_doubleThreeDetector.IsDoubleThree(board, row, col)) + { + return ForbiddenType.DoubleThree; + } + + // 금수 아님 + return ForbiddenType.None; + } + + /// + /// 특정 위치가 금수인지 간단히 확인 + /// + /// 현재 보드 상태 + /// 행 좌표 + /// 열 좌표 + /// 금수 여부 (true: 금수, false: 금수 아님) + public bool IsForbiddenMove(Enums.PlayerType[,] board, int row, int col) + { + return CheckForbiddenType(board, row, col) != ForbiddenType.None; + } +} + +/// +/// 금수 타입 열거형 +/// +public enum ForbiddenType +{ + None, // 금수 아님 + DoubleThree, // 3-3 금수 + DoubleFour, // 4-4 금수 + Overline // 장목 금수 +} \ No newline at end of file diff --git a/Assets/Script/Renju/RenjuForbiddenMoveDetector.cs.meta b/Assets/Script/Renju/RenjuForbiddenMoveDetector.cs.meta new file mode 100644 index 0000000..511a9bd --- /dev/null +++ b/Assets/Script/Renju/RenjuForbiddenMoveDetector.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8618553c3e244abdb040fb7378dd4b65 +timeCreated: 1741939566 \ No newline at end of file