feat(engine): shuffle booster re-deals the tray

This commit is contained in:
2026-06-18 12:04:00 +09:00
parent 5aee503c09
commit bbf8cf3f08
2 changed files with 29 additions and 0 deletions
+9
View File
@@ -227,4 +227,13 @@ class GameEngine {
_checkStuck();
return true;
}
/// Booster: re-deals the tray. No move/score effect. Re-checks stuck so a
/// dead board with a hopeless tray can become playable again.
bool useShuffle() {
if (_phase == GamePhase.won || _phase == GamePhase.lost) return false;
_tray = _generator.nextTray(_grid);
_checkStuck();
return true;
}
}
+20
View File
@@ -46,4 +46,24 @@ void main() {
e.declineAndLose();
expect(e.useHammer(0, 0), isFalse);
});
test('useShuffle replaces the tray without spending a move or scoring', () {
final e = GameEngine(_stage());
final before = List.of(e.tray);
final score0 = e.score;
final moves0 = e.movesUsed;
final ok = e.useShuffle();
expect(ok, isTrue);
expect(e.tray.length, before.length);
expect(e.score, score0);
expect(e.movesUsed, moves0);
});
test('useShuffle is rejected after the attempt finishes', () {
final e = GameEngine(_stage());
e.declineAndLose();
expect(e.useShuffle(), isFalse);
});
}