Skip to content

Latest commit

 

History

History
128 lines (96 loc) · 4.88 KB

README.md

File metadata and controls

128 lines (96 loc) · 4.88 KB

Pleco

Pleco is a chess Engine & Library inspired by Stockfish, written entirely in Rust.

Pleco crate Pleco crate Build Status

This project is split into two crates, pleco, which contains the library functionality, and pleco_engine, which contains the UCI (Universal Chess Interface) compatible Engine & AI.

The overall goal for this project is to utilize the efficiency of Rust to create a Chess AI matching the speed of modern chess engines.

Planned & Implemented features

The Library aims to have the following features upon completion

  • Bitboard Representation of Piece Locations:
  • Ability for concurrent Board State access, for use by parallel searchers
  • Full Move-generation Capabilities, including generation of pseudo-legal moves
  • Statically computed lookup-tables (including Magic Bitboards)
  • Zobrist Hashing
  • PGN Parsing

The AI Bot aims to have the following features:

  • Alpha-Beta pruning
  • Multi-threaded search with rayon.rs
  • Queiscience-search
  • MVV-LVA sorting
  • Iterative Deepening
  • Aspiration Windows
  • Futility Pruning
  • Transposition Tables
  • Null Move Heuristic
  • Killer Moves

Standalone Installation and Use

To use pleco as an executable, please navigate to here and read the README.md.

Using Pleco as a Library

To use pleco inside your own Rust projects, Pleco.rs is available as a library on crates.io. Simply include the current version in your Cargo.toml:

[dependencies]
pleco = "x.x.x"

And add the following to a main.rs or lib.rs:

extern crate pleco;

Basic Usage

Setting up a board position is extremely simple.

use pleco::{Board,Player,PieceType};

let board = Board::start_pos();
assert_eq!(board.count_piece(Player::White,PieceType::P), 8);
assert_eq!(&board.fen(),"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1");

Creating a board from a Position

A Board can be created with any valid chess position using a valid FEN (Forsyth-Edwards Notation) String. Check out the Wikipedia article for more information on FEN Strings and their format.

let board = Board::from_fen("rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 0 2").unwrap();

Applying and Generating Moves

Moves are represented with a BitMove structure. They must be generated by a Board object directly, to be considered a valid move. Using Board::generate_moves() will generate all legal BitMoves of the current position for the current player.

use pleco::{Board,BitMove};

let mut board = Board::start_pos(); // create a board of the starting position
let moves = board.generate_moves(); // generate all possible legal moves
board.apply_move(moves[0]);
assert_eq!(board.moves_played(), 1);

We can ask the Board to apply a move to itself from a string. This string must follow the format of a standard UCI Move, in the format [src_sq][dst_sq][promo]. E.g., moving a piece from A1 to B3 would have a uci string of "a1b3", while promoting a pawn would look something like "e7e81". If the board is supplied a UCI move that is either incorrectly formatted or illegal, false shall be returned.

let mut board = Board::start_pos(); // create a board of the starting position
let success = board.apply_uci_move("e7e8q"); // apply a move where piece on e7 -> eq, promotes to queen
assert!(!success); // Wrong, not a valid move for the starting position

Undoing Moves

We can revert to the previous chessboard state with a simple Board::undo_move()

let mut board = Board::start_pos();
board.apply_uci_move("e2e4"); // A very good starting move, might I say
assert_eq!(board.moves_played(),1);
board.undo_move();
assert_eq!(board.moves_played(),0);

For more informaton about pleco as a library, see the pleco README.md.

Contributing

Any and all contributions are welcome! Open up a PR to contribute some improvements. Look at the Issues tab to see what needs some help.

License

Pleco is distributed under the terms of the MIT license. See LICENSE-MIT for details. Opening a pull requests is assumed to signal agreement with these licensing terms.