DO-31 Feat: 렌주 룰 삼삼 금지 감지 클래스 작성
- 렌주룰 공통 클래스 생성 - 삼삼 금수 감지 클래스 생성
This commit is contained in:
parent
fe1f22f1eb
commit
7541e9195e
3
Assets/Script/Renju.meta
Normal file
3
Assets/Script/Renju.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9e453dac194545d582fc99e19ea52a4f
|
||||||
|
timeCreated: 1741960614
|
161
Assets/Script/Renju/DoubleThreeDetector.cs
Normal file
161
Assets/Script/Renju/DoubleThreeDetector.cs
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 렌주 룰에서 삼삼 금수 위치를 감지하는 클래스
|
||||||
|
/// </summary>
|
||||||
|
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<Enums.PlayerType> line = new List<Enums.PlayerType>();
|
||||||
|
|
||||||
|
// 현재 위치 추가
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 수집한 라인에서 열린 삼 패턴이 있는지 검사
|
||||||
|
/// </summary>
|
||||||
|
private bool CheckOpenThreePatterns(List<Enums.PlayerType> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 라인을 문자열로 변환 (디버깅 및 패턴 비교용)
|
||||||
|
/// </summary>
|
||||||
|
private string ConvertLineToString(List<Enums.PlayerType> 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;
|
||||||
|
}
|
||||||
|
}
|
3
Assets/Script/Renju/DoubleThreeDetector.cs.meta
Normal file
3
Assets/Script/Renju/DoubleThreeDetector.cs.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cb7f46b4a369421aa9fbcb2d1b53c68a
|
||||||
|
timeCreated: 1741960686
|
37
Assets/Script/Renju/RenjuDetector.cs
Normal file
37
Assets/Script/Renju/RenjuDetector.cs
Normal file
@ -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;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 좌표가 보드 범위 내에 있는지 확인
|
||||||
|
/// </summary>
|
||||||
|
private protected bool IsValidPosition(int row, int col)
|
||||||
|
{
|
||||||
|
var inBoardSizeRow = row >= 0 && row < _boardSize;
|
||||||
|
var inBoardSizeCol = col >= 0 && col < _boardSize;
|
||||||
|
|
||||||
|
return inBoardSizeRow && inBoardSizeCol;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 해당 위치가 비어있는지 확인
|
||||||
|
/// </summary>
|
||||||
|
private protected bool IsEmptyPosition(Enums.PlayerType[,] board, int row, int col)
|
||||||
|
{
|
||||||
|
if (!IsValidPosition(row, col)) return false;
|
||||||
|
|
||||||
|
return board[row, col] == Enums.PlayerType.None;
|
||||||
|
}
|
||||||
|
}
|
3
Assets/Script/Renju/RenjuDetector.cs.meta
Normal file
3
Assets/Script/Renju/RenjuDetector.cs.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b1d1da5571994d3cbe7d3e0c342fd7e3
|
||||||
|
timeCreated: 1741960754
|
Loading…
x
Reference in New Issue
Block a user