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 _forbiddenMoves = new List(); #endregion public GameLogic(StoneController stoneController, Enums.GameType gameType) { //보드 초기화 _board = new Enums.PlayerType[15, 15]; _stoneController = stoneController; selectedRow = -1; selectedCol = -1; lastRow = -1; lastCol = -1; #region Renju Init // 금수 감지기 초기화 _forbiddenDetector = new RenjuForbiddenMoveDetector(); #endregion currentTurn = Enums.PlayerType.PlayerA; SetState(currentTurn); } private void SetState(Enums.PlayerType player) { currentTurn = player; #region Renju Turn Set // 턴이 변경될 때마다 금수 위치 업데이트 UpdateForbiddenMoves(); #endregion _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() { ClearForbiddenMarks(); if (currentTurn == Enums.PlayerType.PlayerA) { _forbiddenMoves = _forbiddenDetector.RenjuForbiddenMove(_board); foreach (var pos in _forbiddenMoves) { SetStoneNewState(Enums.StoneState.Blocked, pos.x, pos.y); } } } // 이전에 표시된 금수 마크 제거 private void ClearForbiddenMarks() { foreach (var forbiddenMove in _forbiddenMoves) { Vector2Int pos = forbiddenMove; if (_board[pos.x, pos.y] == Enums.PlayerType.None) { SetStoneNewState(Enums.StoneState.None, pos.x, pos.y); } } } #endregion }