Пример #1
0
        public virtual bool IsValidMove(BoardCoordinate newCoordinate)
        {
            bool isValidMove = false;

            foreach (ChessPieceMoveDefinition moveDefinition in this.AllowedMoves)
            {
                int maxSteps  = moveDefinition.MaxMove;
                int fileSteps = (int)newCoordinate.File - (int)this.CurrentLocation.File;
                int rankSteps = (int)newCoordinate.Rank - (int)this.CurrentLocation.Rank;
                ChessPieceMoveDirections directionMoved = ChessPieceMoveDirections.None;

                // check flags for direction moved
                directionMoved |= (fileSteps > 0 ? ChessPieceMoveDirections.PositiveFile : (fileSteps < 0 ? ChessPieceMoveDirections.NegativeFile : ChessPieceMoveDirections.None));
                directionMoved |= (rankSteps > 0 ? ChessPieceMoveDirections.PositiveRank : (rankSteps < 0 ? ChessPieceMoveDirections.NegativeRank : ChessPieceMoveDirections.None));

                if (!moveDefinition.MoveDirections.HasFlag(directionMoved))
                {
                    continue;
                }

                if (moveDefinition.FileMoveSteps == 0 && moveDefinition.RankMoveSteps != 0)
                {
                    if ((fileSteps == 0 && moveDefinition.FileMoveSteps == 0) &&
                        ((Math.Abs(rankSteps) % moveDefinition.RankMoveSteps == 0) && (Math.Abs(rankSteps) / moveDefinition.RankMoveSteps) <= maxSteps))
                    {
                        isValidMove = true;
                        break;
                    }
                }
                else if (moveDefinition.FileMoveSteps != 0 && moveDefinition.RankMoveSteps == 0)
                {
                    if ((rankSteps == 0 && moveDefinition.RankMoveSteps == 0) &&
                        ((Math.Abs(fileSteps) % moveDefinition.FileMoveSteps == 0) && (Math.Abs(fileSteps) / moveDefinition.FileMoveSteps) <= maxSteps))
                    {
                        isValidMove = true;
                        break;
                    }
                }
                else if (moveDefinition.FileMoveSteps != 0 && moveDefinition.RankMoveSteps != 0)
                {
                    if (((Math.Abs(rankSteps) % moveDefinition.RankMoveSteps == 0) && (Math.Abs(rankSteps) / moveDefinition.RankMoveSteps) <= maxSteps) &&
                        ((Math.Abs(fileSteps) % moveDefinition.FileMoveSteps == 0) && (Math.Abs(fileSteps) / moveDefinition.FileMoveSteps) <= maxSteps) &&
                        (Math.Abs(fileSteps) / moveDefinition.FileMoveSteps == Math.Abs(rankSteps) / moveDefinition.RankMoveSteps))
                    {
                        isValidMove = true;
                        break;
                    }
                }
                else if (moveDefinition.FileMoveSteps == 0 && moveDefinition.RankMoveSteps == 0)
                {
                }
            }

            return(isValidMove);
        }
Пример #2
0
 public ChessPieceMoveDefinition(int fileMoveSteps, int rankMoveSteps, int maxMove, ChessPieceMoveDirections moveDirections)
 {
     this.FileMoveSteps  = fileMoveSteps;
     this.RankMoveSteps  = rankMoveSteps;
     this.MaxMove        = maxMove;
     this.MoveDirections = moveDirections;
 }