home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* MEMORY.PAS *)
- (* Ein Spielprogramm in Turbo Pascal 3.0 *)
- (* (c) 1988 by Gerd Kraus & PASCAL International *)
- (* ------------------------------------------------------ *)
-
- PROGRAM Memory;
-
- TYPE EineKarte = STRING[2]; (* Farbe und Wert *)
- VAR SpielFeld : ARRAY [1..64] OF EineKarte;
- (* 2 Spielkarten-Saetze *)
- Punkte : ARRAY [1..2] OF BYTE;
- Spieler,
- Runde : INTEGER;
- Position_K1,
- Position_K2 : BYTE; (* Nummern der aufgedeckten *)
- (* Karten, 1 .. 64 *)
- RueckSeite, (* Karten-Ruecken *)
- LeereKarte : EineKarte; (* gefundene Karte *)
-
- (* ------------------------------------------------------ *)
- PROCEDURE Invers; (* LOWVIDEO bei CPM *)
-
- BEGIN
- TextColor(0); TextBackGround(15);
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE Normal; (* NORMVIDEO bei CPM *)
-
- BEGIN
- TextColor(15); TextBackGround(0);
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE Bell; (* WRITE (^G) fuer CPM *)
-
- BEGIN
- Sound (800); Delay (50); NoSound;
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE ZeigKarte (Spalte, Zeile : BYTE;
- Karte : EineKarte);
- (* Spielkarte auf dem Bildschirm zeigen *)
- BEGIN
- GotoXY (16 + 3 * Spalte, 6 + 2 * Zeile);
- (* fuer Farb-Monitore : Bildschirm-Farben auswaehlen *)
- Write (Karte);
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE Initialisierung;
- (* Zusammenstellen und Mischen der Karten *)
-
- VAR i, j, k, (* Schleifen-Variable *)
- ZufallsZahl, (* mischen der Karten *)
- Max : BYTE; (* 64 .. 1 Karte *)
- SpielKarte : ARRAY[1..64] OF EineKarte;
- (* 32-mal je 2 identische Karten *)
-
- CONST Farbe : ARRAY [1..4] OF BYTE = (3, 4, 5, 6);
- (* die Spielkarten-Farben im IBM-Zeichensatz *)
- Wert : ARRAY [1..8] OF CHAR
- = ('7', '8', '9', 'Z', 'A', 'B', 'D', 'K');
- (* die Karten-Werte *)
-
- (* ------------------------------------------------------ *)
- PROCEDURE SpielBrett;
-
- BEGIN
- ClrScr;
- GotoXY (36,1); Invers;
- Write (' MEMORY '); Normal;
- GotoXY (16,4); Invers;
- Write ('A B C D E F G H '); Normal;
- FOR i := 0 TO 7 DO BEGIN
- GotoXY (11, 6 + 2 * i); Invers;
- Write (' ', Succ(i), ' '); Normal;
- FOR k := 0 TO 7 DO
- (* Write (LST, SpielFeld [Succ(k) + i * 8]); *)
- (* WriteLn (LST); nur zum mogeln ! *)
- (* BEGIN / END nicht vergessen ! *)
- ZeigKarte (k, i, RueckSeite);
- END; (* i := 0 TO 7 *)
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE Anzeigen;
-
- BEGIN
- Invers;
- GotoXY (50,5); Write (' Kartenwahl Spieler ');
- GotoXY (50,7); Write (' ':11);
- GotoXY (50,8); Write (' Karte 1 : ');
- GotoXY (50,9); Write (' ':11);
- GotoXY (50,10); Write (' Karte 2 : ');
- GotoXY (50,11); Write (' ':11);
- Normal;
-
- GotoXY (5, 23); Write ('Punkte Spieler 1 : ', Punkte [1]);
- GotoXY (5, 24); Write ('Punkte Spieler 2 : ', Punkte [2]);
-
- Invers; GotoXY (60, 1); Write ('Runde : ', Runde); Normal;
-
- GotoXY (52,23); Write ('Eingabebeispiel : A1');
- GotoXY (52,24); Write ('Ende mit "^Q"');
- END;
-
- (* ------------------------------------------------------ *)
- BEGIN (* Initialisierung *)
- Normal; (* bei Farb-Monitor Farben auswaehlen *)
- Max := 64; (* der Karten-Stapel zu Beginn *)
-
- i := 1;
- FOR j := 1 TO 8 DO (* 2 Spielkarten-Saetze aufbauen *)
- FOR k :=1 TO 4 DO BEGIN
- SpielKarte [i] := Chr(Farbe [k]) + Wert [j];
- SpielKarte [i+32] := SpielKarte [i];
- i := Succ (i);
- END; (* FOR k :=1 TO 4 *)
-
- FOR I := 1 TO 64 DO BEGIN (* Mischen der Karten *)
- ZufallsZahl := Random(Max) + 1;
- SpielFeld [i] := SpielKarte [ZufallsZahl];
- IF ZufallsZahl < Max THEN
- SpielKarte [ZufallsZahl] := SpielKarte [Max];
- (* gezogene Karte durch letzte Karte ersetzen *)
- Max := Pred(Max); (* Kartenstapel um 1 reduzieren *)
- END; (* FOR i := 1 TO 64 *)
-
- RueckSeite := Chr (177) + Chr (177);
- LeereKarte := Chr (249) + Chr (249);
- (* Zeichen aus dem IBM-Grafiksatz, ev. anpassen *)
- (* Start-Werte *)
- Punkte [1] := 0; Punkte [2] := 0;
- Spieler := 1; Runde := 1;
-
- SpielBrett;
- Anzeigen;
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE KartenWahl (Karte : BYTE; VAR Position : BYTE);
-
- VAR OK, Korrekt : BOOLEAN;
- Wahl1, Wahl2 : CHAR;
-
- (* ------------------------------------------------------ *)
- PROCEDURE Kontrolle;
- (* ueberprueft eingegebenen Wert und dreht die Karte um *)
-
- VAR Y, X : BYTE;
-
- BEGIN
- Korrekt := FALSE;
- Y := Ord(Wahl2) - 49; X := Ord(Wahl1) - 65;
- Position := Y * 8 + X + 1;
-
- Korrekt := (SpielFeld [Position] <> LeereKarte);
- (* vgl. PROCEDURE SpielEnde, Karte bereits abgelegt ! *)
-
- IF (Karte = 2) AND Korrekt THEN
- Korrekt := (Position <> Position_K1);
- (* 2-mal die gleiche Karte gilt nicht ! *)
-
- IF Korrekt THEN
- ZeigKarte (X , Y, SpielFeld [Position]);
-
- END;
-
- (* ------------------------------------------------------ *)
-
- BEGIN (* KartenWahl *)
- Invers; GotoXY (70, 5); Write (Spieler, ' : '); Normal;
- REPEAT
- IF Karte = 1 THEN BEGIN
- GotoXY (62, 10); ClrEol;
- GotoXY (62, 8); ClrEol
- END
- ELSE GotoXY (62, 10);
-
- REPEAT (* Eingabe der Spalte *)
- Read (KBD, Wahl1);
- Wahl1 := UpCase (Wahl1);
- ok := Wahl1 IN ['A'..'H',^Q];
- UNTIL ok;
- IF Wahl1 = ^Q THEN Halt;
- Write (Wahl1);
-
- REPEAT (* Eingabe der Zeile *)
- Read (KBD,Wahl2);
- ok := Wahl2 IN ['1'..'8'];
- UNTIL ok;
- Write (Wahl2);
- Kontrolle;
- IF NOT Korrekt THEN Bell
- UNTIL Korrekt
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE Weiter;
- (* dreht die gezeigten Karten wieder um *)
- VAR Karte : EineKarte;
-
- (* ------------------------------------------------------ *)
- FUNCTION Zeile (Position : BYTE) : BYTE;
-
- BEGIN Zeile := (Position - 1) DIV 8; END;
-
- (* ------------------------------------------------------ *)
- FUNCTION Spalte (Position : BYTE) : BYTE;
-
- BEGIN Spalte := (Position - 1) AND 7; END;
- (* entspricht MOD 8 *)
-
- (* ------------------------------------------------------ *)
- FUNCTION Welche (Position : BYTE) : EineKarte;
-
- BEGIN
- IF SpielFeld [Position] <> LeereKarte THEN
- Welche := RueckSeite
- ELSE Welche := LeereKarte;
- END;
-
- (* ------------------------------------------------------ *)
-
- BEGIN (* Weiter *)
- Invers;
- GotoXY (30,25); Write (' Weiter mit RETURN ');
- Normal;
- REPEAT UNTIL KeyPressed;
- GotoXY (1,25); ClrEol;
-
- ZeigKarte (Spalte(Position_K1), Zeile(Position_K1),
- Welche(Position_K1));
- ZeigKarte (Spalte(Position_K2), Zeile(Position_K2),
- Welche(Position_K1));
-
- END;
-
- (* ------------------------------------------------------ *)
- FUNCTION SpielEnde : BOOLEAN;
-
- BEGIN
- SpielEnde := FALSE;
-
- IF SpielFeld [Position_K1] =
- SpielFeld [Position_K2] THEN BEGIN
-
- Punkte [Spieler] := Succ (Punkte [Spieler]);
- SpielFeld [Position_K1] := LeereKarte;
- SpielFeld [Position_K2] := SpielFeld [Position_K1]
- (* gefundene Kartenfelder mit anderem Zeichen belegen *)
- END; (* IF SpielFeld *)
-
- GotoXY (5, 23); Write ('Punkte Spieler 1 : ', Punkte [1]);
- GotoXY (5, 24); Write ('Punkte Spieler 2 : ', Punkte [2]);
-
- IF Punkte [Spieler] > 15 THEN BEGIN
- GotoXY (31, 24);
- Invers; Write (' Sieger : Spieler', Spieler); Normal;
- SpielEnde := TRUE
- END;
-
- IF Spieler = 2 THEN BEGIN
- Runde := Succ (Runde);
- Invers; GotoXY (60, 1); Write ('Runde : ', Runde);
- Normal;
- Spieler := 1; END
- ELSE Spieler := 2;
-
- Weiter;
- END;
-
- (* ------------------------------------------------------ *)
-
- BEGIN
- Initialisierung;
- REPEAT
- KartenWahl (1, Position_K1); (* Karte 1 *)
- KartenWahl (2, Position_K2); (* Karte 2 *)
- UNTIL SpielEnde;
- REPEAT UNTIL KeyPressed;
- END.
-
- (* ------------------------------------------------------ *)
- (* MEMORY.PAS *)