155 lines
4.7 KiB
C#
155 lines
4.7 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class GameLogic : MonoBehaviour
|
|
{
|
|
private Enums.PlayerType[,] _board;
|
|
private StoneController _stoneController;
|
|
public Enums.PlayerType currentTurn;
|
|
//선택된 좌표
|
|
public int selectedRow;
|
|
public int selectedCol;
|
|
//마지막 배치된 좌표
|
|
public int lastRow;
|
|
public int lastCol;
|
|
|
|
#region Renju Members
|
|
// 렌주룰 금수 검사기
|
|
private RenjuForbiddenMoveDetector _forbiddenDetector;
|
|
|
|
// 현재 금수 위치 목록
|
|
private List<(Vector2Int position, ForbiddenType type)> _forbiddenMoves = new List<(Vector2Int, ForbiddenType)>();
|
|
|
|
#endregion
|
|
|
|
public GameLogic(StoneController stoneController, Enums.GameType gameType)
|
|
{
|
|
//보드 초기화
|
|
_board = new Enums.PlayerType[15, 15];
|
|
_stoneController = stoneController;
|
|
selectedRow = -1;
|
|
selectedCol = -1;
|
|
lastRow = -1;
|
|
lastCol = -1;
|
|
|
|
// 금수 감지기 초기화
|
|
_forbiddenDetector = new RenjuForbiddenMoveDetector();
|
|
|
|
currentTurn = Enums.PlayerType.PlayerA;
|
|
|
|
SetState(currentTurn);
|
|
}
|
|
|
|
private void SetState(Enums.PlayerType player)
|
|
{
|
|
currentTurn = player;
|
|
|
|
// 턴이 변경될 때마다 금수 위치 업데이트
|
|
UpdateForbiddenMoves();
|
|
|
|
_stoneController.OnStoneClickedDelegate = (row, col) =>
|
|
{
|
|
if (_board[row, col] == Enums.PlayerType.None)
|
|
{
|
|
if ((selectedRow != row || selectedCol != col) && (selectedRow != -1 && selectedCol != -1))
|
|
{
|
|
SetStoneNewState(Enums.StoneState.None,selectedRow, selectedCol);
|
|
}
|
|
selectedRow = row;
|
|
selectedCol = col;
|
|
SetStoneNewState(Enums.StoneState.Selected, row, col);
|
|
}
|
|
};
|
|
}
|
|
|
|
//보드에 돌추가 함수
|
|
public void SetNewBoardValue(Enums.PlayerType playerType, int row, int col)
|
|
{
|
|
if (_board[row, col] == Enums.PlayerType.None)
|
|
{
|
|
if (playerType == Enums.PlayerType.PlayerA)
|
|
{
|
|
_stoneController.SetStoneType(Enums.StoneType.Black, row, col);
|
|
_stoneController.SetStoneState(Enums.StoneState.LastPositioned, row, col);
|
|
_board[row, col] = Enums.PlayerType.PlayerA;
|
|
LastNSelectedSetting(row, col);
|
|
|
|
SetState(Enums.PlayerType.PlayerB);
|
|
}
|
|
if (playerType == Enums.PlayerType.PlayerB)
|
|
{
|
|
_stoneController.SetStoneType(Enums.StoneType.White, row, col);
|
|
_stoneController.SetStoneState(Enums.StoneState.LastPositioned, row, col);
|
|
_board[row, col] = Enums.PlayerType.PlayerB;
|
|
|
|
LastNSelectedSetting(row, col);
|
|
SetState(Enums.PlayerType.PlayerA);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void LastNSelectedSetting(int row, int col)
|
|
{
|
|
//첫수 확인
|
|
if (lastRow != -1 || lastCol != -1)
|
|
{
|
|
_stoneController.SetStoneState(Enums.StoneState.None, lastRow, lastCol);
|
|
}
|
|
//마지막 좌표 저장
|
|
lastRow = row;
|
|
lastCol = col;
|
|
//선택 좌표 초기화
|
|
selectedRow = -1;
|
|
selectedCol = -1;
|
|
}
|
|
|
|
//스톤의 상태변경 명령함수
|
|
private void SetStoneNewState(Enums.StoneState state, int row, int col)
|
|
{
|
|
_stoneController.SetStoneState(state, row, col);
|
|
}
|
|
|
|
|
|
#region Renju Rule Detector
|
|
|
|
// 금수 위치 업데이트 및 표시
|
|
private void UpdateForbiddenMoves()
|
|
{
|
|
// TODO: 이전 금수 표시 제거
|
|
ClearForbiddenMarks();
|
|
|
|
// 흑돌 차례에만 금수 규칙 적용
|
|
if (currentTurn == Enums.PlayerType.PlayerA)
|
|
{
|
|
// 모든 금수의 위치 찾기
|
|
_forbiddenMoves = _forbiddenDetector.FindAllForbiddenMoves(_board);
|
|
foreach (var forbiddenMove in _forbiddenMoves)
|
|
{
|
|
Vector2Int pos = forbiddenMove.position;
|
|
SetStoneNewState(Enums.StoneState.Blocked, pos.x, pos.y);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 백돌 차례면 금수 목록 비우기
|
|
_forbiddenMoves.Clear();
|
|
}
|
|
}
|
|
|
|
// 이전에 표시된 금수 마크 제거
|
|
private void ClearForbiddenMarks()
|
|
{
|
|
foreach (var forbiddenMove in _forbiddenMoves)
|
|
{
|
|
Vector2Int pos = forbiddenMove.position;
|
|
if (_board[pos.x, pos.y] == Enums.PlayerType.None)
|
|
{
|
|
SetStoneNewState(Enums.StoneState.None, pos.x, pos.y);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|