Struct chess::Board[][src]

pub struct Board { /* fields omitted */ }

A representation of a chess board. That's why you're here, right?

Methods

impl Board
[src]

Construct a board from a FEN string.

use chess::Board;

let init_position = Board::from_fen("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1".to_owned()).expect("Valid FEN");
assert_eq!(init_position, Board::default());

Is this game Ongoing, is it Stalemate, or is it Checkmate?

use chess::{Board, BoardStatus, Square, Rank, File, ChessMove};

let mut board = Board::default();

assert_eq!(board.status(), BoardStatus::Ongoing);

board = board.make_move(ChessMove::new(Square::make_square(Rank::Second, File::E),
                                       Square::make_square(Rank::Fourth, File::E),
                                       None));

assert_eq!(board.status(), BoardStatus::Ongoing);

board = board.make_move(ChessMove::new(Square::make_square(Rank::Seventh, File::F),
                                       Square::make_square(Rank::Sixth, File::F),
                                       None));
 
assert_eq!(board.status(), BoardStatus::Ongoing);

board = board.make_move(ChessMove::new(Square::make_square(Rank::Second, File::D),
                                       Square::make_square(Rank::Fourth, File::D),
                                       None));

assert_eq!(board.status(), BoardStatus::Ongoing);

board = board.make_move(ChessMove::new(Square::make_square(Rank::Seventh, File::G),
                                       Square::make_square(Rank::Fifth, File::G),
                                       None));

assert_eq!(board.status(), BoardStatus::Ongoing);

board = board.make_move(ChessMove::new(Square::make_square(Rank::First, File::D),
                                       Square::make_square(Rank::Fifth, File::H),
                                       None));

assert_eq!(board.status(), BoardStatus::Checkmate);

Important traits for BitBoard

Grab the "combined" BitBoard. This is a BitBoard with every piece.

use chess::{Board, BitBoard, Rank, get_rank};

let board = Board::default();

let combined_should_be = get_rank(Rank::First) |
                         get_rank(Rank::Second) |
                         get_rank(Rank::Seventh) |
                         get_rank(Rank::Eighth);

assert_eq!(board.combined(), combined_should_be);

Important traits for BitBoard

Grab the "color combined" BitBoard. This is a BitBoard with every piece of a particular color.

use chess::{Board, BitBoard, Rank, get_rank, Color};

let board = Board::default();

let white_pieces = get_rank(Rank::First) |
                   get_rank(Rank::Second);

let black_pieces = get_rank(Rank::Seventh) |
                   get_rank(Rank::Eighth);

assert_eq!(board.color_combined(Color::White), white_pieces);
assert_eq!(board.color_combined(Color::Black), black_pieces);

Give me the Square the color king is on.

use chess::{Board, Square, Color, Rank, File};

let board = Board::default();

assert_eq!(board.king_square(Color::White), Square::make_square(Rank::First, File::E));
assert_eq!(board.king_square(Color::Black), Square::make_square(Rank::Eighth, File::E));

Important traits for BitBoard

Grab the "pieces" BitBoard. This is a BitBoard with every piece of a particular type.

use chess::{Board, BitBoard, Piece, Square, Rank, File};

// The rooks should be in each corner of the board
let rooks = BitBoard::from_square(Square::make_square(Rank::First, File::A)) |
            BitBoard::from_square(Square::make_square(Rank::First, File::H)) |
            BitBoard::from_square(Square::make_square(Rank::Eighth, File::A)) |
            BitBoard::from_square(Square::make_square(Rank::Eighth, File::H));

let board = Board::default();

assert_eq!(board.pieces(Piece::Rook), rooks);

Grab the CastleRights for a particular side.

use chess::{Board, Square, Rank, File, CastleRights, Color, ChessMove};

let move1 = ChessMove::new(Square::make_square(Rank::Second, File::A),
                           Square::make_square(Rank::Fourth, File::A),
                           None);

let move2 = ChessMove::new(Square::make_square(Rank::Seventh, File::E),
                           Square::make_square(Rank::Fifth, File::E),
                           None);

let move3 = ChessMove::new(Square::make_square(Rank::First, File::A),
                           Square::make_square(Rank::Second, File::A),
                           None);

let move4 = ChessMove::new(Square::make_square(Rank::Eighth, File::E),
                           Square::make_square(Rank::Seventh, File::E),
                           None);

let mut board = Board::default();

assert_eq!(board.castle_rights(Color::White), CastleRights::Both);
assert_eq!(board.castle_rights(Color::Black), CastleRights::Both);

board = board.make_move(move1)
             .make_move(move2)
             .make_move(move3)
             .make_move(move4);

assert_eq!(board.castle_rights(Color::White), CastleRights::KingSide);
assert_eq!(board.castle_rights(Color::Black), CastleRights::NoRights);

Add castle rights for a particular side. Note: this can create an invalid position.

Remove castle rights for a particular side.

use chess::{Board, CastleRights, Color};
 
let mut board = Board::default();
assert_eq!(board.castle_rights(Color::White), CastleRights::Both);

board.remove_castle_rights(Color::White, CastleRights::KingSide);
assert_eq!(board.castle_rights(Color::White), CastleRights::QueenSide);

Who's turn is it?

use chess::{Board, Color};

let mut board = Board::default();
assert_eq!(board.side_to_move(), Color::White);

Grab my CastleRights.

use chess::{Board, Color, CastleRights};

let mut board = Board::default();
board.remove_castle_rights(Color::White, CastleRights::KingSide);
board.remove_castle_rights(Color::Black, CastleRights::QueenSide);

assert_eq!(board.my_castle_rights(), board.castle_rights(Color::White));

Add to my CastleRights. Note: This can make the position invalid.

Remove some of my CastleRights.

use chess::{Board, CastleRights};
 
let mut board = Board::default();
assert_eq!(board.my_castle_rights(), CastleRights::Both);

board.remove_my_castle_rights(CastleRights::KingSide);
assert_eq!(board.my_castle_rights(), CastleRights::QueenSide);

My opponents CastleRights.

use chess::{Board, Color, CastleRights};

let mut board = Board::default();
board.remove_castle_rights(Color::White, CastleRights::KingSide);
board.remove_castle_rights(Color::Black, CastleRights::QueenSide);

assert_eq!(board.their_castle_rights(), board.castle_rights(Color::Black));

Add to my opponents CastleRights. Note: This can make the position invalid.

Remove some of my opponents CastleRights.

use chess::{Board, CastleRights};
 
let mut board = Board::default();
assert_eq!(board.their_castle_rights(), CastleRights::Both);

board.remove_their_castle_rights(CastleRights::KingSide);
assert_eq!(board.their_castle_rights(), CastleRights::QueenSide);

For a chess UI: set a piece on a particular square.

use chess::{Board, Piece, Color, Square, Rank, File};

let board = Board::default();

let new_board = board.set_piece(Piece::Queen,
                                Color::White,
                                Square::make_square(Rank::Fourth, File::E))
                     .expect("Valid Position");

assert_eq!(new_board.pieces(Piece::Queen).count(), 3);

For a chess UI: clear a particular square.

use chess::{Board, Square, Rank, File, Piece};

let board = Board::default();

let new_board = board.clear_square(Square::make_square(Rank::First, File::A))
                     .expect("Valid Position");

assert_eq!(new_board.pieces(Piece::Rook).count(), 3);

Switch the color of the player without actually making a move. Returns None if the current player is in check.

use chess::{Board, Color};

let board = Board::default();
 
assert_eq!(board.side_to_move(), Color::White);

let new_board = board.null_move().expect("Valid Position");
 
assert_eq!(new_board.side_to_move(), Color::Black);

Does this board "make sense"? Do all the pieces make sense, do the bitboards combine correctly, etc? This is for sanity checking.

use chess::{Board, Color, Piece, Square, Rank, File};

let board = Board::default();

assert_eq!(board.is_sane(), true);

// Remove the king
let bad_board = board.clear_square(Square::make_square(Rank::First, File::E)).expect("Valid Position");
assert_eq!(bad_board.is_sane(), false);

Get a hash of the board.

Get a pawn hash of the board (a hash that only changes on color change and pawn moves).

What piece is on a particular Square? Is there even one?

use chess::{Board, Piece, Square, Rank, File};

let board = Board::default();

let sq1 = Square::make_square(Rank::First, File::A);
let sq2 = Square::make_square(Rank::Fourth, File::D);

assert_eq!(board.piece_on(sq1), Some(Piece::Rook));
assert_eq!(board.piece_on(sq2), None);

Give me all the legal moves for this board.

Note: You may want to build a MoveGen structure to iterate over the moves instead.

Additionally, you must allocate the move array yourself if you want to call this function. it massively helps with performance to reuse that array.

use chess::{Board, ChessMove};

let board = Board::default();
let mut moves = [ChessMove::default(); 256];
let count = board.enumerate_moves(&mut moves);
assert_eq!(count, 20);

Give me the en_passant square, if it exists.

use chess::{Board, ChessMove, Square, Rank, File};

let move1 = ChessMove::new(Square::make_square(Rank::Second, File::D),
                           Square::make_square(Rank::Fourth, File::D),
                           None);

let move2 = ChessMove::new(Square::make_square(Rank::Seventh, File::H),
                           Square::make_square(Rank::Fifth, File::H),
                           None);

let move3 = ChessMove::new(Square::make_square(Rank::Fourth, File::D),
                           Square::make_square(Rank::Fifth, File::D),
                           None);

let move4 = ChessMove::new(Square::make_square(Rank::Seventh, File::E),
                           Square::make_square(Rank::Fifth, File::E),
                           None);

let board = Board::default().make_move(move1)
                            .make_move(move2)
                            .make_move(move3)
                            .make_move(move4);

assert_eq!(board.en_passant(), Some(Square::make_square(Rank::Fifth, File::E)));

Is a particular move legal?

use chess::{Board, ChessMove, Square, Rank, File};

let move1 = ChessMove::new(Square::make_square(Rank::Second, File::E),
                           Square::make_square(Rank::Fourth, File::E),
                           None);
 
let move2 = ChessMove::new(Square::make_square(Rank::Second, File::E),
                           Square::make_square(Rank::Fifth, File::E),
                           None);

let board = Board::default();

assert_eq!(board.legal(move1), true);
assert_eq!(board.legal(move2), false);

This function checks the legality only for moves generated by MoveGen.

Calling this function for moves not generated by MoveGen will result in possibly incorrect results, and making that move on the Board will result in undefined behavior. This function may panic! if these rules are not followed.

If you are validating a move from a user, you should call the .legal() function.

Make a chess move.

panic!() if king is captured.

use chess::{Board, ChessMove, Square, Rank, File, Color};

let m = ChessMove::new(Square::make_square(Rank::Second, File::D),
                       Square::make_square(Rank::Fourth, File::D),
                       None);

let board = Board::default();
assert_eq!(board.make_move(m).side_to_move(), Color::Black);

Run a perft-test.

Run a perft-test using brute force move generation.

Run a perft test with a cache table.

Important traits for BitBoard

Give me the BitBoard of my pinned pieces.

Important traits for BitBoard

Give me the Bitboard of the pieces putting me in check.

Is a particular king move legal?

Is a particular en-passant capture legal?

Run every type of perft test, and panic! if the leaf-node count of any version is not equal to result.

Trait Implementations

impl Copy for Board
[src]

impl Clone for Board
[src]

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

impl PartialEq for Board
[src]

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

impl Debug for Board
[src]

Formats the value using the given formatter. Read more

impl Default for Board
[src]

Construct the initial position.

Returns the "default value" for a type. Read more

impl Display for Board
[src]

Formats the value using the given formatter. Read more

Auto Trait Implementations

impl Send for Board

impl Sync for Board