Generador de movimientos de ajedrez en JavaScript con detección estrictamente legal
| English | Español |
O abre visualizer/engine.html en tu navegador para ver la demo interactiva.
npm install chess-movegen-js
const { Board } = require('chess-movegen-js');
const board = new Board();
board.loadFEN('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1');
board.generateMoves();
console.log(`Movimientos legales: ${board.moves.length}`); // 20
Si ya usas chess.js, puedes utilizar ChessJSAdapter como un reemplazo directo de alto rendimiento. Proporciona la misma API (.moves(), .move(), .fen(), .isCheck(), etc.) pero utiliza el motor x88 internamente, lo que lo hace ~50 veces más rápido.
const { ChessJSAdapter } = require('chess-movegen-js/chessjs');
// Funciona exactamente como chess.js
const chess = new ChessJSAdapter();
chess.move('e4');
console.log(chess.fen());
console.log(chess.moves()); // Notación Algebraica Estándar (SAN)
Rendimiento medido en Node.js (Promedio Depth 4):
| Generador | NPS (Nodos Por Segundo) | Mejora vs chess.js |
|---|---|---|
| chess.js (Original) | ~75,000 | 1x (Base) |
| ChessJSAdapter (x88) | ~3,500,000 | 47x Más rápido |
| JS x88 Generator | ~3,500,000 | 47x Más rápido |
| AssemblyScript x88 | ~3,800,000 | 51x Más rápido |
| Rust X88 | ~10,800,000 | 145x Faster |
| Rust Bitboard | ~15,800,000 | 213x Faster |
// Crear un tablero
const board = new Board();
// Cargar una posición FEN
board.loadFEN('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1');
// Generar todos los movimientos legales
board.generateMoves();
// Ver los movimientos
console.log(board.moves);
Los movimientos incluyen información táctica:
board.generateMoves();
board.moves.forEach(move => {
const moveStr = board.getMoveStr(move);
console.log(moveStr);
// Información táctica en move.mask:
// - mask_check: Da jaque
// - mask_safe: Casilla segura
// - mask_hanging: Pieza quedaría colgada
// - mask_freecapture: Captura sin defensa
// - mask_winningcapture: Captura ganadora
});
// Hacer un movimiento
const move = board.moves[0];
board.makemove(move);
// Deshacer
board.undomove();
// Contar nodos a profundidad 5
const nodes = board.perft(5);
console.log(`Nodes: ${nodes}`); // 4,865,609 desde posición inicial
// Divide (mostrar nodos por movimiento)
board.divide(4);
movegen/
├── js/
│ ├── x88.js # Generador x88 (JS)
│ ├── bitboard.js # Generador Bitboard (JS)
│ └── magic-tables.js # Tablas Mágicas para bitboard
├── rust-movegen/ # Implementación en Rust (x88 y Bitboard, WASM)
├── asmovegen/ # Implementación en AssemblyScript (x88, WASM)
├── visualizer/ # Interfaz web interactiva
│ ├── engine.html # Página principal de la demo
│ └── js/ # Workers y lógica de la UI
├── tests/ # Suite completa de tests Perft
├── ANALISIS.md # Análisis técnico detallado
└── README.es.md # Este archivo
El proyecto incluye un motor UCI completo que se ejecuta en Web Worker:
// Crear motor
const w = new Worker("js/engine.js");
// Comunicación UCI
w.postMessage('uci');
w.postMessage('position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1');
w.postMessage('perft 6');
// Escuchar respuestas
w.onmessage = function(event) {
console.log(event.data);
};
uci - Inicializar motorisready - Verificar disponibilidaducinewgame - Nueva partidaposition [fen|startpos] [moves ...] - Establecer posiciónmove <move> - Hacer movimiento (ej: e2e4)undo - Deshacer movimientoperft <depth> - Test de generación de movimientosBenchmarks desde la posición inicial (Profundidad 5):
| Implementación | Plataforma | NPS |
|---|---|---|
| Rust Bitboard | WASM/Navegador | ~25.8M |
| Rust x88 | WASM/Navegador | ~18.0M |
| AssemblyScript | WASM/Navegador | ~12.5M |
| JS x88 | Node.js / Navegador | ~5.6M |
| JS Bitboard | Node.js / Navegador | ~4.2M |
Perft desde posición inicial (Node.js v20+, sin debug): Todas las versiones pasan el 100% de los tests Perft hasta profundidad 6+.
Las piezas clavadas se detectan durante la generación. Los movimientos ilegales nunca se generan:
// pinDirection[side][square] indica si una pieza está clavada
// y en qué dirección
Cada movimiento contiene flags que indican:
if (sq & 0x88) continuePara un análisis técnico completo del código, consulta ANALISIS.md.
El proyecto usa Perft para validar la generación de movimientos:
// Desde consola del navegador en engine.html
w.postMessage('perft 5');
// O en código
const board = new Board();
board.loadFEN('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1');
console.log(board.perft(5)); // Debe ser 4,865,609
El proyecto incluye una suite completa de tests Perft para validar la correctitud de la generación de movimientos y medir el rendimiento.
# Ejecutar suite rápida (profundidades 1-4, ~1 minuto)
node tests/perft-test.js --quick
# Probar posición específica
node tests/perft-test.js --position 0 --depth 5
# Probar generador específico
node tests/perft-test.js --generator rust-bb --depth 6
node tests/perft-test.js [opciones]
Opciones:
--generator <x88|bb|as|rust-x88|rust-bb|all> Seleccionar generador a probar (default: all)
--position <n> Probar solo posición n (default: all)
--depth <n> Probar hasta profundidad n (default: 6)
--quick Modo test rápido (profundidades 1-4)
--help Mostrar mensaje de ayuda
La suite de tests incluye 7 posiciones estándar de Chess Programming Wiki:
| Posición | Descripción | Profundidad Máxima |
|---|---|---|
| 0 | Posición inicial | 10 |
| 1 | Kiwipete (medio juego complejo) | 6 |
| 2 | Casos especiales de captura al paso | 8 |
| 3 | Promociones | 6 |
| 4 | Promociones (espejo) | 6 |
| 5 | Posición táctica compleja | 5 |
| 6 | Posición simétrica | 6 |
Chess Move Generator - Perft Test Suite
Configuration:
Generator: all
Positions: 7
Max depth: 4
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Resumen
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total tests: 140 (5 generadores * 7 posiciones * 4 profundidades)
Pasados: 140
Fallidos: 0
Tasa de éxito: 100.0%
Las contribuciones son bienvenidas. Por favor:
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para más detalles.
Mario Raúl Carbonell Martínez
⭐ Si encuentras útil este proyecto, considera darle una estrella en GitHub!