137 lines
4.3 KiB
C#
137 lines
4.3 KiB
C#
using System.Collections.Generic;
|
|
using System.Text;
|
|
using UnityEngine;
|
|
|
|
|
|
public class RenjuForbiddenMoveDetector : ForbiddenDetectorBase
|
|
{
|
|
// 렌주 룰 금수 감지기 생성
|
|
private RenjuOverlineDetector _overlineDetactor = new();
|
|
private RenjuDoubleFourDetector _doubleFourDetactor = new();
|
|
private RenjuDoubleThreeDetector _doubleThreeDetector = new();
|
|
|
|
/// <summary>
|
|
/// 렌주 룰로 금수 리스트를 반환하는 함수
|
|
/// </summary>
|
|
/// <param name="board">현재 보드의 상태</param>
|
|
/// <returns>금수 좌표를 담은 리스트</returns>
|
|
public List<Vector2Int> RenjuForbiddenMove(Enums.PlayerType[,] board)
|
|
{
|
|
|
|
var forbiddenCount = 0;
|
|
List<Vector2Int> forbiddenMoves = new();
|
|
List<Vector2Int> tempForbiddenMoves = new();
|
|
for (int row = 0; row < BoardSize; row++)
|
|
{
|
|
for (int col = 0; col < BoardSize; col++)
|
|
{
|
|
// ** 비어 있지 않으면 검사할 필요 없음 **
|
|
if (!IsEmptyPosition(board, row, col)) continue;
|
|
|
|
// 장목 검사
|
|
if (_overlineDetactor.IsOverline(board, row, col))
|
|
{
|
|
forbiddenCount++;
|
|
Debug.Log("장목 금수 좌표 X축 : " + row + ", Y축 : " + col);
|
|
forbiddenMoves.Add(new Vector2Int(row, col));
|
|
continue;
|
|
}
|
|
|
|
// 4-4 검사
|
|
if (_doubleFourDetactor.IsDoubleFour(board, row, col))
|
|
{
|
|
forbiddenCount++;
|
|
Debug.Log("사사 금수 좌표 X축 : " + row + ", Y축 : " + col);
|
|
forbiddenMoves.Add(new Vector2Int(row, col));
|
|
continue;
|
|
}
|
|
|
|
if(forbiddenCount > 0) continue;
|
|
|
|
// 3-3 검사
|
|
if (_doubleThreeDetector.IsDoubleThree(board, row, col))
|
|
{
|
|
tempForbiddenMoves.Add(new Vector2Int(row, col));
|
|
// if (!SimulateDoubleFour(tempBoard))
|
|
// {
|
|
// Debug.Log("삼삼 금수 좌표 X축 : " + row + ", Y축 : " + col);
|
|
// forbiddenMoves.Add(new Vector2Int(row, col));
|
|
// }
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach (var pos in tempForbiddenMoves)
|
|
{
|
|
board[pos.x, pos.y] = Black;
|
|
if (!SimulateDoubleFour(board)&& !SimulateOverline(board))
|
|
{
|
|
Debug.Log("X: "+pos.x + "Y: "+ pos.y);
|
|
forbiddenMoves.Add(new Vector2Int(pos.x, pos.y));
|
|
}
|
|
}
|
|
|
|
|
|
Debug.Log(DebugBoard(board));
|
|
return forbiddenMoves;
|
|
}
|
|
|
|
|
|
|
|
private bool SimulateDoubleFour(Enums.PlayerType[,] board)
|
|
{
|
|
for (int row = 0; row < BoardSize; row++)
|
|
{
|
|
for (int col = 0; col < BoardSize; col++)
|
|
{
|
|
if (_doubleFourDetactor.IsDoubleFour(board, row, col))
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private bool SimulateOverline(Enums.PlayerType[,] board)
|
|
{
|
|
for (int row = 0; row < BoardSize; row++)
|
|
{
|
|
for (int col = 0; col < BoardSize; col++)
|
|
{
|
|
if (_overlineDetactor.IsOverline(board, row, col))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 보드 상태를 시각적으로 출력하는 디버깅 함수
|
|
/// </summary>
|
|
/// <param name="board">현재 보드 상태</param>
|
|
/// <returns>보드의 시각적 표현 문자열</returns>
|
|
private string DebugBoard(Enums.PlayerType[,] board)
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
for (int row = 0; row < BoardSize; row++)
|
|
{
|
|
for (int col = 0; col < BoardSize; col++)
|
|
{
|
|
sb.Append(board[row, col] switch
|
|
{
|
|
Enums.PlayerType.None => "□",
|
|
Enums.PlayerType.PlayerA => "●",
|
|
Enums.PlayerType.PlayerB => "○",
|
|
_ => "?"
|
|
});
|
|
}
|
|
sb.AppendLine(); // 줄바꿈 추가
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
}
|
|
|