public void MovePlayer(QuoridorPlayer player, Move move) { if (!Players.Contains(player)) { throw new ArgumentException(); } if (move.IsMove) { var position = TranslatePlayerPosition(player, move.Destination); #if _USE_ADDITIONAL_VALIDATION if (!MoveValidator.IsValid(GetBoardArray(), player.CurrentPosition, Players.Select(p => p.CurrentPosition), position)) { //this is kind of second time validation - we dont neceserry need it in production throw new ArgumentException(); } #endif var playerBoardElement = this[player.CurrentPosition]; this[player.CurrentPosition] = BoardElementType.Empty; BoardMatrix[player.CurrentPosition.Y][player.CurrentPosition.X].Player = null; player.CurrentPosition = position; this[player.CurrentPosition] = playerBoardElement; BoardMatrix[player.CurrentPosition.Y][player.CurrentPosition.X].Player = player; } else if (move.IsWallPlacement) { var positions = move.WallPlacementPositions.Select(p => TranslatePlayerPosition(player, p)); #if _USE_ADDITIONAL_VALIDATION if (!WallValidator.AreValid(GetBoardArray(), Players, player, positions.ToArray())) { //this is kind of second time validation - we dont neceserry need it in production throw new ArgumentException(); } #endif foreach (var position in positions) { this[position] = BoardElementType.Wall; } } else { throw new ArgumentException(); } }
private Move TryPlaceWall(Position position, Point clickPoint, Point centerOfElement, QuoridorPlayer currentPlayer) { if (this[position] != BoardElementType.EmptyForWall || currentPlayer.NumberOfWallsAvalaible <= 0) { return(null); } Position wall1Position = null; // = new Position(1, 0); Position wall2Position = null; // = new Position(2, 0); var boardArray = GetBoardArray(); if (BoardMatrix[position.Y][position.X].IsHorizontalWall) { wall1Position = new Position(1, 0); wall2Position = new Position(2, 0); if (clickPoint.X <= centerOfElement.X) { wall1Position = -wall1Position; wall2Position = -wall2Position; } } else if (BoardMatrix[position.Y][position.X].IsVerticalWall) { wall1Position = new Position(0, 1); wall2Position = new Position(0, 2); if (clickPoint.Y <= centerOfElement.Y) { wall1Position = -wall1Position; wall2Position = -wall2Position; } } else if (BoardMatrix[position.Y][position.X].IsMicroWall) { //TODO: handle this rare case when user clicks exactly on micro wall return(null); } if (WallValidator.AreValid(boardArray, Players, currentPlayer, position, position + wall2Position, position + wall1Position)) { // if (changeAllowed) { PlaceWall(position); PlaceWall(position + wall1Position); PlaceWall(position + wall2Position); } return(new Move { IsWallPlacement = true, WallPlacementPositions = new[] { position, position + wall2Position, position + wall1Position } }); } if (WallValidator.AreValid(boardArray, Players, currentPlayer, position, position - wall2Position, position - wall1Position)) { // if (changeAllowed) { PlaceWall(position); PlaceWall(position - wall1Position); PlaceWall(position - wall2Position); } return(new Move { IsWallPlacement = true, WallPlacementPositions = new[] { position, position - wall2Position, position - wall1Position } }); } return(null); }
public override async Task <Move> GetMove() { Move newMove = null; await Task.Run(() => { var boardCopy = board.GetBoardArray(); do { RollNewPosition(); if (random.NextDouble() <= _probabilityOfWallPlacement && NumberOfWallsAvalaible > 0 && WallValidator.AreValid(boardCopy, board.Players, this, wallPositions)) { newMove = new Move() { IsWallPlacement = true, WallPlacementPositions = wallPositions }; } else if (MoveValidator.IsValid(boardCopy, CurrentPosition, board.PlayersPositions, movePosition)) { newMove = new Move() { Destination = movePosition }; } } while (newMove == null); System.Threading.Tasks.Task.Delay(500).Wait();//AI is thinking :D if (newMove.IsWallPlacement) { NumberOfWallsAvalaible--; } }); return(newMove); }