ludo_engine 0.1.0
ludo_engine: ^0.1.0 copied to clipboard
Ludo rules and computer players in pure Dart: twelve house rules, AI personalities, deterministic turns and JSON for apps, servers and tests.
// Four computer players, one seeded game, every event printed.
//
// dart run example/main.dart [seed]
import 'package:ludo_engine/ludo_engine.dart';
void main(List<String> args) {
final seed = args.isEmpty ? 7 : int.parse(args.first);
final rng = SeededRng(seed);
var state = Engine.newGame(
rules: const RuleSet(safeSquares: true, extraTurnOnCapture: true),
seats: [
Seat.ai(id: 'ama', name: 'Ama', colour: 0, personality: Personality.vicious),
Seat.ai(id: 'kofi', name: 'Kofi', colour: 1, personality: Personality.averageJoe),
Seat.ai(id: 'esi', name: 'Esi', colour: 2, personality: Personality.pacifist),
Seat.ai(id: 'teye', name: 'Teye', colour: 3, personality: Personality.averageJoe),
],
);
String name(int seat) => state.seats[seat].name;
while (!state.isOver) {
final action = AiPlayer.decide(state, rng);
final result = Engine.apply(state, action, rng);
for (final event in result.events) {
final line = switch (event) {
Rolled(:final seat, :final value) => '${name(seat)} rolls $value',
Moved(:final seat, :final piece, :final from, :final to) =>
' ${name(seat)} moves piece $piece from ${from == Progress.base ? 'base' : from} to ${to == Progress.home ? 'home' : to}',
Captured(:final by, :final victim) =>
' ${name(by)} sends ${name(victim.seat)}\'s piece home!',
PlayerFinished(:final seat, :final place) => '${name(seat)} finishes, place $place',
GameEnded(:final finishOrder) => 'Game over: ${finishOrder.map(name).join(', ')}',
_ => null,
};
if (line != null) print(line);
}
state = result.state;
}
}