(* ===================================================== *)
(*      Apprentissage de la programmation avec OCaml     *)
(*      Catherine Dubois & Valérie Ménissier-Morain      *)
(*                Éditions Hermès Sciences               *)
(*                        Mars 2004                      *)
(* ===================================================== *)
(* Fichier MLSRC/CC/CC_aide/evenements.ml                *)
(* ===================================================== *)

open Graphics;;
open Representation;;
open Circuits;;
open Affichage_base;;
open Affichage_jeu;;
open Suggestion;;
open Action;;
open Backtrack;;

let écrire_centré_fenêtre haut s =
  let (w,h)= text_size s in
  moveto ((size_x()-w)/2) (haut-h/2);
  draw_string s;;

let attente_niveau_suivant () =
  clear_graph ();
  let s1 = "POUR PASSER AU NIVEAU SUIVANT"
  and s2 = "APPUYER SUR UNE TOUCHE" in
  set_font "-*-helvetica-bold-r-*-*-24-*";
  let (_,h1)=text_size s1 in
  écrire_centré_fenêtre (2*h1+((size_y()-3*h1)/2)) s1;
  écrire_centré_fenêtre ((size_y()-3*h1)/2) s2;
  read_key(); ();;

let niveau_maximum = 6;;

let réaction_clic mp =
  let (c,l) = position_zone_de_jeu mp in
  if position_pièce_zone_de_jeu_valide (c, l)
  then
    match
 état.sélection with
    | None -> sélectionner (c,l)
    | Some (c',l') ->
        if (c',l') = (c,l)
        then désélectionner (c,l)
        else éliminer (c,l) (c',l');;

let gestion_événements_joueur () =
  let s = wait_next_event [Key_pressed; Button_down] in
  if s.button
  then réaction_clic (s.mouse_x,s.mouse_y)
  else (* touche frappée *)
    match
 s.key with
    | 'q' -> exit 0
    | 's' -> suggestion ()
    | 'b' -> étape_backtrack ()
    | _ -> ();;

let jeu () =
  Random.self_init ();
  état.sélection <- None;
  état.niveau <- 0;
  open_graph "";
  set_window_title "Court circuit";
  while état.niveau < niveau_maximum do
    état.niveau <- état.niveau+1;
    état.historique <- [];
    nouvelle_zone_de_jeu ();
    clear_graph ();
    dessiner_zone_de_jeu ();
    dessiner_cartouche ();
    while not (zone_de_jeu_vide ()) do
      gestion_événements_joueur ()
    done;
    if état.niveau < niveau_maximum
    then attente_niveau_suivant();
  done;
  exit 0;;

jeu();;

Ce document a été traduit de LATEX par HEVEA.