MODULE FaulesEi; IMPORT Read, Write, Conclusions, RandomGenerators; TYPE List = POINTER TO ListRec; ListRec = RECORD content: INTEGER; next : List; END; VAR anc, ptr : List; counter1, counter2: INTEGER; laeufer, faulesei: INTEGER; stationen, schneller: INTEGER; (* werden zufaellig berechnet *) tmp: INTEGER; PROCEDURE GetRandomNumber(max : INTEGER) : INTEGER; (* returns random integer number on 1..max *) BEGIN RETURN ( (SHORT(RandomGenerators.Int32Val()) MOD max) + 1 ); END GetRandomNumber; PROCEDURE Init(); BEGIN laeufer := 8; faulesei := 9; (* Achtung: Pointer anc wird zum Aufbau der Liste verwendet * und zeigt immer auf das gleiche Listenelement. *) anc := NIL; counter1 := 0; WHILE counter1 <= 7 DO NEW(ptr); ptr.content := counter1; IF anc = NIL THEN ptr.next := ptr; ELSE ptr.next := anc.next; anc.next := ptr; END; anc := ptr; INC(counter1); END; (* Die Ringliste sieht nun folgendermassen aus : * _____________________________ * | | * v | * ptr --> 7 --> 0 --> 1 --> 2 ... -> 6 - * ^ * | * anc ---- *) (* Die Pointer sollen auf das Element 0 zeigen *) ptr := ptr.next; anc := ptr; (* Die Ringliste sieht nun so aus : * _____________________________ * | | * v | * ptr --> 0 --> 1 --> 2 --> 3 ... -> 7 - * ^ * | * anc ---- *) END Init; PROCEDURE Ausgabe(); VAR c: INTEGER; BEGIN Write.String("Ringliste:"); c := 0; WHILE c <= 7 DO Write.Int(anc.content, 4); anc := anc.next; INC(c); END; END Ausgabe; BEGIN Write.Ln; Write.Ln; Init(); (* Nach der Initialisierung *) Write.String("Nach der Initialisierung:"); Write.Ln; Write.Ln; Write.String("Startlaeufer:"); Write.Int(laeufer, 2); Write.Ln; Ausgabe(); Write.String(", Ei:"); Write.Int(faulesei,2); Write.Ln; Write.String("--------------------------------------------------"); Write.Ln; (* 10 Durchlaeufe *) counter1 := 1; WHILE counter1 <= 4 DO Write.Ln; Write.String("Runde"); Write.Int(counter1, 2); Write.String(": "); (* Wieviele Stationen laueft der Laeufer? Max. 7 Stationen, * da die 8. Station wieder sein eigener (also der freie) * Platz ist und somit an dieser Stelle auch kein Spieler * steht. *) stationen := GetRandomNumber(7); (* Welcher Spieler steht x Stationen weiter? *) counter2 := 1; WHILE counter2 <= stationen DO (* ptr zeigt auf den Platz, an dem der neue Spieler starten wird! *) ptr := ptr.next; INC(counter2); END; Write.String("Laeufer"); Write.Int(laeufer, 2); Write.String(" wirft das Tuch bei Spieler"); Write.Int(ptr.content, 2); Write.String(" ab."); (* Write.String(" ab ("); Write.Int(ptr.content, 1); Write.String(" Stationen)"); *) Write.Ln; (* Welcher Laeufer ist schneller? * 1 = der alte Laeufer, * 2 = der neue Laeufer, der Verfolger *) schneller := GetRandomNumber(2); IF (schneller = 1) THEN (* schneller *) Write.Ln; Write.String("Laeufer: "); Write.Int(laeufer,2); Write.String(" (ist schneller)"); Write.Ln; Write.String("Verfolger:"); Write.Int(ptr.content,2); Write.String(" (ist langsamer)"); Write.Ln; Write.Ln; Write.String("Laeufer"); Write.Int(laeufer,2); Write.String(" darf pausieren, Verfolger muss laufen."); Write.Ln; (* Laeufer und Verfolger tauschen *) tmp := laeufer; laeufer := ptr.content; ptr.content := tmp; ELSE (* langsamer *) Write.Ln; Write.String("Laeufer: "); Write.Int(laeufer,2); Write.String(" (ist langsamer)"); Write.Ln; Write.String("Verfolger:"); Write.Int(ptr.content,2); Write.String(" (ist schneller)"); Write.Ln; Write.Ln; Write.String("Laeufer"); Write.Int(laeufer,2); Write.String(" wird zum Faulen Ei, Faules Ei muss laufen."); Write.Ln; (* Laeufer und Faules Ei tauschen *) tmp := laeufer; laeufer := faulesei; faulesei := tmp; END; Write.Ln; Write.String("Neuer Laeufer:"); Write.Int(laeufer, 2); Write.Ln; Ausgabe(); Write.String(", Ei:"); Write.Int(faulesei,2); Write.Ln; Write.Ln; Write.String("--------------------------------------------------"); Write.Ln; INC(counter1); END; Write.Ln; Write.Ln; END FaulesEi.