games/rotatebox/solver.js

/**
 * @fileoverview KI-Solver Wrapper für RotateBox.
 * Nutzt die generische SearchEngine, um das Level zu lösen.
 */

/**
 * Findet den kürzesten Weg mittels Breitensuche (BFS).
 * Wrapper für SearchEngine, der asynchron läuft um das UI nicht zu blockieren.
 * * @param {RotateBoard} startBoard - Der Startzustand.
 * @returns {Promise<{path: string[], nodes: number, duplicates: number}|null>} Das Ergebnisobjekt oder null.
 */
async function solveBFS(startBoard) {
    if (!startBoard) return null;

    // SearchEngine aus shared/js/ai/search-algorithms.js nutzen
    const engine = new SearchEngine({
        strategy: 'BFS',
        maxDepth: 500,          // Erhöht: Level 2 kann nach User-Zügen >100 Schritte entfernt sein
        checkDuplicates: true,
        // Periodisches Yielding: verhindert UI-Freeze bei großen Suchräumen
        onStep: async (state, openListSize, nodesVisited) => {
            if (nodesVisited % 500 === 0) {
                await new Promise(resolve => setTimeout(resolve, 0));
            }
        }
    });

    // Promise Wrapper für Asynchronität
    return new Promise((resolve) => {
        // Kleiner Timeout gibt dem Browser Zeit zum Rendern
        setTimeout(async () => {
            const result = await engine.solve(startBoard);
            
            if (result.success) {
                resolve({
                    path: result.path, // Array von Zügen ['L', 'R', ...]
                    nodes: result.nodesVisited,
                    duplicates: result.duplicatesFound || 0
                });
            } else {
                resolve(null);
            }
        }, 10);
    });
}