Artifact 51a9d789eb377d34d572305f0060f797cc2dcda8
1 import util;
2 import game;
3 import output;
4 import driver;
5 import solver;
6
7 class CUI(Solver) : GameObserver
8 {
9 this(in Game g) { solver = new Solver(g); }
10 Solver solver;
11 bool fin;
12 override void on_game_changed(char c, in Game g, bool finished) { fin = finished; }
13 }
14
15 class ForSafety : GameObserver
16 {
17 this(in Game g)
18 {
19 if(g.map.W*g.map.H <= 1000)
20 {
21 try {
22 score_log ~= g.score;
23 auto fast_solver = new FastSolver(g);
24 foreach(_; 0..g.map.W*g.map.H) {
25 char c = fast_solver.single_step();
26 if(c=='A') break;
27 const(Game) gg = fast_solver.current_game;
28 log ~= c;
29 score_log ~= gg.score;
30 if(gg.cleared || gg.dead) break;
31 }
32 } catch {
33 log = null;
34 score_log = null;
35 }
36 }
37 }
38 override void on_game_changed(char c, in Game g, bool finished) {}
39 string log;
40 long[] score_log;
41 }
42
43 void main()
44 {
45 auto d = new Driver(stdin);
46 auto o = d.addObserver!(GuardedOutput)();
47 auto c = d.addObserver!(CUI!MainSolver)();
48 auto f = d.addObserver!(ForSafety)();
49 o.safety_data(f.log, f.score_log);
50 while(!c.fin)
51 d.command(c.solver.single_step());
52 }