#open "graphics";; #open "random";; type t_fourmi = {mutable dir : int; mutable x : int; mutable y : int};; let trace_fourmi_deux_etats n = let mouvement = [|(0, 5); (-5, 0); (0, -5); (5, 0)|] in let init = open_graph " 800x800+50-50" in let ma_fourmi = {dir = 0; x = 349; y = 349} in let onestep () = if point_color ma_fourmi.x ma_fourmi.y = white then begin set_color black; ma_fourmi.dir <- if ma_fourmi.dir + 1 > 3 then 0 else ma_fourmi.dir + 1 end else begin set_color white; ma_fourmi.dir <- if ma_fourmi.dir - 1 < 0 then 3 else ma_fourmi.dir - 1 end; fill_rect ma_fourmi.x ma_fourmi.y 5 5; let (dx, dy) = mouvement.(ma_fourmi.dir) in ma_fourmi.x <- ma_fourmi.x + dx; ma_fourmi.y <- ma_fourmi.y + dy; in init; for i = 0 to n do onestep (); for j = 1 to 10000 do done done;; (* fourmi à 3 états ; s est la chaîne génétique de la fourmi *) (* 0 -> tourne à gauche, 1 -> tourne à droite *) let trace_fourmi_3_etats s n = let mouvement = [|(0, 1); (-1, 0); (0, -1); (1, 0)|] in let init = open_graph " 800x800+50-50" in let ma_fourmi = {dir = 0; x = 399; y = 399} in let change_direction pm dir = let dirp = dir + pm in if dirp < 0 then 3 else if dirp = 4 then 0 else dirp in let onestep () = begin match point_color ma_fourmi.x ma_fourmi.y with | c when c = white -> begin set_color red; ma_fourmi.dir <- change_direction ((int_of_char s.[0] - 48) * 2 - 1) ma_fourmi.dir end | c when c = red -> begin set_color black; ma_fourmi.dir <- change_direction ((int_of_char s.[1] - 48) * 2 - 1) ma_fourmi.dir end | _ -> begin set_color white; ma_fourmi.dir <- change_direction ((int_of_char s.[2] - 48) * 2 - 1) ma_fourmi.dir end end; (* fill_rect ma_fourmi.x ma_fourmi.y 2 2; *) plot ma_fourmi.x ma_fourmi.y; let (dx, dy) = mouvement.(ma_fourmi.dir) in ma_fourmi.x <- ma_fourmi.x + dx; ma_fourmi.y <- ma_fourmi.y + dy; in init; for i = 0 to n do onestep (); (* for j = 1 to 100 do done *) done;; (* fourmi à 4 états ; s est la chaîne génétique de la fourmi *) (* 0 -> tourne à gauche, 1 -> tourne à droite *) let trace_fourmi_4_etats s n = let mouvement = [|(0, 2); (-2, 0); (0, -2); (2, 0)|] in let init = open_graph " 800x800+50-50" in let ma_fourmi = {dir = 0; x = 399; y = 399} in let change_direction pm dir = let dirp = dir + pm in if dirp < 0 then 3 else if dirp = 4 then 0 else dirp in let onestep () = begin match point_color ma_fourmi.x ma_fourmi.y with | c when c = white -> begin set_color cyan; ma_fourmi.dir <- change_direction ((int_of_char s.[0] - 48) * 2 - 1) ma_fourmi.dir end | c when c = yellow -> begin set_color cyan; ma_fourmi.dir <- change_direction ((int_of_char s.[0] - 48) * 2 - 1) ma_fourmi.dir end | c when c = cyan -> begin set_color blue; ma_fourmi.dir <- change_direction ((int_of_char s.[1] - 48) * 2 - 1) ma_fourmi.dir end | c when c = blue -> begin set_color black; ma_fourmi.dir <- change_direction ((int_of_char s.[2] - 48) * 2 - 1) ma_fourmi.dir end | _ -> begin set_color yellow; ma_fourmi.dir <- change_direction ((int_of_char s.[3] - 48) * 2 - 1) ma_fourmi.dir end end; fill_rect ma_fourmi.x ma_fourmi.y 2 2; (* plot ma_fourmi.x ma_fourmi.y; *) let (dx, dy) = mouvement.(ma_fourmi.dir) in ma_fourmi.x <- ma_fourmi.x + dx; ma_fourmi.y <- ma_fourmi.y + dy; in init; for i = 0 to n do onestep (); (* for j = 1 to 100 do done *) done;; (* fourmi à 6 états ; s est la chaîne génétique de la fourmi *) (* 0 -> tourne à gauche, 1 -> tourne à droite *) let trace_fourmi_6_etats s n = let mouvement = [|(0, 2); (-2, 0); (0, -2); (2, 0)|] in let init = open_graph " 800x800+50-50" in let ma_fourmi = {dir = 0; x = 399; y = 399} in let change_direction pm dir = let dirp = dir + pm in if dirp < 0 then 3 else if dirp = 4 then 0 else dirp in let onestep () = begin match point_color ma_fourmi.x ma_fourmi.y with | c when c = white -> begin set_color yellow; ma_fourmi.dir <- change_direction ((int_of_char s.[0] - 48) * 2 - 1) ma_fourmi.dir end | c when c = yellow -> begin set_color green; ma_fourmi.dir <- change_direction ((int_of_char s.[1] - 48) * 2 - 1) ma_fourmi.dir end | c when c = green -> begin set_color cyan; ma_fourmi.dir <- change_direction ((int_of_char s.[2] - 48) * 2 - 1) ma_fourmi.dir end | c when c = cyan -> begin set_color blue; ma_fourmi.dir <- change_direction ((int_of_char s.[3] - 48) * 2 - 1) ma_fourmi.dir end | c when c = blue -> begin set_color black; ma_fourmi.dir <- change_direction ((int_of_char s.[4] - 48) * 2 - 1) ma_fourmi.dir end | _ -> begin set_color white; ma_fourmi.dir <- change_direction ((int_of_char s.[5] - 48) * 2 - 1) ma_fourmi.dir end end; fill_rect ma_fourmi.x ma_fourmi.y 2 2; (* plot ma_fourmi.x ma_fourmi.y; *) let (dx, dy) = mouvement.(ma_fourmi.dir) in ma_fourmi.x <- ma_fourmi.x + dx; ma_fourmi.y <- ma_fourmi.y + dy; in init; for i = 0 to n do onestep (); (* for j = 1 to 100 do done *) done;; (* trace_fourmi_deux_etats 12000;; *) trace_fourmi_3_etats "100" 100000000;; trace_fourmi_4_etats "1101" 300000;; trace_fourmi_6_etats "101011" 10000000;; close_graph ();;