crisp_chess_engine

A small, pure-Dart chess engine — no native code, no FFI, so it runs on every Dart/Flutter target including the web.

Search: iterative-deepening alpha-beta with null-move pruning, principal-variation search (PVS), a quiescence search, MVV-LVA / killer / history move ordering, and a transposition table. Board state and move generation come from the chess package.

Install

dependencies:
  crisp_chess_engine: ^0.1.0

Usage

import 'package:crisp_chess_engine/crisp_chess_engine.dart';

void main() {
  final result = searchPosition(
    '6k1/5ppp/8/8/8/8/5PPP/R5K1 w - - 0 1',
    depth: 4,
  );
  print(result?.bestMove); // a1a8  (back-rank mate, Ra8#)
  print(result?.score);    // large positive mate score
}

searchPosition returns a SearchResult (bestMove in UCI, score in centipawns from the side-to-move's perspective, depth, nodesSearched), or null if the side to move has no legal moves (checkmate or stalemate).

For finer control — an existing chess.Chess board, per-depth callbacks, or stopping the search — use `AlphaBetaSearch` directly:

import 'package:chess/chess.dart';
import 'package:crisp_chess_engine/crisp_chess_engine.dart';

final game = Chess()..load(fen);
final search = AlphaBetaSearch(game);
final result = search.search(8, onDepthComplete: (r) => print('d${r.depth}: ${r.bestMove}'));

License

MIT. Extracted from the CrispChess app's built-in engine.

Libraries

bitboard
Native-only bitboard chess core: board representation, move generation, make/unmake, FEN, and perft.
crisp_chess_engine
A small, pure-Dart chess engine: iterative-deepening alpha-beta search with null-move pruning, principal-variation search (PVS), a quiescence search, MVV-LVA / killer / history move ordering, and a transposition table. No native code and no FFI, so it runs on every Dart/Flutter target.