/// <summary> /// Checks whether it is ok to perform move on Position <paramref name="pos"/> on SubBoard <paramref name="board"/>. /// </summary> /// <param name="board"></param> /// <param name="pos"></param> /// <returns></returns> public bool IsValidMove(SubBoard board, Position pos) { return(pos.X >= 0 && pos.Y >= 0 && pos.X <= 2 && pos.Y <= 2 && board.GetMarker(pos) == MarkerType.Empty && board.IsActive); }
public IEnumerable <BoardSquare> GetSubBoard(SubBoard subBoard) { var result = new List <BoardSquare>(9); for (var row = 0; row < _board.GetLength(0); row++) { for (var col = 0; col < _board.GetLength(1); col++) { if (_board[row, col].GetSubBoard(col, row) != subBoard) { continue; } if (!_board[row, col].IsEmpty()) { result.Add(_board[row, col]); } } } return(result); }
/// <summary> /// Loads a board from a persisted state into <paramref name="boardDto"/>. /// </summary> /// <param name="rules">The rules to use with the loaded board.</param> /// <param name="boardDto">The object to store the state in.</param> /// <returns></returns> public bool LoadBoard(IRules rules, out BoardDto boardDto) { try { boardDto = new BoardDto(); if (!_fileHandler.FileExists()) { return(false); } List <bool> activeSubboards; List <MarkerType> subboardWinners; List <List <MarkerType> > subboardsAsMarkerTypeArrays; try { var jsonDataString = _fileHandler.Read(); var jsonObject = JObject.Parse(jsonDataString); boardDto.IsPlayerOneTurn = (bool)jsonObject["game"]["isPlayerOneTurn"]; boardDto.Winner = (MarkerType)(int)jsonObject["game"]["winner"]; boardDto.PlayerOne = (MarkerType)(int)jsonObject["game"]["playerOne"]; boardDto.PlayerTwo = (MarkerType)(int)jsonObject["game"]["playerTwo"]; activeSubboards = jsonObject["game"]["activeSubboards"].Select(isActive => (bool)isActive) .ToList(); subboardWinners = jsonObject["game"]["subboardWinners"].Select(winner => (MarkerType)(int)winner) .ToList(); var subboards = from sb in jsonObject["game"]["board"] select(JArray) sb; subboardsAsMarkerTypeArrays = subboards.Select(b => b.ToObject <List <MarkerType> >()).ToList(); } catch (Exception e) { throw new SerializationException("Failed to deserialize from file, see inner exception for details", e); } var subboardArray = new SubBoard[3, 3]; var tempSubboardList = new List <SubBoard>(); int counter; for (var i = 0; i < 9; i++) { counter = 0; var subboardAsArray = subboardsAsMarkerTypeArrays[i]; var markerTypeArray = new MarkerType[3, 3]; for (var j = 0; j < 3; j++) { for (var k = 0; k < 3; k++) { markerTypeArray[j, k] = subboardAsArray[counter]; counter++; } } tempSubboardList.Add(new SubBoard(rules, markerTypeArray, activeSubboards[i], subboardWinners[i])); } counter = 0; for (var i = 0; i < 3; i++) { for (var j = 0; j < 3; j++) { subboardArray[i, j] = tempSubboardList[counter]; counter++; } } boardDto.Subboards = subboardArray; return(true); } catch (Exception e) { throw new LoadStateFailException("Failed to LoadBoard, see inner exception for details", e); } }