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

open Representation;;
open Circuits;;
open Graphics;;
open Affichage_base;;
open Affichage_jeu;;

let position_zone_de_jeu (x, y) =
  ((x-espace_horizontal)/(taille_pièce+espace_pièces)+bord_gauche,
   (y-espace_vertical)/(taille_pièce+espace_pièces)+bord_bas);;

let position_pièce_zone_de_jeu_valide (c, l) =
  c >= débutc && c <= finc && l >= débutl && l <= finl &&
  zone_de_jeu.(c).(l) <> Vide ;;

exception Non_vide;;

let zone_de_jeu_vide () =
  try
    for
 c = débutc to finc do
      for
 l = débutl to finl do
        if
 zone_de_jeu.(c).(l) <> Vide then raise Non_vide;
      done;
    donetrue
  with Non_vide -> false;;

let sélectionner (c,l) sélection =
  sélection := Some (c,l);
  dessiner_sélection (coordonnées_pièce (c,l));;

let désélectionner (c,l) sélection =
  sélection := None;
  dessiner_désélection (coordonnées_pièce (c,l));;

let éliminer (c,l) (c',l') sélection =
  dessiner_sélection (coordonnées_pièce (c,l));
  let circ = circuit_valide (c,l) (c',l') in
  if circ = []
  then
    begin
      écrire_pas_de_circuit ();
      dessiner_désélection (coordonnées_pièce (c,l))
    end
  else
    begin

      dessiner_circuit circ;
      Unix.sleep 1;
      sélection := None;
      (* supprimer le couple de pièces graphiquement *)
      effacer_circuit circ;
      effacer_pièce_sélectionnée (c,l);
      effacer_pièce_sélectionnée (c',l');
      (* supprimer le couple de pièces en mémoire *)
      zone_de_jeu.(c).(l) <- Vide;
      zone_de_jeu.(c').(l') <- Vide;
    end;;

let coordonnées_clic () =
  while not (button_down()) do () done;
  while button_down() do () done;
  position_zone_de_jeu (mouse_pos());;

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