(* On rend le grphisme disponible *) #load "graphics.cma";; (* Initialisation aléatoire pour Random *) Random.self_init ();; (* Importations des fonctions graphiques sans préfixe *) open Graphics;; (* Fonction du sujet à écrire ici *) let rec secret n max = [0];; (* Fonction du sujet à écrire ici *) let scoreNB liste1 liste2 = 0, 0;; (* On place les couleurs disponibles dans un tableau *) let cl = [| red; green; blue; yellow; cyan; magenta; black; white|] (* Constantes de présentation On va séparer la fenêtre en cellules carrées Une ligne par proposition, du bas vers le haut Chaque ligne va contenir les boules de la proposition, une cellule de signalement de fin de choix et le résultat de la comparaison*) let marge = 15;; (* Marges de séparation du bord *) let pas = 50;; (* Taille d'une cellule élémentaire *) let rayon = 20;; (* Rayon des boules *) (* Conversion entre les pixels et les cellules la cellule k va de marge + k*pas à marge + (k+1)*pas dans les deux directions (horizontalement et verticalement) pos k est le centre de la cellule k ind x est le numéro de la cellule contenant le pixel x *) let pos k = marge + pas/2 + pas*k;; let ind x = (x - marge)/pas;; (* Tracé d'une boule de couleur coul dans la cellule d'indices (ligne, com) *) let boule ligne col coul = set_color cl.(coul); (* On choisit la couleur du tracé *) fill_circle (pos col) (pos ligne) rayon; (* tracé d'un disque *) set_color black; draw_circle (pos col) (pos ligne) rayon;; (* tracé d'un cercle noir au bord *) (* Tracé d'un cercle permettant de valider le choix des couleurs *) let fin ligne col = set_color red; draw_circle (pos col) (pos ligne) rayon; moveto (pos col - 8) (pos ligne -4);(* on change la position *) set_color black; draw_string "Fin";; (* On écrit le texte, point bas gauche à la position *) (* Impression des résultats *) let reponse ligne col noir blanc = set_color black; moveto (pos col) (pos ligne + 4); (* on centre et on déplace vers le haut *) draw_string (string_of_int noir); draw_string " pions en place"; moveto (pos col) (pos ligne - 12); (* vers le bas *) draw_string (string_of_int blanc); draw_string " pions hors place.";; (* Choix d'une configuration : à une ligne fixée avec n éléments et max couleurs. Quand on clique sur une cellule, la couleur change. On le fait jusqu'à un clic sur la cellule de fin. On convertit le tableau des résultats en liste, qui est renvoyée *) let choix ligne n max = (* On dessine les boules et la cellule de fin *) for i = 0 to (n -1) do boule ligne i 0 done; fin ligne n; let encore = ref true in (* Marqueur de fin *) let res = Array.make n 0 in (* Tableau des couleurs *) while !encore do (* On attend un clic *) let s = wait_next_event [Button_down] in (* s.mouse_x est l'abscisse du clic *) let (i,j) = (ind s.mouse_x,ind s.mouse_y) in (* Si on cliqué dans la zone *) if j = ligne && i >= 0 && i <= n then if i < n (* Un des pions ? *) then begin res.(i) <- (res.(i) + 1) mod max; boule ligne i res.(i) end (* on change sa couleur *) else encore := false done; (* Sinon on stoppe *) Array.to_list res;; (*Liste des couleurs *) (* Fonction de jeu. On lance avec le nombre de pions et le nombre de couleurs. On clique sur les boules pour changer de couleur. On clique sur fin pour lancer l'évaluation. *) let jeu n max = (* On ouvre une fenêtre graphique La chaîne de caractère vide donne des valeurs par défaut "raisonnables". On peut aussi spécifier la taille, par exemple " 500x800", noter l'espace avant la taille (bug de caml). La fenêtre est redimensionnable à la souris. L'origine est (0,0) en bas à gauche. *) open_graph ""; let liste0 = secret n max in let pasTrouve = ref true in let ligne = ref 0 in while !pasTrouve do let liste = choix !ligne n max in let noir, blanc = scoreNB liste liste0 in if noir = n then pasTrouve := false else begin reponse !ligne (n+1) noir blanc; ligne := 1 + !ligne end done; set_color green; moveto (pos (n+2)) (pos !ligne -6); draw_string "Bravo ! "; (* On attend l'appui d'une touche pour fermer *) wait_next_event [Key_pressed];; jeu 4 3;;