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

open Outils;;
open Representation;;
open Circuits;;
open Graphics;;
open Affichage_base;;
open Affichage_jeu;;
open Backtrack;;

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 >= état.zone_de_jeu.débutc && c <= état.zone_de_jeu.finc &&
  l >= état.zone_de_jeu.débutl && l <= état.zone_de_jeu.finl &&
  état.zone_de_jeu.tableau.(c).(l) <> Vide ;;

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

let sélectionner (c,l)=
  état.sélection <- Some (c,l);
  dessiner_sélection (coordonnées_pièce (c,l));;

let désélectionner (c,l) =
  état.sélection <- None;
  dessiner_désélection (coordonnées_pièce (c,l));;

let éliminer (c,l) (c',l') =
  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

      état.historique <-
        { pièce1 = (c,l);
          pièce2 = (c',l');
          couleur =
            match état.zone_de_jeu.tableau.(c).(l) with
              Occupée coul -> coul
        }::état.historique;
      dessiner_circuit circ;
      sleep 0.1;
      état.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 *)
      état.zone_de_jeu.tableau.(c).(l) <- Vide;
      état.zone_de_jeu.tableau.(c').(l') <- Vide;
    end;;

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