Bonjour,
Après avoir porté ton programme en OCaml, j'ai fait tourner quelques tests qui me confirment que ton code marche bien, en partie.
Ce qui ne fonctionne pas, c'est ta sauvegarde des tortues via '['. Tu sauvegardes un record de références au lieu de sauvegarder leur valeur respective, tu as donc toujours du partage qui s'effectue entre toutes tes tortues en stock et ta tortue courante.
Une solution "cheap" au problème consiste à forcer une copie au moment d'empiler :
stock := { x = p.x; y = p.y; phi = p.phi }::(!stock)
(Il y a peut-être une fonction que j'ignore qui fait cette copie.)
(Sinon je trouve l'utilisation de références assez superflue dans ce code, mais c'est ton problème... )
Le code OCaml pour ceux qui veulent tester. J'ai changé les crochets en < > pour faire plaisir à emacs. J'ai retouché 2/3 trucs à l'arrache pour faire plaisir à OCaml.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
open Graphics
type turtle = {
mutable x : float;
mutable y : float;
mutable phi : float;
}
let round = int_of_float
let pi = 3.1415
let rad_of_deg a = a *. pi /. 180.
let fprint p l =
let x2 = (p.x) +. l *. cos (rad_of_deg p.phi)
and y2 = (p.y) +. l *. sin (rad_of_deg p.phi) in
moveto (round p.x) (round p.y);
lineto (round x2) (round y2);
p.x <- x2;
p.y <- y2
let f p l =
p.x <- p.x +. l *. cos (rad_of_deg p.phi);
p.y <- p.y +. l *. sin (rad_of_deg p.phi)
let plus p theta =
p.phi <- p.phi +. theta
let moins p theta =
p.phi <- p.phi -. theta
let dessine phrase l theta p =
clear_graph();
let len = String.length phrase
and stock = ref [] in
for i = 0 to len-1 do
match phrase.[i] with
| 'F' -> fprint p l
| 'f' -> f p l
| '+' -> plus p theta
| '-' -> moins p theta
| '<' -> stock := { x = p.x; y = p.y; phi = p.phi }::(!stock)
| '>' ->
let pc = (List.hd !stock) in
p.x <- pc.x;
p.y <- pc.y ;
p.phi <- pc.phi;
stock := (List.tl !stock)
| _ -> assert false
done
let test_tortue () =
let t = { x = 100.; y = 100.; phi = 0. } in
open_graph "";
dessine "F+F-F+ff<FffF>-ffFffF" 50. 90. t |
Pour tester :
1 2 3 4 5 6 7
|
$ rlwrap ocaml
Objective Caml version X.Y.Z
# #load "graphics.cma";;
# #use "Turtle.ml";;
# test_tortue ();; |
Partager