Exemple #1
0
        public IEnumerable<Move> GetPossibleMoves(Board board)
        {
            var result = new List<Move>();
            short x = -1;
            short y = -1;

            for (x = -1; x <= 1; x++)
            {
                for (y = -1; y <= 1; y++)
                {
                    if (!(x == 0 && y == 0))
                    {
                        TryMoveToSquare(board, result, new Move(this.Location, new Coordinate(Location.X + x, Location.Y + y)), MoveType.CanAttack);
                    }
                }
            }

            if (!HasMoved)
            {
                // Can't move to escape check
                if (!IsUnderAttack(board))
                {
                    var oneRight = new Coordinate(Location.X + 1, Location.Y);
                    var twoRight = new Coordinate(Location.X + 2, Location.Y);
                    var rook = board.GetPiece((short)(Location.X + 3), Location.Y);

                    if(board.GetPiece(oneRight.X, oneRight.Y) == null && board.GetPiece(twoRight.X, twoRight.Y) == null &&
                        rook != null && rook.PieceType == PieceType.Rook && rook.HasMoved == false)
                    {
                        if(!board.CheckMoveForCheck(new Move(Location, oneRight)) &&
                            !board.CheckMoveForCheck(new Move(Location, twoRight)))
                        {
                            result.Add(new Move(Location, twoRight, rook.Location, oneRight));
                        }
                    }

                    var oneLeft = new Coordinate(Location.X - 1, Location.Y);
                    var twoLeft = new Coordinate(Location.X - 2, Location.Y);
                    var threeLeft = new Coordinate(Location.X - 3, Location.Y);
                    rook = board.GetPiece((short)(Location.X - 4), Location.X);
                    if (board.GetPiece(oneLeft.X, oneLeft.Y) == null && board.GetPiece(twoLeft.X, twoLeft.Y) == null && board.GetPiece(threeLeft.X, threeLeft.Y) == null
                        && rook != null && rook.PieceType == PieceType.Rook && rook.HasMoved == false)
                    {
                        if (!board.CheckMoveForCheck(new Move(Location, oneLeft)) &&
                            !board.CheckMoveForCheck(new Move(Location, twoLeft)) &&
                            !board.CheckMoveForCheck(new Move(Location, threeLeft)))
                        {
                            result.Add(new Move(Location, twoLeft, rook.Location, oneLeft));
                        }
                    }
                }
            }
            return result;
        }
Exemple #2
0
 protected MoveResult TryMoveToSquare(Board board, List<Move> possibleMoves, Move move, MoveType moveType)
 {
     if (move.To.IsValid)
     {
         var targetPiece = board.GetPiece(move.To.X, move.To.Y);
         if (moveType != MoveType.MustAttack && targetPiece == null)
         {
             if(!board.CheckMoveForCheck(move))
             {
                 possibleMoves.Add(move);
             }
             return new MoveResult() { Type = MoveResultType.Move };
         }
         else if(moveType != MoveType.CannotAttack && targetPiece != null && targetPiece.Player != Player)
         {
             if(!board.CheckMoveForCheck(move))
             {
                 possibleMoves.Add(move);
             }
             return new MoveResult() { Type = MoveResultType.Attack, CapturedPiece = targetPiece };
         }
     }
     return new MoveResult() { Type = MoveResultType.Invalid };
 }
Exemple #3
0
 protected MoveResult TryAttackSquare(Board board, Move move)
 {
     if (move.To.IsValid)
     {
         var targetPiece = board.GetPiece(move.To.X, move.To.Y);
         if(targetPiece != null)
         {
             if(targetPiece.Player != Player)
             {
                 return new MoveResult() { Type = MoveResultType.Attack, CapturedPiece = targetPiece };
             }
         }
         else
         {
             return new MoveResult() { Type = MoveResultType.Move };
         }
     }
     return new MoveResult() { Type = MoveResultType.Invalid };
 }