home *** CD-ROM | disk | FTP | other *** search
- PROGRAM SCHIEBUNG;
- (* System : MS-DOS Sprache : Turbo Pascal 4.0 *)
- (* V.1.0.a - 12.10.88 CGA-Version *)
-
- {$R-,S+,I+,D+,T-,F+,V+,B+,N-,L+ }
- {$M 16384,0,655360 }
-
- USES CRT, DOS, Graph, SpieleGraph;
- (* in Spielegraph : GraphDir an die eigenen Verzeichnisse anpassen ! *)
- TYPE STRING24 = STRING[24];
-
- VAR Ist, (* das Spielbrett *)
- Soll : STRING24; (* das Ergebnis *)
- Zug : INTEGER;
-
- CONST StartX : INTEGER = 20;
- DeltaX : INTEGER = 21;
- Zeilen : INTEGER = 4;
- StartY : INTEGER = 40;
- DeltaY : INTEGER = 21;
- Spalten: INTEGER = 6;
- (*-----------------------------------------------*)
- FUNCTION Wirklich (Frage : STRING) : BOOLEAN;
- (* Ja oder Nein *)
- VAR Ch : CHAR;
-
- BEGIN
- SetViewPort (MinX+1, MaxY-19, MaxX-1, MaxY-1, ClipOff);
- ClearViewPort;
- SetColor (1); OutTextXY (5, 1, Frage);
-
- REPEAT
- Ch := ReadKey
- UNTIL UpCase (Ch) IN ['J', 'N'];
- Wirklich := Ch IN ['J', 'j'];
- END;
- (*-----------------------------------------------*)
- PROCEDURE Init;
- VAR X, Y : INTEGER;
- CONST DX : INTEGER = 5;
- DY : INTEGER = 5;
-
- BEGIN
- GraphikInit (CGA, CGAC2);
- SetTextStyle (SmallFont, HorizDir, 4);
-
- (* Spielfeld farbig einteilen *)
- SetFillStyle (1, 2); BAR (MinX, MinY, MaxX, 15);
- SetFillStyle (1, 3); BAR (MinX, 16, 200, MaxY-20);
- SetFillStyle (1, 1); SetColor (2);
- BAR3D (MinX, MaxY-20, MaxX, MaxY, 0, TopOff);
- SetColor (0); Bar3D (201, 16, MaxX, 85, 0, TopOff);
- SetColor (0); SetFillStyle (1, 2); BAR3D (201, 85, MaxX, MaxY - 21, 0, TopOff);
-
- (* Beschriftung *)
- SetColor (3); OutTextXY (130, 1, 'S c h i e b u n g');
- SetColor (0);
- OutTextXY (15, 180,
- 'Bewegung : Pfeil-Tasten --- Schiebung : Leer-Taste');
- OutTextXY (15, 189, 'ENDE : "CTRL-Q" ');
- SetColor (0); OutTextXY (220, 30, 'Zuege :');
- OutTextXY (220, 60, 'Korrekt :');
- SetColor (0); OutTextXY (250, 90, 'SOLL :');
-
- (* Spielfeld aufbauen *)
- (* Schatten *)
- SetFillStyle (1, 2);
- Bar (StartX + DX, StartY + DY,
- StartX + Spalten * DeltaX + DX, StartY + Zeilen * DeltaY + DY);
- (* Spielfeld *)
- SetColor (1);
- MachRaster (StartX, Spalten, DeltaX, StartY, Zeilen, DeltaY, FALSE);
-
- (* Spielfeld - Rechtecke *)
- SetColor (0);
- FOR X := 0 TO 5 DO
- FOR Y := 0 TO 3 DO
- Bar3D (StartX + DeltaX * X + 1, StartY + DeltaY * Y + 1,
- StartX + DeltaX * X + 20, StartY + DeltaY * Y + 20, 0, TopOff);
-
- END;
- (*-----------------------------------------------*)
- (* liefert die beiden Strings 'SOLL' und 'IST' *)
- PROCEDURE ZufallsString (VAR Zufall : STRING24);
- (* Tip für Sprite-Freunde : *)
- (* 24 (!) Sprites basteln und diese als ARRAY zur *)
- (* Verfügung stellen. Die PRC "ZufallsString kann *)
- (* man belassen, in ZeigeIst, ZeigeSoll und den *)
- (* anderen PRC in "Bewegung" zeigt man die Ist u. *)
- (* Soll-Arrays mit den Sprite-Befehlen statt mit *)
- (* OutTextXY. *)
-
- VAR Original : STRING24;
- Laenge,
- Nummer : INTEGER;
-
- BEGIN
- Original := 'ABCDEFGHIJKLMNOPQRSTUVW';
- Zufall := '';
-
- REPEAT
- Laenge := LENGTH (Original);
- Nummer := RANDOM (Laenge) + 1;
- Zufall := Zufall + Original [Nummer];
- DELETE (Original, Nummer, 1);
- UNTIL Laenge = 1;
-
- Zufall := ' ' + Zufall
- END;
- (*-----------------------------------------------*)
- (* das Spielfeld mit dem 'IST'-String *)
- PROCEDURE ZeigeIst;
-
- VAR I, J,
- Zaehler,
- Zeile, Spalte : INTEGER;
-
- BEGIN
- Zaehler := 1;
- FOR I := 0 TO 3 DO BEGIN
- Zeile := StartY + 7 + DeltaY * I;
- FOR J := 0 TO 5 DO
- BEGIN
- Spalte := StartX + 9 + DeltaX * J;
- OutTextXY (Spalte, Zeile, Ist [Zaehler]);
- Zaehler := SUCC(Zaehler); (* Zaehler := 6 * I + 1 + J; *)
- END; (* FOR J := 0 *)
- END; (* FOR I := 0 *)
- END;
- (*-----------------------------------------------*)
- (* schreibt die korrekte Reihenfolge *)
- PROCEDURE ZeigeSoll;
-
- VAR I, J,
- Zaehler,
- Zeile, Spalte : INTEGER;
-
- CONST X1 : INTEGER = 219;
- X2 : INTEGER = 319;
- Y1 : INTEGER = 105;
- Y2 : INTEGER = 170;
-
- BEGIN
- (* Schatten *)
- SetColor (3); SetFillStyle (1, 3); BAR (213, 108, 313, 173);
- (* Feld *)
- SetColor (2); SetFillStyle (11, 2); BAR (210, 105, 310, 170);
-
- (* Soll-Werte *)
- SetColor (3);
- FOR I := 0 TO 3 DO
- BEGIN
- Zeile := 110 + 15 * I;
- FOR J := 0 TO 5 DO
- BEGIN
- Spalte := 220 + 15 * J;
- Zaehler := 6 * I + 1 + J;
- OutTextXY (Spalte, Zeile, Soll [Zaehler]);
- END; (* FOR J := 0 *)
- END; (* FOR I := 0 *)
-
- END;
- (*-----------------------------------------------*)
- PROCEDURE Bewegung;
-
- CONST LeerFeld : INTEGER = 32;
- VAR Taste : Char;
- X_Alt, Y_Alt,
- X_Neu, Y_Neu,
- Neu_Zaehler,
- Zaehler : INTEGER;
- Delta : 0..1;
- LINKS, RECHTS, OBEN, UNTEN : BOOLEAN;
- (*-----------------*)
- PROCEDURE Spielstand;
-
- VAR Schleife,
- X, Y : INTEGER;
- CONST Korrekt : INTEGER = 0; (* alter Wert wird beibehalten *)
-
- BEGIN
- SetColor (1); OutTextXY (270, 30, Int2Str (Zug,4));
- Zug := SUCC(Zug);
- SetColor (0); OutTextXY (270, 30, Int2Str (Zug,4));
-
- SetColor (1); OutTextXY (270, 60, Int2Str (Korrekt,4));
- Korrekt := 0;
- FOR Schleife := 1 TO LENGTH(Ist) DO
- IF Ist [Schleife] = Soll [Schleife] THEN Korrekt := SUCC(Korrekt);
- SetColor (2); OutTextXY (270, 60, Int2Str (Korrekt,4));
-
- IF Korrekt = LENGTH (Ist) THEN
- BEGIN
- Beep (200, 25);
- SetColor (2);
- OutTextXY (20, 150, 'Geschafft in '+ Int2Str(Zug,3) + ' Zuegen !');
- Taste := ^Q;
- END;
- SetColor (0);
- END;
- (*-----------------*)
- PROCEDURE SchreibeBuchstabe (X, Y : INTEGER);
-
- BEGIN
- X := StartX + 9 + DeltaX * X;
- Y := StartY + 7 + DeltaY * Y;
- OutTextXY (X, Y, Ist [Zaehler]);
- END;
- (*-----------------*)
- PROCEDURE ZeigerWechsel;
-
- BEGIN
- (* alten Wert anschreiben *)
- Setcolor (0); SetFillStyle (1,2);
- Bar3D (StartX+21*X_Alt+1, StartY+21*Y_Alt+1,
- StartX+21*X_Alt+20, StartY+21*Y_Alt+20,0,TopOff);
- SetColor (0); SchreibeBuchstabe (X_Alt, Y_Alt);
-
- Zaehler := X_Neu + 1 + 6 * Y_Neu;
-
- (* neuen Wert anschreiben *)
- SetColor (0); SetFillStyle (1,3);
- Bar3D (StartX+21*X_Neu+1, StartY+21*Y_Neu+1,
- StartX+21*X_Neu+20, StartY+21*Y_Neu+20,0,TopOff);
- SetColor (1); SchreibeBuchstabe (X_Neu, Y_Neu);
- END;
- (*-----------------*)
- BEGIN (* Bewegung *)
- Zug := -1;
- X_Alt := 0; Y_Alt := 0;
- X_Neu := 0; Y_Neu := 0;
- ZeigerWechsel;
- Spielstand;
-
- REPEAT
- X_Alt := X_Neu; Y_Alt := Y_Neu;
- HolZeichen (Taste);
- CASE Taste OF
- ^D : BEGIN (* rechts *)
- Delta := ORD ((X_Alt + 1 <= 5));
- X_Neu := X_Alt + Delta;
- ZeigerWechsel;
- END;
- ^S : BEGIN (* links *)
- Delta := ORD ((X_Alt - 1 >= 0));
- X_Neu := X_Alt - Delta;
- ZeigerWechsel;
- END;
- ^E : BEGIN (* oben *)
- Delta := ORD ((Y_Alt - 1 >= 0));
- Y_Neu := Y_Alt - Delta;
- ZeigerWechsel;
- END;
- ^X : BEGIN (* unten *)
- Delta := ORD ((Y_Alt + 1 <= 3));
- Y_Neu := Y_Alt + Delta;
- ZeigerWechsel;
- END;
- ' ' : BEGIN (* Schiebung *)
- Zaehler := X_Neu + 1 + 6 * Y_Neu;
- Neu_Zaehler := Zaehler;
-
- IF ORD(Ist [Zaehler]) <> LeerFeld THEN
- (* nur wenn der Zeiger nicht im leeren Feld steht *)
- (* Kontrolle der zulaessigen Bewegungsrichtungen *)
- 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 [PRED(Zaehler)]) = LeerFeld)) THEN
- BEGIN
- X_Neu := PRED(X_Neu); Neu_Zaehler := PRED(Zaehler);
- END
- ELSE
- IF (RECHTS AND (ORD(Ist [SUCC(Zaehler)]) = 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] := ' ';
- Zeigerwechsel;
- Zaehler := Neu_Zaehler;
- Spielstand; IF Taste = ^Q THEN EXIT;
- END; (* IF Neu_Zaehler <> Zaehler *)
- END; (* IF ORD(Ist [Zaehler]) <> LeerFeld *)
- END; (* CASE ' ' *)
- END; (* CASE Taste OF *)
- UNTIL Taste = ^Q
-
- END; (* Bewegung *)
- (*-----------------------------------------------*)
- BEGIN
- REPEAT
- Init;
- ZufallsString (Ist);
- ZufallsString (Soll);
- ZeigeIst;
- ZeigeSoll;
- Bewegung;
- UNTIL NOT Wirklich ('Noch ein Spiel ? <J> / <N> : ');
- GraphikEnde;
- END.