From 7541e9195e45b139bfe32b32b4775c028d8dd0f8 Mon Sep 17 00:00:00 2001 From: fiore Date: Fri, 14 Mar 2025 23:14:04 +0900 Subject: [PATCH] =?UTF-8?q?DO-31=20Feat:=20=EB=A0=8C=EC=A3=BC=20=EB=A3=B0?= =?UTF-8?q?=20=EC=82=BC=EC=82=BC=20=EA=B8=88=EC=A7=80=20=EA=B0=90=EC=A7=80?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 렌주룰 공통 클래스 생성 - 삼삼 금수 감지 클래스 생성 --- Assets/Script/Renju.meta | 3 + Assets/Script/Renju/DoubleThreeDetector.cs | 161 ++++++++++++++++++ .../Script/Renju/DoubleThreeDetector.cs.meta | 3 + Assets/Script/Renju/RenjuDetector.cs | 37 ++++ Assets/Script/Renju/RenjuDetector.cs.meta | 3 + 5 files changed, 207 insertions(+) create mode 100644 Assets/Script/Renju.meta create mode 100644 Assets/Script/Renju/DoubleThreeDetector.cs create mode 100644 Assets/Script/Renju/DoubleThreeDetector.cs.meta create mode 100644 Assets/Script/Renju/RenjuDetector.cs create mode 100644 Assets/Script/Renju/RenjuDetector.cs.meta diff --git a/Assets/Script/Renju.meta b/Assets/Script/Renju.meta new file mode 100644 index 0000000..0170bac --- /dev/null +++ b/Assets/Script/Renju.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9e453dac194545d582fc99e19ea52a4f +timeCreated: 1741960614 \ No newline at end of file diff --git a/Assets/Script/Renju/DoubleThreeDetector.cs b/Assets/Script/Renju/DoubleThreeDetector.cs new file mode 100644 index 0000000..53401df --- /dev/null +++ b/Assets/Script/Renju/DoubleThreeDetector.cs @@ -0,0 +1,161 @@ +using System.Collections.Generic; +using UnityEngine; + +/// +/// 렌주 룰에서 삼삼 금수 위치를 감지하는 클래스 +/// +public class DoubleThreeDetector :RenjuDetector +{ + // 해당 위치가 33 금수인지 반환 + private bool IsDoubleThree(Enums.PlayerType[,] board, int row, int col) + { + // 빈 위치가 아니면 검사할 필요 없음 + if (!IsEmptyPosition(board, row, col)) + { + return false; + } + + // 임시 보드 생성 + Enums.PlayerType[,] tempBoard = (Enums.PlayerType[,])board.Clone(); + + // 해당 위치에 흑돌 놓기 + tempBoard[row, col] = Enums.PlayerType.PlayerA; + + // 열린 삼 개수 카운트 + int openThreeCount = 0; + + // 각 방향으로 열린 삼 검사 + foreach (var dir in directions) + { + if (HasOpenThree(tempBoard, row, col, dir)) + { + openThreeCount++; + + // 디버깅 정보 + Debug.Log($"열린 삼 발견: ({row}, {col}) 방향: ({dir.x}, {dir.y})"); + + // 이미 2개의 열린 삼을 찾았으면 3-3 금수임 + if (openThreeCount >= 2) + { + return true; + } + } + } + return true; + } + + // 열린 삼을 가졌는지 확인하는 함수 + private bool HasOpenThree(Enums.PlayerType[,] board, int row, int col, Vector2Int dir) + { + int dRow = dir.x; + int dCol = dir.y; + + // 해당 위치의 돌 흑돌 = PlayerA + Enums.PlayerType stone = board[row, col]; + if (stone != Enums.PlayerType.PlayerA) + { + return false; + } + + // 각 방향으로 양쪽 6칸씩 검사 (현재 위치 포함 총 13칸) + // 보드 영역을 벗어나거나 다른 돌에 의해 막히는 경우를 고려 + List line = new List(); + + // 현재 위치 추가 + line.Add(stone); + + // 정방향으로 최대 6칸 검사 + for (int i = 1; i <= 6; i++) + { + int r = row + i * dRow; + int c = col + i * dCol; + + if (!IsValidPosition(r, c)) + { + line.Add(Enums.PlayerType.None); // 보드 바깥은 None 처리 + break; + } + + line.Add(board[r, c]); + + // 백돌을 만나면 그 이상 검사할 필요 없음 + if (board[r, c] == Enums.PlayerType.PlayerB) + { + break; + } + } + + // 역방향으로 최대 6칸 검사 + // 위에서 추가한 현재 위치를 제외하고 반대 방향 검사 + for (int i = 0; i <= 6; i++) + { + int r = row - i * dRow; + int c = col - i * dCol; + + if (!IsValidPosition(r, c)) + { + line.Insert(0, Enums.PlayerType.None); // 보드 밖은 None 처리 + break; + } + line.Insert(0, board[r, c]); + + // 백돌을 만나면 그 이상은 검사할 필요 없음 + if (board[r, c] == Enums.PlayerType.PlayerB) + { + break; + } + } + + // 수집한 라인에서 열린 삼 패턴 검사 + return CheckOpenThreePatterns(line); + } + + /// + /// 수집한 라인에서 열린 삼 패턴이 있는지 검사 + /// + private bool CheckOpenThreePatterns(List line) + { + // 라인 문자열로 변환 (디버깅 및 패턴 비교용) + string lineStr = ConvertLineToString(line); + + // 열린 삼 패턴들 + string[] openThreePatterns = { + "...XXX...", // 기본 열린 삼: ...OOO... + "..XXX..", // 벽이 있는 열린 삼: ..OOO.. + "...XX.X...", // 한 칸 띄인 열린 삼: ...OO.O... + "...X.XX...", // 한 칸 띄인 열린 삼: ...O.OO... + "..XX.X..", // 벽이 있는 한 칸 띄인 열린 삼 + "..X.XX.." // 벽이 있는 한 칸 띄인 열린 삼 + }; + + // 각 패턴에 대해 검사 + foreach (string pattern in openThreePatterns) + { + if (lineStr.Contains(pattern)) + { + Debug.Log($"열린 삼 패턴 발견: {pattern} in {lineStr}"); + return true; + } + } + + return false; + } + + /// + /// 라인을 문자열로 변환 (디버깅 및 패턴 비교용) + /// + private string ConvertLineToString(List line) + { + string result = ""; + foreach (Enums.PlayerType stone in line) + { + if (stone == Enums.PlayerType.None) + result += "."; + else if (stone == Enums.PlayerType.PlayerA) + result += "X"; + else if (stone == Enums.PlayerType.PlayerB) + result += "O"; + } + return result; + } +} \ No newline at end of file diff --git a/Assets/Script/Renju/DoubleThreeDetector.cs.meta b/Assets/Script/Renju/DoubleThreeDetector.cs.meta new file mode 100644 index 0000000..1ad31a5 --- /dev/null +++ b/Assets/Script/Renju/DoubleThreeDetector.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cb7f46b4a369421aa9fbcb2d1b53c68a +timeCreated: 1741960686 \ No newline at end of file diff --git a/Assets/Script/Renju/RenjuDetector.cs b/Assets/Script/Renju/RenjuDetector.cs new file mode 100644 index 0000000..4d8b795 --- /dev/null +++ b/Assets/Script/Renju/RenjuDetector.cs @@ -0,0 +1,37 @@ +using UnityEngine; + +public class RenjuDetector +{ + // 방향 배열 (가로, 세로, 대각선) + private protected Vector2Int[] directions = + { + new Vector2Int(1, 0), // 가로 + new Vector2Int(0, 1), // 세로 + new Vector2Int(1, 1), // 대각선 (우하향) + new Vector2Int(1, -1) // 대각선 (우상향) + }; + + // 15*15 보드 사이즈 + private protected int _boardSize = 15; + + /// + /// 좌표가 보드 범위 내에 있는지 확인 + /// + private protected bool IsValidPosition(int row, int col) + { + var inBoardSizeRow = row >= 0 && row < _boardSize; + var inBoardSizeCol = col >= 0 && col < _boardSize; + + return inBoardSizeRow && inBoardSizeCol; + } + + /// + /// 해당 위치가 비어있는지 확인 + /// + private protected bool IsEmptyPosition(Enums.PlayerType[,] board, int row, int col) + { + if (!IsValidPosition(row, col)) return false; + + return board[row, col] == Enums.PlayerType.None; + } +} diff --git a/Assets/Script/Renju/RenjuDetector.cs.meta b/Assets/Script/Renju/RenjuDetector.cs.meta new file mode 100644 index 0000000..483c2a8 --- /dev/null +++ b/Assets/Script/Renju/RenjuDetector.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b1d1da5571994d3cbe7d3e0c342fd7e3 +timeCreated: 1741960754 \ No newline at end of file