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); }
public ChessPieceMoveDefinition(int fileMoveSteps, int rankMoveSteps, int maxMove, ChessPieceMoveDirections moveDirections) { this.FileMoveSteps = fileMoveSteps; this.RankMoveSteps = rankMoveSteps; this.MaxMove = maxMove; this.MoveDirections = moveDirections; }