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

type case = Vide | Occupée of int;;

type sc_zone = {
  tableau: case array array;
  mutable colonnes: int;
  mutable lignes: int;
  mutable nb_colonnes: int;
  mutable nb_lignes: int;
  mutable débutc: int;
  mutable finc: int;
  mutable débutl: int;
  mutable finl: int;
};;

type sc_état = {
  mutable sélection: (int * int) option;
  mutable niveau: int;
  mutable zone_de_jeu: sc_zone;
};;

let colonnes_du_niveau niveau = 4+2*(niveau/2);;

let lignes_du_niveau niveau = 2+niveau+(niveau mod 2);;

let nb_couleurs_du_niveau niveau = 4+2*niveau;;

let bord_gauche = 1
and bord_droit = 1
and bord_bas = 1
and bord_haut = 1;;

let état = {
  sélection = None;
  niveau = 1;
  zone_de_jeu =
  { colonnes = 0;
    lignes = 0;
    débutc = 0;
    finc = 0;
    débutl = 0;
    finl = 0;
    nb_colonnes = 0;
    nb_lignes = 0;
    tableau = Array.make_matrix 0 0 Vide };
};;

let création_tableau_ordonné () =
  for j = état.zone_de_jeu.débutl to état.zone_de_jeu.finl do
    let i = ref état.zone_de_jeu.débutc in
    while !i <= état.zone_de_jeu.finc do
       état.zone_de_jeu.tableau.(!i).(j) <-
         Occupée (Random.int (nb_couleurs_du_niveau état.niveau));
       état.zone_de_jeu.tableau.(!i+1).(j) <-
         état.zone_de_jeu.tableau.(!i).(j);
       i := !i+2;
    done;
  done;;

let mélange_couleurs_tableau () =
  for i = état.zone_de_jeu.débutc to état.zone_de_jeu.finc do
    for
 j = état.zone_de_jeu.débutl to état.zone_de_jeu.finl do
      let c = i+Random.int (état.zone_de_jeu.finc-i+1)
      and l = j+Random.int (état.zone_de_jeu.finl-j+1) in
      let
 tmp = état.zone_de_jeu.tableau.(c).(l) in
      état.zone_de_jeu.tableau.(c).(l) <- état.zone_de_jeu.tableau.(i).(j);
      état.zone_de_jeu.tableau.(i).(j) <- tmp
    done;
  done;;

let nouvelle_zone_de_jeu () =
  let col = colonnes_du_niveau état.niveau
  and lig = lignes_du_niveau état.niveau in
  let
 ncol = bord_gauche+col+bord_droit
  and nlig = bord_bas+lig+bord_haut in
  état.zone_de_jeu <-
  { colonnes = col;
    lignes = lig;
    débutc = bord_gauche;
    finc = bord_gauche+col-1;
    débutl = bord_bas;
    finl = bord_bas+lig-1;
    nb_colonnes = ncol;
    nb_lignes = nlig;
    tableau = Array.make_matrix ncol nlig Vide };
  création_tableau_ordonné ();
  mélange_couleurs_tableau ();;

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