home *** CD-ROM | disk | FTP | other *** search
- '(* ----------------------------------------------------- *)
- '(* MEMORY.BAS *)
- '(* Ein Spielprogramm in Turbo BASIC 1.0 *)
- '(* (c) 1988 by Gerd Kraus & PASCAL International *)
- '(* ----------------------------------------------------- *)
-
- GOTO Main ' das einzige GOTO, nur fuer den Vergleich
- ' mit Turbo-Pascal
- '(* ----------------------------------------------------- *)
- SUB Invers
- COLOR 0, 15
- END SUB
-
- '(* ----------------------------------------------------- *)
- SUB Normal
- COLOR 15, 0
- END SUB
-
- '(* ----------------------------------------------------- *)
- SUB Bell
- SOUND 800,5
- END SUB
-
- '(* ----------------------------------------------------- *)
- SUB HolEingabe (Taste$)
-
- LOCAL Dummy$
-
- WHILE INSTAT ' Tastaturpuffer leeren
- Dummy$ = INKEY$
- WEND
-
- Taste$ = ""
- DO
- Taste$ = INKEY$
- LOOP UNTIL Taste$ <> ""
-
- IF (ASC (Taste$) = 0) THEN
- IF ASC (MID$(Taste$,2,1)) <> 17 THEN Taste$ = ""
- END IF
-
- END SUB
-
- '(* ----------------------------------------------------- *)
- SUB Zeichen (X%, Y%, Anzahl%, Zeichen%)
-
- LOCATE X%, Y%
- PRINT STRING$ (Anzahl%, CHR$ (Zeichen%));
- END SUB
-
- '(* ----------------------------------------------------- *)
- SUB ZeigKarte (Spalte%, Zeile%, Karte$)
- ' Spielkarte auf dem Bildschirm zeigen
-
- LOCATE 6 + 2 * Zeile%, 16 + 3 * Spalte%
- ' fuer Farb-Monitore Bildschirm-Farben auswaehlen
- PRINT Karte$
- END SUB
-
- '(* ----------------------------------------------------- *)
- SUB Initialisierung
- ' Zusammenstellen und Mischen der Karten
- SHARED SpielFeld$ (), Punkte% (), Spieler%, Runde%
- SHARED RueckSeite$, LeereKarte$
-
- LOCAL SpielKarte$ (), Farbe% (), Wert$ ()
- LOCAL I%, J%, K% ' Schleifen-Variable
- LOCAL ZufallsZahl% ' mischen der Karten
- LOCAL Max% ' 64 .. 1 Karte
-
- DIM SpielKarte$ (1:64) ' 32-mal je 2 identische Karten
- DIM Farbe% (1:4) ' die Karten-Farben
- DIM Wert$ (1:8) ' die Karten-Werte
- DIM SpielFeld$ (1:64) ' 2 Spielkarten-Saetze
- DIM Punkte% (1:2)
- ' OPTION BASE 1 waere hier auch moeglich
-
- CALL Normal ' bei Farb-Monitor Bildschirm-Farben auswaehlen
-
- Farbe% (1) = 3 : Farbe% (2) = 4
- Farbe% (3) = 5 : Farbe% (4) = 6
- ' die Spielkarten-Farben im IBM-Zeichensatz
-
- Wert$ (1) = "7" : Wert$ (2) = "8" : Wert$ (3) = "9"
- Wert$ (4) = "Z" : Wert$ (5) = "A" : Wert$ (6) = "B"
- Wert$ (7) = "D" : Wert$ (8) = "K"
- ' die Karten-Werte
- Max% = 64
-
- I% = 1
- FOR J% = 1 TO 8 ' 2 Spielkarten-Saetze aufbauen
- FOR K% =1 TO 4
- SpielKarte$ (I%) = CHR$ (Farbe% (K%)) + Wert$ (J%)
- SpielKarte$ (I% + 32) = SpielKarte$ (I%)
- INCR I%
- NEXT K%
- NEXT J%
-
- FOR I% = 1 TO 64 ' Mischen der Karten
- ZufallsZahl% = INT (RND * Max%) + 1
- SpielFeld$ (I%) = SpielKarte$ (ZufallsZahl%)
- IF ZufallsZahl% < Max% THEN
- SpielKarte$ (ZufallsZahl%) = SpielKarte$ (Max%)
- ' gezogene Karte durch letzte Karte ersetzen
- END IF
- DECR Max% ' Kartenstapel um 1 reduzieren
- NEXT I%
-
- RueckSeite$ = CHR$ (177) + CHR$ (177) ' Karten-Rueckseite
- LeereKarte$ = CHR$ (249) + CHR$ (249) ' abgelegte Karte
- ' Zeichen aus dem IBM-Grafiksatz, ev. anpassen
-
- ' Start-Werte
- Punkte% (1) = 0 : Punkte% (2) = 0
- Spieler% = 1 : Runde% = 1
-
- ' UP SpielBrett
- ' ein CALL-Aufruf wie in der PASCAL-Version waere natuerlich
- ' ebenso moeglich -> Aufgabe fuer den Leser
-
- CLS
- LOCATE 1,36
- CALL Invers : PRINT " MEMORY " : CALL Normal
-
- LOCATE 4,16
- CALL Invers : PRINT "A B C D E F G H " : CALL Normal
-
- FOR I% = 0 TO 7
- LOCATE 6 + 2 * I%, 11 : CALL Invers : PRINT I% + 1
- CALL Normal
- FOR K% = 0 TO 7
- CALL ZeigKarte (K%, I%, RueckSeite$)
- ' CALL ZeigKarte (K%, I%, Spielfeld$ (K%+1 + I% *8))
- ' die umgedrehten Karten
- NEXT K%
- NEXT I%
-
- CALL Invers
- LOCATE 5,50 : PRINT " Kartenwahl Spieler "
- CALL Zeichen (7, 50, 11, 32)
- LOCATE 8,50 : PRINT " Karte 1 : "
- CALL Zeichen (9, 50, 11, 32)
- LOCATE 10,50: PRINT " Karte 2 : "
- CALL Zeichen (11, 50, 11, 32)
- CALL Normal
-
- LOCATE 23,5 : PRINT "Punkte Spieler 1 : "; Punkte% (1)
- LOCATE 24,5 : PRINT "Punkte Spieler 2 : "; Punkte% (2);
-
- CALL Invers : LOCATE 1,60 : PRINT "Runde : "; Runde%
- CALL Normal
-
- LOCATE 23,52 : PRINT "Eingabebeispiel : A1"
- LOCATE 24,52 : PRINT "Ende mit '^Q'";
-
- END SUB
-
- '(* ----------------------------------------------------- *)
- SUB Kontrolle (Karte%, Wahl1$, Wahl2$, Korrekt%, Position%)
- ' ueberprueft den eingegebenen Wert und dreht
- ' die Karte um
-
- SHARED SpielFeld$ (), LeereKarte$, PositionK1%
-
- LOCAL Y%, X%
-
- Korrekt% = 0 ' Turbo-Basic kennt keine BOOLE'schen Werte,
- ' aber '1' und '0' tun's auch !
- Y% = ASC (Wahl2$) - 49 : X% = ASC (Wahl1$) - 65
- Position% = Y% * 8 + X% + 1
-
- IF SpielFeld$ (Position%) <> LeereKarte$ THEN Korrekt% = 1
- ' vgl. SUB SpielEnde, Karte bereits abgelegt !
-
- IF Karte% = 2 THEN
- IF Position% = PositionK1% THEN Korrekt% = 0
- END IF ' 2-mal die gleiche Karte gilt nicht !
-
- IF Korrekt% = 1 THEN
- CALL ZeigKarte (X% , Y%, SpielFeld$ (Position%))
- END IF
-
- END SUB
-
- '(* ----------------------------------------------------- *)
- SUB KartenWahl (Karte%, Position%)
-
- SHARED SpielFeld$ (), Punkte% (), Spieler%, Korrekt%
-
- LOCAL OK%, Wahl1$, Wahl2$, Hilf%, Dummy$
-
- CALL Invers : LOCATE 5,70 : PRINT Spieler%; " : "
- CALL Normal
-
- DO ' LOOP UNTIL Korrekt% = 1
- IF Karte% = 1 THEN
- CALL Zeichen (10, 62, 3, 32)
- CALL Zeichen (8, 62, 3, 32) : LOCATE 8,62
- ELSE
- CALL Zeichen (10, 62, 3, 32) : LOCATE 10,62
- END IF ' Karte% = 1
-
- DO ' LOOP UNTIL OK% = 1 ' Eingabe der Spalte
- OK% = 0
- CALL HolEingabe (Taste$)
- IF Taste$ = CHR$ (17) THEN STOP
- Wahl1$ = UCASE$ (Taste$)
- Hilf% = ASC (Wahl1$)
- IF Hilf% >= 65 AND Hilf% <= 72 THEN
- OK% = 1
- ELSE
- CALL Bell
- END IF
- LOOP UNTIL OK% = 1
-
- PRINT Wahl1$;
- DO ' LOOP UNTIL OK% = 1 ' Eingabe der Zeile
- OK% = 0
- CALL HolEingabe (Taste$)
- Wahl2$ = UCASE$ (Taste$)
- Hilf% = ASC (Wahl2$)
- IF Hilf% >= 49 AND Hilf% <= 56 THEN
- OK% = 1
- ELSE
- CALL Bell
- END IF
- LOOP UNTIL OK% = 1
-
- PRINT Wahl2$
- CALL Kontrolle (Karte%,Wahl1$,Wahl2$,Korrekt%,Position%)
- IF Korrekt% = 0 THEN CALL BELL
-
- LOOP UNTIL Korrekt% = 1
-
- END SUB
-
- '(* ----------------------------------------------------- *)
- DEF FNZeile% (Position%)
- FNZeile% = INT ((Position% - 1) / 8)
- END DEF
-
- '(* ----------------------------------------------------- *)
- DEF FNSpalte% (Position%)
- FNSpalte% = (Position% - 1) AND 7 ' entspricht MOD 8
- END DEF
-
- '(* ----------------------------------------------------- *)
- DEF FNWelche$ (Position)
-
- SHARED SpielFeld$ (), LeereKarte$, RueckSeite$
-
- IF SpielFeld$ (Position) <> LeereKarte$ THEN
- FNWelche$ = RueckSeite$
- ELSE
- FNWelche$ = LeereKarte$
- END IF
-
- END DEF
-
- '(* ----------------------------------------------------- *)
- SUB Weiter
- ' dreht die gezeigten Karten wieder um
-
- SHARED PositionK1%, PositionK2%
- LOCAL Karte%
-
- CALL Invers
- LOCATE 25,30 : PRINT " Weiter mit RETURN ";
- CALL Normal
-
- DO
- CALL HolEingabe (Taste$)
- LOOP UNTIL Taste$ = CHR$ (13) ' RETURN-Taste
-
- CALL Zeichen (25, 1, 79, 32)
- CALL ZeigKarte (FNSpalte% (PositionK1%),_
- FNZeile% (PositionK1%),_
- FNWelche$ (PositionK1%))
- CALL ZeigKarte (FNSpalte% (PositionK2%),_
- FNZeile% (PositionK2%),_
- FNWelche$ (PositionK2%))
-
- END SUB
-
- '(* ----------------------------------------------------- *)
- DEF FNSpielEnde%
-
- SHARED SpielFeld$ (), Punkte% (), Spieler%, Runde%
- SHARED RueckSeite$, LeereKarte$, PositionK1%, PositionK2%
-
- FNSpielEnde% = 0
-
- IF SpielFeld$ (PositionK1%) = SpielFeld$ (PositionK2%) THEN
- ' 2 gleiche Karten
- INCR Punkte% (Spieler%)
- SpielFeld$ (PositionK1%) = LeereKarte$
- SpielFeld$ (PositionK2%) = SpielFeld$ (PositionK1%)
- ' gefundene Kartenfelder mit anderem Zeichen belegen
- END IF ' IF SpielFeld$
-
- LOCATE 23, 5 : PRINT "Punkte Spieler 1 : "; Punkte% (1)
- LOCATE 24, 5 : PRINT "Punkte Spieler 2 : "; Punkte% (2);
-
- IF Punkte% (Spieler%) > 15 THEN
- LOCATE 24, 31
- CALL Invers
- PRINT " Sieger : Spieler"; Spieler%;
- CALL Normal
- FNSpielEnde% = 1
- END IF
-
- IF Spieler% = 2 THEN
- INCR Runde%
- CALL Invers : LOCATE 1, 60 : PRINT "Runde : "; Runde%
- CALL Normal
- Spieler% = 1
- ELSE
- Spieler% = 2
- END IF
-
- CALL Weiter
- END DEF
-
- '*( ----------------------------------------------------- *)
- Main:
-
- CALL Initialisierung
- DO
- CALL KartenWahl (1, PositionK1%) ' Karte 1
- CALL KartenWahl (2, PositionK2%) ' Karte 2
- LOOP UNTIL FNSpielEnde% = 1
-
- CALL HolEingabe (Taste$)
-
- END