home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------- *)
- (* SCHIEB.PAS *)
- (* Bringen Sie die Buchstaben auf dem 6*4 Fel- *)
- (* der grossen Spielbrett in die vorgegebene *)
- (* Reihenfolge. *)
- (* System: MS-DOS Sprache: Turbo Pascal 3.0 *)
- (* CP/Mler und Atariisten beachten bitte die *)
- (* Implementations-Hinweise fuer Ihre Systeme! *)
-
- PROGRAM Schiebung;
-
- TYPE String24 = STRING[24];
-
- VAR Ist, (* das Spielbrett *)
- Soll : String24; (* das Ergebnis *)
- Zug : INTEGER;
-
- (* ------------------------------------------- *)
- (* "LowVideo;" bei CP/M, *)
- (* "Write (Chr(27), 'p');" bei Atari *)
-
- PROCEDURE Invers;
- BEGIN TextColor(0); TextBackGround(15) END;
-
- (* ------------------------------------------- *)
- (* "NormVideo;" bei CP/M, *)
- (* "Write (Chr(27), 'q');" bei Atari *)
-
- PROCEDURE Normal;
- BEGIN TextColor(15); TextBackGround(0) END;
-
- (* ------------------------------------------- *)
-
- PROCEDURE ClearScreen;
- BEGIN
- ClrScr; (* "Write (Chr(27), 'E');" bei Atari *)
- END;
-
- (* ------------------------------------------- *)
-
- PROCEDURE PosXY (x, y: INTEGER);
- BEGIN
- GotoXY (x,y);
- (* fuer Atari:
- Write (Chr(27), 'Y' , Chr(31+y), Chr(31+x));
- *)
- END;
-
- (* ------------------------------------------- *)
-
- FUNCTION my_Random (max: INTEGER): INTEGER;
- (* nur fuer Atari:
- FUNCTION do_Random: LONG_INTEGER; XBIOS(17);
- *)
- BEGIN
- my_Random := Random(max);
- (* "Random" bei Atari: mit XBIOS-Funktion *)
- (* 17 und ein wenig Rechnerei, da ein Wert *)
- (* im Intervall [0..Laenge-1] erforderlich *)
- (*
- my_Random := TRUNC(do_random/16777216.0*max);
- *)
- END;
-
- (* ------------------------------------------- *)
-
- PROCEDURE TitelBild;
-
- BEGIN
- ClearScreen;
- PosXY (35,1);
- Invers; Write (' SCHIEBUNG '); Normal;
- PosXY (11,22); Invers;
- Write (' Bewegung mit den Pfeil-Tasten',
- ' --- Schiebung mit Leer-Taste ');
- PosXY (33,24);
- Invers; Write (' Ende mit "Q" '); Normal;
- END;
-
- (* ------------------------------------------- *)
- (* liefert die Strings 'SOLL' und 'IST' *)
-
- PROCEDURE Zufalls_String (VAR Zufall: String24);
-
- VAR Original : String24;
- Laenge,
- Nummer : INTEGER;
-
- BEGIN
- Original := 'ABCDEFGHIJKLMNOPQRSTUVW';
- Zufall := '';
- REPEAT
- Laenge := Length (Original);
- Nummer := my_Random (Laenge) + 1;
- Zufall := Zufall + Original [Nummer];
- Delete (Original, Nummer, 1);
- UNTIL Laenge = 1;
- Zufall := ' ' + Zufall
- END;
-
- (* ------------------------------------------- *)
- (* das Spielfeld mit dem 'IST'-String *)
-
- PROCEDURE zeige_Ist;
-
- (* Spielfeld-Koordinaten links oben *)
- CONST S_Offset = 7;
- Z_Offset = 7;
-
- VAR i, j,
- Zaehler,
- Zeile, Spalte : INTEGER;
-
- BEGIN
- Zaehler := 0;
- FOR i := 0 TO 3 DO BEGIN
- Zeile := 3 * i + Z_Offset;
- FOR j := 0 TO 5 DO BEGIN
- Spalte := 3 * j + S_Offset - 1;
- (* erweiterter IBM-Zeichensatz, schreibt *)
- (* Kaestchen um die einzelnen Buchstaben *)
- (* Kann mit "+", "-" und "|" ersetzt w. *)
- PosXY (Spalte, Pred(Zeile));
- Write (#218#196#191);
- PosXY (Spalte, Zeile);
- Write (#179#32#179);
- PosXY (Spalte, Succ(Zeile));
- Write (#192#196#217);
- (* Zaehler := 6 * I + 1 + J: *)
- Zaehler := Succ(Zaehler);
- PosXY (Succ(Spalte), Zeile);
- Write (Ist [Zaehler]);
- END;
- END;
- END;
-
- (* ------------------------------------------- *)
- (* schreibt die korrekte Reihenfolge *)
-
- PROCEDURE zeige_Soll;
-
- CONST S_Offset = 60;
- Z_Offset = 14;
-
- VAR i, j,
- Zaehler,
- Zeile, Spalte : INTEGER;
-
- BEGIN
- PosXY (S_Offset + 5, Z_Offset - 2);
- Invers; Write (' SOLL : '); Normal;
- FOR i := 0 TO 3 DO
- FOR j := 0 TO 5 DO BEGIN
- Zaehler := 6 * i + 1 + j;
- PosXY (j*3 + S_Offset, 2*i + Z_Offset);
- Write (Soll [Zaehler]);
- END;
- END;
-
- (* ------------------------------------------- *)
-
- PROCEDURE Bewegung;
-
- CONST S_Offset = 7;
- Z_Offset = 7;
- LeerFeld = 32;
-
- VAR Taste : CHAR;
- X_Alt, Y_Alt,
- X_Neu, Y_Neu,
- Neu_Zaehler,
- Zaehler : INTEGER;
- Delta : 0..1;
- links, rechts, oben, unten : BOOLEAN;
-
- (* ----------------------------------------- *)
- (* Eingabe mit Cursortasten oder entsprech- *)
- (* enden Control-Codes: *)
-
- PROCEDURE HOL_ZEICHEN (VAR Eingabe : CHAR);
- (* liefert nur die CTRL-Codes, *)
- (* fuer CP/M: *)
- (*
- BEGIN Read (KBD, Eingabe) END;
- *)
- (* fuer Atari ST: *)
- (*
- VAR KBD: TEXT;
- BEGIN
- ReSet (KBD, 'CON:'); Read (KBD, Eingabe);
- END;
- *)
- (* fuer IBM: *)
- BEGIN
- Read (Kbd, Eingabe);
- IF Eingabe = #27 THEN (* erweiterter Code? *)
- IF KeyPressed THEN (* ja -> Cursortaste *)
- BEGIN
- Read (Kbd, Eingabe);
- CASE Eingabe OF
- 'H' : Eingabe := ^E; (* hoch *)
- 'K' : Eingabe := ^S; (* links *)
- 'M' : Eingabe := ^D; (* rechts *)
- 'P' : Eingabe := ^X; (* runter *)
- ELSE Eingabe := '0';
- END;
- END;
- END;
-
- (* ----------------------------------------- *)
-
- PROCEDURE Spielstand;
-
- VAR Schleife,
- Korrekt : INTEGER;
-
- BEGIN
- Zug := Succ(Zug);
- PosXY (60,4); Write ('Zuege : ');
- Invers; Write (Zug:5, ' '); Normal;
- Korrekt := 0;
- FOR Schleife := 1 TO Length(Ist) DO
- IF Ist [Schleife] = Soll [Schleife] THEN
- Korrekt := Succ(Korrekt);
- PosXY (60,7); Write ('Korrekt : ');
- Invers; Write (Korrekt:5, ' '); Normal;
- IF Korrekt = Length (Ist) THEN BEGIN
- PosXY (31,24);
- Invers;
- Write(' Geschafft in ', Zug, ' Zuegen ! ');
- Normal;
- Halt; (* Programm beenden *)
- END;
- END;
-
- (* ----------------------------------------- *)
-
- PROCEDURE SchreibeBuchstabe (x, y : INTEGER);
-
- BEGIN
- x := 3 * x + S_Offset;
- y := 3 * y + Z_Offset;
- PosXY (x, y); Write (Ist [Zaehler]);
- END;
-
- (* ----------------------------------------- *)
-
- PROCEDURE ZeigerWechsel;
-
- BEGIN
- SchreibeBuchstabe (X_Alt, Y_Alt);
- Zaehler := X_Neu + 1 + 6 * Y_Neu;
- Invers; SchreibeBuchstabe (X_Neu, Y_Neu);
- Normal;
- END;
-
- (* ----------------------------------------- *)
-
- BEGIN (* Bewegung *)
- Zug := -1;
- X_Alt := 0; Y_Alt := 0;
- X_Neu := 0; Y_Neu := 0;
- Zaehler := 6 * Y_Alt + 1 + X_Alt;
- Invers; SchreibeBuchstabe (X_Alt, Y_Alt);
- Normal;
- Spielstand;
- REPEAT
- X_Alt := X_Neu; Y_Alt := Y_Neu;
- HOL_ZEICHEN (Taste);
- CASE Ord(Taste) OF
- 4 : BEGIN
- Delta := Ord ((X_Alt + 1 <= 5));
- X_Neu := X_Alt + Delta;
- ZeigerWechsel;
- END;
- 19 : BEGIN
- Delta := Ord ((X_Alt - 1 >= 0));
- X_Neu := X_Alt - Delta;
- ZeigerWechsel;
- END;
- 5 : BEGIN
- Delta := Ord ((Y_Alt - 1 >= 0));
- Y_Neu := Y_Alt - Delta;
- ZeigerWechsel;
- END;
- 24 : BEGIN
- Delta := Ord ((Y_Alt + 1 <= 3));
- Y_Neu := Y_Alt + Delta;
- ZeigerWechsel;
- END;
- 32 : BEGIN
- Zaehler := X_Neu + 1 + 6 * Y_Neu;
- Neu_Zaehler := Zaehler;
- (* nur wenn der Zeiger nicht im *)
- (* leeren Feld steht Kontrolle der *)
- (* zulaessigen Bewegungsrichtungen:*)
- IF Ord(Ist[Zaehler]) <> LeerFeld THEN
- BEGIN
- oben := (Zaehler - 6 > 0);
- unten := (Zaehler + 6 <= 24);
- links := (Pred(Zaehler) MOD 6<>0);
- rechts := (Zaehler MOD 6 <> 0);
- (* leeres Feld suchen *)
- IF (oben AND (Ord(Ist[Zaehler - 6])
- = LeerFeld)) THEN
- BEGIN
- Y_Neu := Pred(Y_Alt);
- Neu_Zaehler := Zaehler - 6;
- END
- ELSE
- IF (unten AND (Ord(Ist[Zaehler+6])
- = LeerFeld)) THEN
- BEGIN
- Y_Neu := Succ(Y_Alt);
- Neu_Zaehler := Zaehler + 6;
- END
- ELSE
- IF (links AND (Ord(Ist[Zaehler-1])
- = LeerFeld)) THEN
- BEGIN
- X_Neu := Pred(X_Neu);
- Neu_Zaehler := Pred(Zaehler);
- END
- ELSE
- IF (rechts AND (Ord(Ist[Zaehler+1])
- = LeerFeld)) THEN
- BEGIN
- X_Neu := Succ(X_Neu);
- Neu_Zaehler := Succ(Zaehler);
- END;
- IF Neu_Zaehler <> Zaehler THEN BEGIN
- Ist [Neu_Zaehler] := Ist [Zaehler];
- Ist [Zaehler] := ' ';
- SchreibeBuchstabe (X_Alt, Y_Alt);
- Zaehler := Neu_Zaehler;
- Invers;
- SchreibeBuchstabe (X_Neu, Y_Neu);
- Normal;
- Spielstand;
- END;
- END;
- END; (* CASE ' ' *)
- END; (* CASE *)
- UNTIL Taste IN ['Q','q'];
- END;
-
- (* ------------------------------------------- *)
-
- BEGIN
- TitelBild;
- Zufalls_String (Ist);
- Zufalls_String (Soll);
- zeige_Ist;
- zeige_Soll;
- BEWEGUNG;
- END.
-