Ich würde grundsätzlich einen anderen Programmaufbau wählen. Du
verwendest globale Variablen, das verunmöglicht dir, mehrere
Schildkröten gleichzeitig existieren zu lassen. Ausserdem hast du keine
Kontrolle, was du wo, wie und warum an den Werten herumschraubst.
Versuche, dein Problem in viele, kleine, einfach zu handhabbare Häppchen
zu teilen. Erstelle für deine Schildkröten eine eigene Header und Source
Datei, z.B. so:
1 | //turtle.h
|
2 |
|
3 | typedef enum {UP, DOWN} pen_state;
|
4 |
|
5 | typedef struct{
|
6 | int PosX, PosY;
|
7 | int Direction;
|
8 | pen_state PenState;
|
9 | }turtle;
|
10 |
|
11 | void turtle_move(turtle * Turtle, int Movement);
|
1 | // turtle.c
|
2 |
|
3 | void turtle_move(turtle * Turtle, int Movement){
|
4 | // Bewege "Turtle" in Abhaengigkeit von "Movement"
|
5 | }
|
Dann sorgst du noch dafür, dass du alles durch entsprechende
"turtle_XXX"-Funktionen erledigen kannst, was erledigt werden muss. Im
Idealfall wird nur durch diese Funktionen auf Member der Struktur
zugegriffen. So muss der Aufrufer auch nicht wissen, was wie in deiner
Struktur gespeichert ist.
Dies machst du nun auch für all deine anderen Programmteile: Einlesen
der Befehle, Parsen der Befehle, Grafikausgabe usw. Und diese Module tun
dann auch nur genaus das, mit dem sie angeschrieben sind! Die Funktion
"parse_command" wurstelt momentan an globalen Variablen herum, die eine
Schildkröte darstellen sollen. Sowas willst du nicht. Du willst, dass
die Funktion "parse_command" eine Zeichenkette in einen Befehl
umwandelt. Was der Befehl bewirkt und wie das umgesetzt ist, kann und
soll der Funktion egal sein. Auch die Funktion "move_turtle" macht nicht
nur das, mit dem sie angeschieben ist: Sie ruft die Funktion "draw_line"
auf. Ich bin mir sicher, dass sich die Schildkröte bewegen kann, ohne
eine Line zu zeichnen.
Versuche auch, die Abhängigkeiten zwischen den Modulen möglichst gering
zu halten (Gesetz von Demeter) und nur über die Funktionen
(Schnittstelle) auf die Strukturen zuzugreifen.
Wenn du soweit bist, hast du bereits eine viel bessere Struktur in deim
Programm gebracht und dein Problem hat sich bis dahin vielleicht bereits
in Luft aufgelöst, dafür sind dann evt. schon wieder andere aufgetaucht.
Aufgrund der geringen Abhängigkeiten zwischen den Modulen, kannst du
auch ganz einfach Änderungen und Erweiterungen vornehmen (solange sich
die Schnittstelle nicht ändert), ohne andere Programmteile ebenfalls
ändern zu müssen.