I can't really figure out what you are trying to do. I don't really understand what the code in your screenshot does. After searching the web for "multiple turtles" it seems like some kind of common exercise for computer science students but again I can't figure out what the big deal is. If the goal is to draw paths in a graphics then there are surely better ways to do this with the Wolfram Language (WL).
But if the goal is to explore object-oriented programming (OOP) in Mathematica then this is a reasonable test case. You can find a few different frameworks for OOP in WL in the answers to this question, which are all rather advanced for this simple application.
Most expressions in the WL are immutable. When you make a list foo = {1,2,3}
then that list is static, unchanging. It's full form is List[1, 2, 3]
. If you call Append[foo, 4]
then you get back a new list. If you call AppendTo[foo, 4]
then a new list is created and the symbol foo
is set equal to it. But in that example foo
is mutable, foo
can change its state quite easily. So in this example I will just use a new unique symbol for every turtle created, and assign definitions to it:
turtleImage = Interpreter["Species"]["Turtle"]["Image"];
newTurtle[position_ : {0, 0}, heading_ : {1, 0}] := With[
{var = Unique @ "turtle"},
var["position"] = position;
var["heading"] = heading;
var["forward", x_ ? NumericQ] := var["position"] += x var["heading"];
var["backward", x_ ? NumericQ] := var["position"] -= x var["heading"];
var["left", ang_] := (
var["heading"] = N @ RotationTransform[ang][var @ "heading"];
);
var["right", ang_] := (
var["heading"] = N[RotationTransform[-ang][var @ "heading"]];
);
(* put any more method definitions here *)
Format[var] := turtleImage @ var @ "position"; (* this is a bit silly but the point is you can format the turtle however you like *)
var
]
You can use it like this
In[64]:= foo = newTurtle[];
foo["forward", 20];
foo["left", 90 Degree];
foo["forward", 30];
In[68]:= foo["position"]
Out[68]= {20., 30.}
or put it in a table and create a random walk
turt = newTurtle[];
trajectory = Table[
If[
RandomChoice @ {True, False},
turt["forward", RandomReal @ {0, 3.}],
turt[RandomChoice @ {"left", "right"},
RandomReal[{0, 50}] * Degree
]
];
turt @ "position",
{200}
];
ListLinePlot @ trajectory
