home *** CD-ROM | disk | FTP | other *** search
- '----------------------------------------------------------
- ' STRATEGO.BAS
- ' Spiel und Spaß mit Turbo Basic 1.0.e
- ' (c) 1988 Gerd Kraus & PASCAL International
- '----------------------------------------------------------
-
- SUB Initialisierung
- ' Dimensionierung und Vorbelegung des Spielfeldes
- SHARED Feld.Besitzer% (), Feld.Vorhanden% (),_
- Feld.Zulaessig% (),_
- Runde%, Spieler%
-
- LOCAL Schleife%
-
- ' Die folgenden %Variablen sind sog. benannte Konstanten
- ' diese sind im gesamten Programm global !
- %Max = 36 ' die Groesse des Spielbretts
- %Stein.1 = 111 ' die Spielsteine auf dem Monitor
- %Stein.2 = 223
-
- Runde% = 1
- Spieler% = 2
-
- ' der '.' im Variablen-Namen dient zur Kennzeichnung
- DIM Feld.Besitzer% (1 : %Max) ' 0 = leeres Feld
- DIM Feld.Vorhanden% (1 : %Max) ' Steine / Feld
- DIM Feld.Zulaessig% (1 : %Max)
- ' Beim Programmstart werden die Felder automatisch
- ' auf den Wert '0' gesetzt
- ' Vorsicht, wenn das Spiel über mehrere Runden gehen soll :
- ' ARRAY nicht doppelt dimensionieren !
-
- ' die zul. Belegung der einzelnen Felder wird festgelegt :
- FOR Schleife% = 1 TO %Max
- SELECT CASE Schleife%
- CASE 1, 6, 31, 36 : Feld.Zulaessig% (Schleife%) = 2
- CASE 2 TO 5, 7, 12,_
- 13, 18, 19,_
- 24, 25, 30,_
- 32 TO 35 : Feld.Zulaessig% (Schleife%) = 3
- CASE ELSE : Feld.Zulaessig% (Schleife%) = 4
- END SELECT
- NEXT
-
- END SUB
- '----------------------------------------------------------
- SUB INVERS
- COLOR 0, 15
- END SUB
- '----------------------------------------------------------
- SUB NORMAL
- COLOR 15, 0
- END SUB
- '----------------------------------------------------------
- SUB BELL
- SOUND 800,1
- END SUB
- '----------------------------------------------------------
- SUB ClrEol (WoX, WoY)
- ' loeschen bis zum Zeilenende
- ' in Turbo-Pascal bereits als Funktion eingebaut
- LOCATE WoX, WoY
- PRINT SPACE$ (80 - WoY);
- LOCATE WoX, WoY
- END SUB
- '----------------------------------------------------------
- SUB SetzeStein
-
- SHARED Spieler%
-
- SELECT CASE Spieler%
- CASE 1 : PRINT CHR$ (%Stein.1)
- CASE 2 : CALL INVERS
- PRINT CHR$ (%Stein.2)
- CALL NORMAL
- END SELECT
- END SUB
- '----------------------------------------------------------
- SUB Leer (X%, Y%)
-
- LOCATE Y%, X% : PRINT SPACE$ (3)
- LOCATE Y%+1, X% : PRINT SPACE$ (3)
-
- END SUB
- '----------------------------------------------------------
- SUB EinStein (X%, Y%)
- LOCATE Y%, X% : CALL SetzeStein
- END SUB
- '----------------------------------------------------------
- SUB ZweiSteine (X%, Y%)
- CALL EinStein (X%, Y%)
- LOCATE Y%, X% + 2 : CALL SetzeStein
- END SUB
- '----------------------------------------------------------
- SUB DreiSteine (X%, Y%)
- CALL ZweiSteine (X%, Y%)
- LOCATE Y% +1, X% : CALL SetzeStein
- END SUB
- '----------------------------------------------------------
- SUB VierSteine (X%, Y%)
- CALL DreiSteine (X%, Y%)
- LOCATE Y% +1, X% +2 : CALL SetzeStein
- END SUB
- '----------------------------------------------------------
- SUB SteineImFeld (Lage%, Spalte%, Zeile%)
-
- SHARED Feld.Besitzer% (), Feld.Vorhanden% (),_
- Feld.Zulaessig% (),_
- Runde%, Spieler%
-
- LOCAL XFeld%, YFeld%
-
- XFeld% = 5 + 6 * Zeile% ' die Bildschirm-Koordinaten
- YFeld% = 2 + 3 * Spalte%
-
- SELECT CASE Feld.Vorhanden% (Lage%)
- CASE 1 : CALL EinStein (XFeld%, YFeld%)
- CASE 2 : CALL ZweiSteine (XFeld%, YFeld%)
- CASE 3 : CALL DreiSteine (XFeld%, YFeld%)
- CASE 4 : CALL VierSteine (XFeld%, YFeld%)
- CASE ELSE
- CALL Leer (XFeld%, YFeld%)
- END SELECT
- END SUB
- '----------------------------------------------------------
- SUB Wo (Nummer%, X%, Y%)
- X% = INT ((Nummer% - 1) / 6) + 1
- Y% = Nummer% - 6 * (X% - 1)
- END SUB
- '----------------------------------------------------------
- SUB Deckung (Nummer%, X%, Y%)
-
- SHARED Feld.Besitzer% (), Feld.Vorhanden% (),_
- Feld.Zulaessig% (),_
- Runde%, Spieler%
-
- CALL BELL
- INCR Feld.Vorhanden% (Nummer%), 1
- Feld.Besitzer% (Nummer%) = Spieler%
- CALL Wo (Nummer%, X%, Y%)
- CALL SteineImFeld (Nummer%, X%, Y%)
- CALL BELL
- END SUB
- '----------------------------------------------------------
- SUB Explosion (Ort%)
-
- SHARED Feld.Besitzer% (), Feld.Vorhanden% (),_
- Feld.Zulaessig% (),_
- Runde%, Spieler%
-
- Feld.Vorhanden% (Ort%) = 0
- FeldNummer% = Ort% : CALL Wo (Feldnummer%, X%, Y%)
-
- CALL SteineImFeld (FeldNummer%, X%, Y%)
- ' Unterstriche "_" beim Zeilenwechsel nicht vergessen !
- IF Ort% - 6 > 0 THEN FeldNummer% = Ort% - 6 :_
- CALL Deckung (FeldNummer%, X%, Y%)
- IF Ort% + 6 <= 36 THEN FeldNummer% = Ort% + 6 :_
- CALL Deckung (FeldNummer%, X%, Y%)
- IF Y% - 1 > 0 THEN FeldNummer% = Ort% - 1 :_
- CALL Deckung (FeldNummer%, X%, Y%)
- IF Y% + 1 < 6 THEN FeldNummer% = Ort% + 1 :_
- CALL Deckung (FeldNummer%, X%, Y%)
- END SUB
- '----------------------------------------------------------
- SUB Probe
-
- SHARED Feld.Besitzer% (), Feld.Vorhanden% (),_
- Feld.Zulaessig% (),_
- Runde%, Spieler%
-
- LOCAL Explodiert%, Stelle%
-
- DO
- Explodiert% = 0 'FALSE
- FOR Stelle% = 1 TO %Max
- IF Feld.Vorhanden% (Stelle%) >=_
- Feld.Zulaessig% (Stelle%) THEN
- CALL Explosion (Stelle%)
- Explodiert% = 1 ' TRUE
- END IF
- NEXT
- LOOP UNTIL Explodiert% = 0
-
- END SUB
- '----------------------------------------------------------
- SUB SpielStand (Ende%)
-
- SHARED Feld.Besitzer% (), Feld.Vorhanden% (),_
- Feld.Zulaessig% (),_
- Runde%, Spieler%
-
- LOCAL FelderVonEins%, FelderVonZwei%, Fertig%, Kasten%
-
- Ende% = 0
- FelderVonEins% = 0 : FelderVonZwei% = 0
- Fertig% = 0 ' FALSE
- FOR Kasten% = 1 TO %Max
- IF Feld.Besitzer%(Kasten%) = 1 THEN INCR FelderVonEins%,1
- IF Feld.Besitzer%(Kasten%) = 2 THEN INCR FelderVonZwei%,1
- NEXT
- IF Runde% > 1 THEN
- IF (FelderVonEins% =0) OR (FelderVonZwei% = 0) THEN
- LOCATE 23,25 : PRINT "SIEGER : Spieler ";
- PRINT Spieler%; " in Runde "; Runde%
- Ende% = 1
- END IF
- END IF
- IF Spieler% = 2 THEN INCR Runde%
- LOCATE 2,55 : PRINT "Runde "; Runde%
- LOCATE 19,70 : PRINT USING "##"; FelderVonEins%;
- PRINT " Feld(er)"
- LOCATE 20,70 : PRINT USING "##"; FelderVonZwei%;
- PRINT " Feld(er)"
-
- END SUB
- '----------------------------------------------------------
- SUB Fehler
- CALL BELL
- LOCATE 23, 32 : CALL INVERS
- PRINT " Nicht zulaessig ! " : CALL BELL
- DELAY (5) ' Sekunden
- CALL NORMAL : CALL ClrEol (23, 32)
- END SUB
- '----------------------------------------------------------
- SUB HolEingabe (Taste$)
-
- LOCAL Dummy$
-
- WHILE INSTAT ' Tastaturpuffer leeren
- Dummy$ = INKEY$
- WEND
- Taste$ = ""
- DO
- Taste$ = INKEY$
- LOOP UNTIL Taste$ <> ""
-
- ' Abfrage der IBM-Sondertasten, wir brauchen nur CONTROL-Q
- IF (ASC (Taste$) = 0) THEN_
- IF ASC (MID$(Taste$,2,1)) <> 17 THEN Taste$ = "Z"
- ' CTRL Q ^
- END SUB
- '----------------------------------------------------------
- SUB Titel
-
- CLS
- LOCATE 1,36: CALL INVERS: PRINT " STRATEGO ": CALL NORMAL
- END SUB
- '----------------------------------------------------------
- SUB SpielBeschreibung
-
- %Zeile = 5
- CALL TITEL
- LOCATE %Zeile,2
- PRINT "Die Aufgabe bei diesem Spiel ist es, auf einem ";
- PRINT "Brett mit 36 Feldern alle"
- LOCATE %Zeile+1,2
- PRINT "Steine des Gegners zu zerstoeren."
- LOCATE %Zeile+4,26
- COLOR 9,0 ' Text wird unterstrichen
- PRINT "Dabei gelten folgende REGELN :"
- CALL NORMAL
- LOCATE %Zeile+6,2
- PRINT "1 - Die Steine werden abwechselnd gesetzt."
- LOCATE %Zeile+7,2
- PRINT "2 - Jedes Feld hat abhaengig von seiner Lage ";
- PRINT "eine bestimmte maximale Kapazitaet"
- CALL INVERS
- LOCATE %Zeile+8,24 : PRINT SPACE$ (32)
- LOCATE %Zeile+9,24
- PRINT " >>> Eckfelder : 2 Steine <<< "
- LOCATE %Zeile+10,24
- PRINT " >>> Randfelder : 3 Steine <<< "
- LOCATE %Zeile+11,24
- PRINT " >>> Innenfelder : 4 Steine <<< "
- LOCATE %Zeile+12,24 : PRINT SPACE$ (32)
- CALL NORMAL
- LOCATE %Zeile+13, 2
- PRINT "3 - Erreicht ein Feld seine maximale Kapazitaet, ";
- PRINT "werden die Steine explo-"
- LOCATE %Zeile+14, 6
- PRINT "sionsartig auf die Nachbarfelder geschleudert."
- LOCATE %Zeile+15, 2
- PRINT "4 - Auf ein irgendwann vom Gegner besetztes Feld ";
- PRINT "darf nicht gesetzt werden."
- LOCATE 23,31: CALL INVERS: PRINT " Weiter mit Tastendruck "
- CALL NORMAL
- WHILE NOT INSTAT
- WEND
- CALL TITEL
- END SUB
- '----------------------------------------------------------
- SUB SpielBrett
-
- LOCAL XL%, YL%,_
- E1%, E2%, E3%, E4%, VE%, HO%, KR%,_
- ZL%, ZR%, ZO%, ZU%, Temp$, Linie$, Leer$,_
- Zeile1$, Zeile2$, Zeile3$, Zeile4$,_
- Schleife%
-
- ' Linien fuer den erweiterten IBM-Zeichensatz
- E1% = 218 ' OBEN LINKS
- E2% = 191 ' OBEN RECHTS
- E3% = 192 ' UNTEN LINKS
- E4% = 217 ' UNTEN RECHTS
- VE% = 179 ' VERTIKALE LINIE
- HO% = 196 ' HORIZONTALE LINIE
- KR% = 197 ' KREUZUNG
- ZL% = 180 ' ZEIGER NACH LINKS
- ZR% = 195 ' ZEIGER NACH RECHTS
- ZO% = 193 ' ZEIGER NACH OBEN
- ZU% = 194 ' ZEIGER NACH UNTEN
-
- XL% = 8 : YL% = 3
-
- ' das Spielbrett wird mit fertigen Strings aufgebaut
- Linie$ = STRING$ (5, CHR$ (HO%))
- ' der STRING$-Befehl verwendet nur das erste Zeichen
- ' eines STRINGs!
- Leer$ = SPACE$ (5)
-
- Temp$ = Linie$ + CHR$ (ZU%)
- Zeile1$ = CHR$ (E1%)
- FOR Schleife% = 1 TO 5
- Zeile1$ = Zeile1$ + Temp$
- NEXT
- Zeile1$ = Zeile1$ + Linie$ + CHR$ (E2%)
-
- Temp$ = SPACE$ (5) + CHR$ (VE%)
- Zeile2$ = CHR$ (VE%)
- FOR Schleife% = 1 TO 6
- Zeile2$ = Zeile2$ + Temp$
- NEXT
-
- Temp$ = Linie$ + CHR$ (KR%)
- Zeile3$ = CHR$ (ZR%)
- FOR Schleife% = 1 TO 5
- Zeile3$ = Zeile3$ + Temp$
- NEXT
- Zeile3$ = Zeile3$ + Linie$ + CHR$ (ZL%)
-
- Temp$ = Linie$ + CHR$ (ZO%)
- Zeile4$ = CHR$ (E3%)
- FOR Schleife% = 1 TO 5
- Zeile4$ = Zeile4$ + Temp$
- NEXT
- Zeile4$ = Zeile4$ + Linie$ + CHR$ (E4%)
-
- FOR Schleife% = 1 TO 6
- LOCATE YL%, XL%-2+6*Schleife% : PRINT CHR$(64+Schleife%)
- NEXT
-
- INCR XL%, 1 : INCR YL%, 1
- LOCATE YL%, XL% : PRINT Zeile1$
-
- FOR Schleife% = 1 TO 5
- INCR YL%, 1
- LOCATE YL%, XL% : PRINT Zeile2$
- INCR YL%, 1
- LOCATE YL%, XL% : PRINT Zeile2$
- LOCATE YL%, XL% -4 : PRINT Schleife%
- INCR YL%, 1
- LOCATE YL%, XL% : PRINT Zeile3$
- NEXT
-
- INCR YL%, 1
- LOCATE YL%, XL% : PRINT Zeile2$
- INCR YL%, 1
- LOCATE YL%, XL% : PRINT Zeile2$
- LOCATE YL%, XL% -4: PRINT Schleife%
-
- INCR YL%, 1
- LOCATE YL%, XL% : PRINT Zeile4$
-
- LOCATE 12,52 : PRINT "Eingabebeispiel : A1"
- LOCATE 14,52 : PRINT "Ende mit '^Q'"
- LOCATE 18,52 : CALL INVERS : PRINT SPACE$ (17)
- LOCATE 19,52
- PRINT " Spieler 1 : " + CHR$ (%Stein.1) + SPACE$ (1)
- LOCATE 20,52
- PRINT " Spieler 2 : " + CHR$ (%Stein.2) + SPACE$ (1)
- LOCATE 21,52 : PRINT SPACE$ (17) : CALL NORMAL
- END SUB
- '----------------------------------------------------------
- SUB WerIstDran
-
- SHARED Spieler%
-
- IF Spieler% = 1 THEN Spieler% = 2 ELSE Spieler% = 1
- CALL INVERS
- LOCATE 5,50
- PRINT " Zugeingabe Spieler "; Spieler%; " : "
- LOCATE 7,50 : PRINT SPACE$ (14)
- LOCATE 8,50 : PRINT " auf Feld : "
- LOCATE 9,50 : PRINT SPACE$ (14)
- CALL NORMAL
- END SUB
- '----------------------------------------------------------
- SUB Kontrolle (Zeile$, Spalte$, Richtig%)
-
- SHARED Feld.Besitzer% (), Feld.Vorhanden% (),_
- Feld.Zulaessig% (),_
- Runde%, Spieler%
- LOCAL ZE%, SP%
-
- ZE% = ASC (Spalte$)-48 : SP% = ASC (Zeile$)-64
- Position% = (ZE% - 1) * 6 + SP%
- IF (Feld.Besitzer% (Position%) = Spieler%) OR_
- (Feld.Besitzer% (Position%) = 0) THEN
- Feld.Besitzer% (Position%) = Spieler%
- INCR Feld.Vorhanden% (Position%), 1
- Richtig% = 1
- CALL SteineImFeld (Position%, ZE%, SP%)
- ELSE
- CALL Fehler
- END IF
- END SUB
- '----------------------------------------------------------
- SUB ZugEingabe
-
- LOCAL Korrekt%, OK%, Hilf%, Wahl1$, Wahl2$
-
- Korrekt% = 0 ' FALSE
- DO ' LOOP UNTIL Korrekt% = 1
- CALL ClrEol (8, 65)
- DO ' LOOP UNTIL OK% = 1 ' Eingabe der Spalte A..F
- OK% = 0
- CALL HolEingabe (Taste$)
- IF Taste$ = CHR$ (17) THEN STOP
- Wahl1$ = UCASE$ (Taste$)
- Hilf% = ASC (Wahl1$)
- IF Hilf% >= 65 AND Hilf% <= 70 THEN OK% = 1_
- ELSE CALL BELL
- LOOP UNTIL OK% = 1
- PRINT Wahl1$;
- DO ' LOOP UNTIL OK% = 1 ' Eingabe der Zeile 1..6
- OK% = 0
- CALL HolEingabe (Taste$)
- Wahl2$ = UCASE$ (Taste$)
- Hilf% = ASC (Wahl2$)
- IF Hilf% >= 49 AND Hilf% <= 54 THEN OK% = 1_
- ELSE CALL BELL
- LOOP UNTIL OK% = 1
- PRINT Wahl2$
- CALL Kontrolle (Wahl1$, Wahl2$, Korrekt%)
- LOOP UNTIL Korrekt% = 1
-
- END SUB
- '----------------------------------------------------------
- ' Hauptprogramm
- '----------------------------------------------------------
- CALL Initialisierung
- CALL Spielbeschreibung
- CALL Spielbrett
- DO
- CALL WerIstDran
- CALL ZugEingabe
- CALL Probe
- CALL SpielStand (Ende%)
- LOOP UNTIL Ende% = 1
- CALL HolEingabe (Taste$)
-
- END
- '----------------------------------------------------------
- ' Ende von STRATEGO.BAS