コード例 #1
0
ファイル: Board.cs プロジェクト: Mamelski/-PG-QuoridorGame
        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();
            }
        }
コード例 #2
0
ファイル: Board.cs プロジェクト: Mamelski/-PG-QuoridorGame
        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);
        }
コード例 #3
0
        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);
        }