]> git.ameliathe1st.gay Git - cells.git/commitdiff
Sélectionneur d'automate au lancement du simulateur
authorAmélia Coutard-Sander <git@ameliathe1st.gay>
Mon, 16 Dec 2024 22:23:00 +0000 (23:23 +0100)
committerAmélia Coutard-Sander <git@ameliathe1st.gay>
Mon, 16 Dec 2024 22:28:45 +0000 (23:28 +0100)
bin/main.ml

index 3b86105db4ae8836ec47f6ea7d9534225e5b21f2..09d3154cacf9bb07e644a4d75a65ca2850c8979b 100644 (file)
@@ -75,10 +75,46 @@ let run (type t) (m : (module Automata.Automaton with type t = t)) =
         in
         aux (Automata.initial m) { x = 0; y = 0; current = M.default }
 
+let pick f cs =
+        let rec aux above curr below =
+                Graphics.clear_graph ();
+                let x = 25
+                and y = (Graphics.size_y () / 2) - 10 in
+                let draw_text i s =
+                        Graphics.moveto x (y + (i * 25));
+                        Graphics.draw_string s
+                in
+                List.iteri (fun i -> draw_text (i + 1)) (List.map f above);
+                draw_text 0 (f curr);
+                Graphics.draw_rect (x - 5) (y - 5) 200 20;
+                List.iteri (fun i -> draw_text (-i - 1)) (List.map f below);
+                Graphics.synchronize ();
+                match Graphics.read_key () with
+                | 'z' -> (
+                        match above with
+                        | [] -> aux [] curr below
+                        | c :: cs -> aux cs c (curr :: below))
+                | 's' -> (
+                        match below with
+                        | [] -> aux above curr []
+                        | c :: cs -> aux (curr :: above) c cs)
+                | ' ' -> curr
+                | _ -> aux above curr below
+        in
+        match cs with
+        | c :: cs -> aux [] c cs
+        | [] -> assert false (* cs should be non-empty *)
+
 let () =
         Graphics.open_graph "";
         Graphics.set_window_title "Automaton";
         Graphics.auto_synchronize false;
-        let m = List.nth Automata.automata 0 in
+        let m =
+                pick
+                  (fun m ->
+                    let module M = (val m : Automata.Automaton) in
+                    M.name)
+                  Automata.automata
+        in
         let module M = (val m) in
         run (module M)