Esempio n. 1
0
 public Simulator(Move move)
 {
     this.Move = move;
     this.OldPiece = move.EndPosition.Piece;
     This.Game.MakeMove(move);
     This.Board.ResetLegalMoves();
 }
Esempio n. 2
0
 public Piece Clone()
 {
     Piece piece = new Piece(this.Material, this.StartFile, this.StartRank);
     piece.SetMaterial(this.Material);
     return piece;
 }
Esempio n. 3
0
        private ObservableCollection<Move> GetAllLegalWhiteRookMoves(Piece piece)
        {
            ObservableCollection<Move> moves = new ObservableCollection<Move>();

            for (int file = piece.Square.File.ToInt() - 1; file >= 65; file--)
            {
                if (This.Board[file.ToChar()][piece.Square.Rank].HasWhitePiece()) break;
                moves.Add(new Move(piece.Square.File, piece.Square.Rank, file.ToChar(), piece.Square.Rank));
                if (This.Board[file.ToChar()][piece.Square.Rank].HasBlackPiece()) break;
            }

            for (int file = piece.Square.File.ToInt() + 1; file <= 72; file++)
            {
                if (This.Board[file.ToChar()][piece.Square.Rank].HasWhitePiece()) break;
                moves.Add(new Move(piece.Square.File, piece.Square.Rank, file.ToChar(), piece.Square.Rank));
                if (This.Board[file.ToChar()][piece.Square.Rank].HasBlackPiece()) break;
            }

            for (int rank = piece.Square.Rank + 1; rank <= 8; rank++)
            {
                if (This.Board[piece.Square.File][rank].HasWhitePiece()) break;
                moves.Add(new Move(piece.Square.File, piece.Square.Rank, piece.Square.File, rank));
                if (This.Board[piece.Square.File][rank].HasBlackPiece()) break;
            }

            for (int rank = piece.Square.Rank - 1; rank >= 1; rank--)
            {
                if (This.Board[piece.Square.File][rank].HasWhitePiece()) break;
                moves.Add(new Move(piece.Square.File, piece.Square.Rank, piece.Square.File, rank));
                if (This.Board[piece.Square.File][rank].HasBlackPiece()) break;
            }

            return moves;
        }
Esempio n. 4
0
 public ObservableCollection<Move> GetAllLegalMoves(Piece piece)
 {
     if (piece.Material == Materials.WhitePawn) return this.GetAllLegalWhitePawnMoves(piece);
     else if (piece.Material == Materials.BlackPawn) return this.GetAllLegalBlackPawnMoves(piece);
     else if (piece.Material == Materials.WhiteRook) return this.GetAllLegalWhiteRookMoves(piece);
     else if (piece.Material == Materials.BlackRook) return this.GetAllLegalBlackRookMoves(piece);
     else if (piece.Material == Materials.WhiteKnight) return this.GetAllLegalWhiteKnightMoves(piece);
     else if (piece.Material == Materials.BlackKnight) return this.GetAllLegalBlackKnightMoves(piece);
     else if (piece.Material == Materials.WhiteBishop) return this.GetAllLegalWhiteBishopMoves(piece);
     else if (piece.Material == Materials.BlackBishop) return this.GetAllLegalBlackBishopMoves(piece);
     else if (piece.Material == Materials.WhiteQueen) return this.GetAllLegalWhiteQueenMoves(piece);
     else if (piece.Material == Materials.BlackQueen) return this.GetAllLegalBlackQueenMoves(piece);
     else if (piece.Material == Materials.WhiteKing) return this.GetAllLegalWhiteKingMoves(piece);
     else if (piece.Material == Materials.BlackKing) return this.GetAllLegalBlackKingMoves(piece);
     else return new ObservableCollection<Move>();
 }
Esempio n. 5
0
        private ObservableCollection<Move> GetAllLegalWhiteQueenMoves(Piece piece)
        {
            ObservableCollection<Move> moves = new ObservableCollection<Move>();

            moves = this.GetAllLegalWhiteRookMoves(piece);
            ObservableCollection<Move> diagonals = this.GetAllLegalWhiteBishopMoves(piece);
            foreach (var diagonal in diagonals) moves.Add(diagonal);

            return moves;
        }
Esempio n. 6
0
        private ObservableCollection<Move> GetAllLegalWhitePawnMoves(Piece piece)
        {
            ObservableCollection<Move> moves = new ObservableCollection<Move>();
            char file = piece.Square.File;
            int rank = piece.Square.Rank;

            if (piece.Square.Rank == 2)
            {
                if (rank + 2 <= 8 && This.Board[file][rank + 1].Piece == null && This.Board[file][rank + 2].Piece == null)
                    moves.Add(new Move(file, rank, file, rank + 2));
            }
            if (rank + 1 <= 8 && This.Board[file][rank + 1].Piece == null) moves.Add(new Move(file, rank, file, rank + 1));

            if (rank <= 7)
            {
                if (file != 'H' && This.Board[file.Add(1)][rank + 1].HasBlackPiece()) moves.Add(new Move(file, rank, file.Add(1), rank + 1));
                if (file != 'A' && This.Board[file.Add(-1)][rank + 1].HasBlackPiece()) moves.Add(new Move(file, rank, file.Add(-1), rank + 1));
            }

            return moves;
        }
Esempio n. 7
0
        private ObservableCollection<Move> GetAllLegalWhiteKnightMoves(Piece piece)
        {
            ObservableCollection<Move> moves = new ObservableCollection<Move>();

            int file = piece.Square.File.ToInt();
            int rank = piece.Square.Rank;

            if (file - 2 >= 65 && rank + 1 <= 8 && !This.Board[Convert.ToChar(file - 2)][rank + 1].HasWhitePiece())
                moves.Add(new Move(file.ToChar(), rank, (file - 2).ToChar(), rank + 1));

            if (file - 2 >= 65 && rank - 1 >= 1 && !This.Board[Convert.ToChar(file - 2)][rank - 1].HasWhitePiece())
                moves.Add(new Move(file.ToChar(), rank, (file - 2).ToChar(), rank - 1));

            if (file - 1 >= 65 && rank + 2 <= 8 && !This.Board[Convert.ToChar(file - 1)][rank + 2].HasWhitePiece())
                moves.Add(new Move(file.ToChar(), rank, (file - 1).ToChar(), rank + 2));

            if (file - 1 >= 65 && rank - 2 >= 1 && !This.Board[Convert.ToChar(file - 1)][rank - 2].HasWhitePiece())
                moves.Add(new Move(file.ToChar(), rank, (file - 1).ToChar(), rank - 2));

            if (file + 1 <= 72 && rank + 2 <= 8 && !This.Board[Convert.ToChar(file + 1)][rank + 2].HasWhitePiece())
                moves.Add(new Move(file.ToChar(), rank, (file + 1).ToChar(), rank + 2));

            if (file + 1 <= 72 && rank - 2 >= 1 && !This.Board[Convert.ToChar(file + 1)][rank - 2].HasWhitePiece())
                moves.Add(new Move(file.ToChar(), rank, (file + 1).ToChar(), rank - 2));

            if (file + 2 <= 72 && rank + 1 <= 8 && !This.Board[Convert.ToChar(file + 2)][rank + 1].HasWhitePiece())
                moves.Add(new Move(file.ToChar(), rank, (file + 2).ToChar(), rank + 1));

            if (file + 2 <= 72 && rank - 1 >= 1 && !This.Board[Convert.ToChar(file + 2)][rank - 1].HasWhitePiece())
                moves.Add(new Move(file.ToChar(), rank, (file + 2).ToChar(), rank - 1));

            return moves;
        }
Esempio n. 8
0
        private ObservableCollection<Move> GetAllLegalWhiteBishopMoves(Piece piece)
        {
            ObservableCollection<Move> moves = new ObservableCollection<Move>();

            int file = piece.Square.File.ToInt();
            int count = 1;
            for (int rank = piece.Square.Rank + 1; rank <= 8; rank++)
            {
                if (file + count > 72) break;
                if (This.Board[(file + count).ToChar()][rank].HasWhitePiece()) break;
                moves.Add(new Move(file.ToChar(), piece.Square.Rank, (file + count).ToChar(), rank));
                if (This.Board[(file + count).ToChar()][rank].HasBlackPiece()) break;
                count++;
            }

            count = 1;
            for (int rank = piece.Square.Rank - 1; rank >= 1; rank--)
            {
                if (file + count > 72) break;
                if (This.Board[(file + count).ToChar()][rank].HasWhitePiece()) break;
                moves.Add(new Move(file.ToChar(), piece.Square.Rank, (file + count).ToChar(), rank));
                if (This.Board[(file + count).ToChar()][rank].HasBlackPiece()) break;
                count++;
            }

            count = -1;
            for (int rank = piece.Square.Rank + 1; rank <= 8; rank++)
            {
                if (file + count < 65) break;
                if (This.Board[(file + count).ToChar()][rank].HasWhitePiece()) break;
                moves.Add(new Move(file.ToChar(), piece.Square.Rank, (file + count).ToChar(), rank));
                if (This.Board[(file + count).ToChar()][rank].HasBlackPiece()) break;
                count--;
            }

            count = -1;
            for (int rank = piece.Square.Rank - 1; rank >= 1; rank--)
            {
                if (file + count < 65) break;
                if (This.Board[(file + count).ToChar()][rank].HasWhitePiece()) break;
                moves.Add(new Move(file.ToChar(), piece.Square.Rank, (file + count).ToChar(), rank));
                if (This.Board[(file + count).ToChar()][rank].HasBlackPiece()) break;
                count--;
            }

            return moves;
        }
Esempio n. 9
0
        private ObservableCollection<Move> GetAllLegalBlackKingMoves(Piece piece)
        {
            ObservableCollection<Move> moves = new ObservableCollection<Move>();

            int file = piece.Square.File.ToInt();
            int rank = piece.Square.Rank;

            if (file - 1 >= 65 && rank - 1 >= 1 && !This.Board[(file - 1).ToChar()][rank - 1].HasBlackPiece()) moves.Add(new Move(file.ToChar(), rank, (file - 1).ToChar(), rank - 1));
            if (file - 1 >= 65 && !This.Board[(file - 1).ToChar()][rank].HasBlackPiece()) moves.Add(new Move(file.ToChar(), rank, (file - 1).ToChar(), rank));
            if (file - 1 >= 65 && rank + 1 <= 8 && !This.Board[(file - 1).ToChar()][rank + 1].HasBlackPiece()) moves.Add(new Move(file.ToChar(), rank, (file - 1).ToChar(), rank + 1));

            if (rank + 1 <= 8 && !This.Board[file.ToChar()][rank + 1].HasBlackPiece()) moves.Add(new Move(file.ToChar(), rank, file.ToChar(), rank + 1));
            if (rank - 1 >= 1 && !This.Board[file.ToChar()][rank - 1].HasBlackPiece()) moves.Add(new Move(file.ToChar(), rank, file.ToChar(), rank - 1));

            if (file + 1 <= 72 && rank - 1 >= 1 && !This.Board[(file + 1).ToChar()][rank - 1].HasBlackPiece()) moves.Add(new Move(file.ToChar(), rank, (file + 1).ToChar(), rank - 1));
            if (file + 1 <= 72 && !This.Board[(file + 1).ToChar()][rank].HasBlackPiece()) moves.Add(new Move(file.ToChar(), rank, (file + 1).ToChar(), rank));
            if (file + 1 <= 72 && rank + 1 <= 8 && !This.Board[(file + 1).ToChar()][rank + 1].HasBlackPiece()) moves.Add(new Move(file.ToChar(), rank, (file + 1).ToChar(), rank + 1));

            return moves;
        }