public Simulator(Move move) { this.Move = move; this.OldPiece = move.EndPosition.Piece; This.Game.MakeMove(move); This.Board.ResetLegalMoves(); }
public Piece Clone() { Piece piece = new Piece(this.Material, this.StartFile, this.StartRank); piece.SetMaterial(this.Material); return piece; }
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; }
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>(); }
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; }
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; }
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; }
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; }
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; }