/// <summary> /// Gets a board in the starting position. /// </summary> /// <returns></returns> public static Board GetStartingBoard() { var squares = new Piece[SquareNo]; var status = new BoardStatus(); squares[A8] = new BlackRook(); squares[B8] = new BlackKnight(); squares[C8] = new BlackBishop(); squares[D8] = new BlackQueen(); squares[E8] = new BlackKing(); squares[F8] = new BlackBishop(); squares[G8] = new BlackKnight(); squares[H8] = new BlackRook(); for (var sqIndex = SideSquareNo; sqIndex < SideSquareNo * 2; sqIndex++) { squares[sqIndex] = new BlackPawn(); } for (var sqIndex = SideSquareNo * (SideSquareNo - 2); sqIndex < SideSquareNo * (SideSquareNo - 1); sqIndex++) { squares[sqIndex] = new WhitePawn(); } squares[A1] = new WhiteRook(); squares[B1] = new WhiteKnight(); squares[C1] = new WhiteBishop(); squares[D1] = new WhiteQueen(); squares[E1] = new WhiteKing(); squares[F1] = new WhiteBishop(); squares[G1] = new WhiteKnight(); squares[H1] = new WhiteRook(); status.WhiteTurn = true; status.WhiteCouldCastleLong = status.WhiteCouldCastleShort = status.BlackCouldCastleLong = status.BlackCouldCastleShort = true; status.EnPassantTarget = null; status.Ply = 0; status.Moves = 1; return(new Board(squares, status)); }
public bool TryMove(ChessPlayer player, ChessboardTile tile) { int row, column; ChessboardTileHelper.TileToIndexes(tile, out row, out column); //Normal move if (m_board[m_selectedRow, m_selectedColumn].CanMove(row, column)) { //Pick up the piece ChessPiece movingPiece = m_board[m_selectedRow, m_selectedColumn]; m_board[m_selectedRow, m_selectedColumn] = null; m_selectedRow = -1; m_selectedColumn = -1; //Update the piece movingPiece.Selected = false; movingPiece.FirstMove = false; //Check for winning/losing if (row == m_whiteKing.CurrentRow && column == m_whiteKing.CurrentColumn) { m_winningPlayer = ChessPlayer.Black; } if (row == m_blackKing.CurrentRow && column == m_blackKing.CurrentColumn) { m_winningPlayer = ChessPlayer.White; } //Check for rochade (white, kingside) if (movingPiece == m_whiteKing && row == 0 && column == 6) { WhiteRook rookSpot = m_board[0, 7] as WhiteRook; if (rookSpot != null && rookSpot.FirstMove) { //We can do the rochade m_board[0, 7] = movingPiece; m_board[0, 6] = rookSpot; rookSpot.FirstMove = false; } } //Check for rochade (black, queenside) if (movingPiece == m_blackKing && row == 7 && column == 1) { BlackRook rookSpot = m_board[7, 0] as BlackRook; if (rookSpot != null && rookSpot.FirstMove) { //We can do the rochade m_board[7, 0] = movingPiece; m_board[7, 1] = rookSpot; rookSpot.FirstMove = false; } } //Check for rochade (black, kingside) if (movingPiece == m_blackKing && row == 7 && column == 6) { BlackRook rookSpot = m_board[7, 7] as BlackRook; if (rookSpot != null && rookSpot.FirstMove) { //We can do the rochade m_board[7, 7] = movingPiece; m_board[7, 6] = rookSpot; rookSpot.FirstMove = false; } } //Put down the piece m_board[row, column] = movingPiece; //Clear selection return(true); } //Rochade (white, queenside) if (m_board[m_selectedRow, m_selectedColumn] is WhiteKing && m_whiteKing.FirstMove && row == 0 && column == 1 && m_board[0, 1] == null && m_board[0, 2] == null && m_board[0, 3] == null) { WhiteRook rookSpot = m_board[0, 0] as WhiteRook; if (rookSpot != null && rookSpot.FirstMove) { //Pickup the king m_board[m_selectedRow, m_selectedColumn] = null; //Deselect him m_selectedRow = -1; m_selectedColumn = -1; m_whiteKing.Selected = false; //Move m_board[0, 1] = m_whiteKing; m_board[0, 2] = rookSpot; //Mark first moves m_whiteKing.FirstMove = false; rookSpot.FirstMove = false; //Teel the move was a success return(true); } } //Rochade (white, kingside) if (m_board[m_selectedRow, m_selectedColumn] is WhiteKing && m_whiteKing.FirstMove && row == 0 && column == 6 && m_board[0, 5] == null && m_board[0, 6] == null) { WhiteRook rookSpot = m_board[0, 7] as WhiteRook; if (rookSpot != null && rookSpot.FirstMove) { //Pickup the king m_board[m_selectedRow, m_selectedColumn] = null; //Deselect him m_selectedRow = -1; m_selectedColumn = -1; m_whiteKing.Selected = false; //Move m_board[0, 6] = m_whiteKing; m_board[0, 5] = rookSpot; //Mark first moves m_whiteKing.FirstMove = false; rookSpot.FirstMove = false; //Teel the move was a success return(true); } } //Rochade (black, queenside) if (m_board[m_selectedRow, m_selectedColumn] is BlackKing && m_blackKing.FirstMove && row == 7 && column == 1 && m_board[7, 1] == null && m_board[7, 2] == null && m_board[7, 3] == null) { BlackRook rookSpot = m_board[7, 0] as BlackRook; if (rookSpot != null && rookSpot.FirstMove) { //Pickup the king m_board[m_selectedRow, m_selectedColumn] = null; //Deselect him m_selectedRow = -1; m_selectedColumn = -1; m_blackKing.Selected = false; //Move m_board[7, 1] = m_blackKing; m_board[7, 2] = rookSpot; //Mark first moves m_blackKing.FirstMove = false; rookSpot.FirstMove = false; //Teel the move was a success return(true); } } //Rochade (black, kingside) if (m_board[m_selectedRow, m_selectedColumn] is BlackKing && m_blackKing.FirstMove && row == 7 && column == 6 && m_board[7, 5] == null && m_board[7, 6] == null) { BlackRook rookSpot = m_board[7, 7] as BlackRook; if (rookSpot != null && rookSpot.FirstMove) { //Pickup the king m_board[m_selectedRow, m_selectedColumn] = null; //Deselect him m_selectedRow = -1; m_selectedColumn = -1; m_blackKing.Selected = false; //Move m_board[7, 6] = m_blackKing; m_board[7, 5] = rookSpot; //Mark first moves m_blackKing.FirstMove = false; rookSpot.FirstMove = false; //Teel the move was a success return(true); } } return(false); }