program hoelzchen_nehmen;

uses crt;
const maxEntnahme=3;
var ersterSp, zweiterSp:string;

PROCEDURE Begruessung_und_Spielbeschreibung;
          var antwort:char;
          BEGIN
               clrscr;
               writeln('             Hoelzchenspiel');
               writeln('            ================');
               writeln;write('Soll ich die Spielregeln nennen? (j/n) ');
               REPEAT antwort:=readkey UNTIL antwort IN ['j', 'n'];
               IF antwort='j' THEN writeln('Spielregeln:')
          END;
PROCEDURE Vorbereitungen;
          BEGIN
               writeln;
               write('Name des ersten  Spielers? '); readln(ersterSp);
               write('Name des zweiten Spielers? '); readln(zweiterSp);
               randomize;
          END;
PROCEDURE Partie;
          var position,neuPosition:integer;
              amZug, neuAmZug:string;
              abgebrochen:boolean;
          PROCEDURE Startangaben (VAR hoelzchen:integer; VAR spieler:string);
                    var antwort:char;
                    BEGIN
                         hoelzchen:=10+random(5*maxEntnahme);
                         writeln;write('Wer soll beginnen ', ersterSp);
                         write (' oder ',zweiterSp, '?(1/2) ');
                         REPEAT antwort:=readkey UNTIL antwort IN ['1', '2'];
                         writeln(antwort);
                         spieler:=ersterSp;
                         IF antwort ='2' THEN spieler:=zweitersp
                    END;
          PROCEDURE Ausgabe (anzahl:integer);
                    BEGIN
                         writeln;
                         IF anzahl = 1 THEN write('Es ist ') ELSE write('Es sind ');
                         writeln('noch ', anzahl, 'Hoelzchen da.')
                    END;
          PROCEDURE Spieler_zieht (altAnzahl:integer; dran:string;
                                  VAR neuAnzahl:integer; VAR neudran:string);
                    VAR anzahl: integer;
                    BEGIN
                         writeln(dran, ' ist am Zug!');
                         write('Wie viele H”lzchen nehmen Sie ?(1..', maxEntnahme,') ');
                         REPEAT
                               readln(anzahl)
                               UNTIL (0<= anzahl) AND (anzahl <=maxEntnahme)
                                                  AND (anzahl <=altAnzahl);
                               IF anzahl = 0 THEN
                                  abgebrochen:=true
                               ELSE BEGIN
                                         neuAnzahl:=altAnzahl-anzahl;
                                         IF ersterSp = dran THEN
                                            neudran := zweiterSp;
                               END;
                         END;
          FUNCTION ende (hoelzchen:integer): boolean;
                   BEGIN ende:=hoelzchen <=0 END;
          PROCEDURE Endinformation (spieler:string);
                    BEGIN
                         writeln;
                         IF abgebrochen THEN
                            writeln(spieler, ' hat die Partie aufgegeben.')
                         ELSE
                             writeln(spieler, 'hat verloren.')
                    END;
          BEGIN
               startangaben(position, amZug);
               abgebrochen:=false;
               REPEAT
                     Ausgabe(position);
                     Spieler_zieht(position, amZug, neuPosition, neuAmZug);
                     IF NOT abgebrochen THEN BEGIN
                     position:=neuPosition; amZug:=neuAmZug
               END;
               UNTIL ende(position) OR abgebrochen;
               Endinformation(amZug)
          END;

          FUNCTION genug_gespielt:boolean;
                   VAR antwort:char;
                   BEGIN
                        writeln;writeln;write('Noch eine Partie ? (j/n) ');
                        REPEAT antwort:=readkey UNTIL antwort IN ['j', 'n'];
                        writeln(antwort);
                        genug_gespielt:=antwort='n'
                   END;
          PROCEDURE Verabschiedung;
                    BEGIN
                         writeln;writeln;
                         writeln('    Es war sch”n, Ihr Spielleiter zu sein.');
                         writeln('               Auf Wiedersehen.');
                         readln
                    END;
BEGIN
     Begruessung_und_Spielbeschreibung;
     Vorbereitungen;
     REPEAT Partie UNTIL genug_gespielt;
     Verabschiedung
END.
