home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 08_09 / stratego.bas < prev    next >
Encoding:
BASIC Source File  |  1988-05-09  |  12.8 KB  |  465 lines

  1. '----------------------------------------------------------
  2. '                     STRATEGO.BAS
  3. '         Spiel und Spaß mit Turbo Basic 1.0.e
  4. '     (c) 1988  Gerd Kraus & PASCAL International
  5. '----------------------------------------------------------
  6.  
  7. SUB Initialisierung
  8. ' Dimensionierung und Vorbelegung des Spielfeldes
  9. SHARED   Feld.Besitzer% (), Feld.Vorhanden% (),_
  10.          Feld.Zulaessig% (),_
  11.          Runde%, Spieler%
  12.  
  13. LOCAL   Schleife%
  14.  
  15. ' Die folgenden %Variablen sind sog. benannte Konstanten
  16. ' diese sind im gesamten Programm global !
  17. %Max = 36         ' die Groesse des Spielbretts
  18. %Stein.1 = 111    ' die Spielsteine auf dem Monitor
  19. %Stein.2 = 223
  20.  
  21. Runde% = 1
  22. Spieler% = 2
  23.  
  24. ' der '.' im Variablen-Namen dient zur Kennzeichnung
  25. DIM  Feld.Besitzer%  (1 : %Max)         ' 0 = leeres Feld
  26. DIM  Feld.Vorhanden% (1 : %Max)         ' Steine / Feld
  27. DIM  Feld.Zulaessig% (1 : %Max)
  28. ' Beim Programmstart werden die Felder automatisch
  29. ' auf den Wert '0' gesetzt
  30. ' Vorsicht, wenn das Spiel über mehrere Runden gehen soll :
  31. ' ARRAY nicht doppelt dimensionieren !
  32.  
  33. ' die zul. Belegung der einzelnen Felder wird festgelegt :
  34. FOR Schleife% = 1 TO %Max
  35.   SELECT CASE Schleife%
  36.     CASE 1, 6, 31, 36   : Feld.Zulaessig% (Schleife%) = 2
  37.     CASE 2 TO 5, 7, 12,_
  38.          13, 18, 19,_
  39.          24, 25, 30,_
  40.          32 TO 35       : Feld.Zulaessig% (Schleife%) = 3
  41.     CASE ELSE           : Feld.Zulaessig% (Schleife%) = 4
  42.   END SELECT
  43. NEXT
  44.  
  45. END SUB
  46. '----------------------------------------------------------
  47. SUB INVERS
  48. COLOR 0, 15
  49. END SUB
  50. '----------------------------------------------------------
  51. SUB NORMAL
  52. COLOR 15, 0
  53. END SUB
  54. '----------------------------------------------------------
  55. SUB BELL
  56. SOUND 800,1
  57. END SUB
  58. '----------------------------------------------------------
  59. SUB ClrEol (WoX, WoY)
  60. ' loeschen bis zum Zeilenende
  61. ' in Turbo-Pascal bereits als Funktion eingebaut
  62. LOCATE WoX, WoY
  63. PRINT SPACE$ (80 - WoY);
  64. LOCATE WoX, WoY
  65. END SUB
  66. '----------------------------------------------------------
  67. SUB SetzeStein
  68.  
  69. SHARED Spieler%
  70.  
  71. SELECT CASE Spieler%
  72.   CASE 1 : PRINT CHR$ (%Stein.1)
  73.   CASE 2 : CALL INVERS
  74.            PRINT CHR$ (%Stein.2)
  75.            CALL NORMAL
  76. END SELECT
  77. END SUB
  78. '----------------------------------------------------------
  79. SUB Leer (X%, Y%)
  80.  
  81. LOCATE Y%, X%    : PRINT  SPACE$ (3)
  82. LOCATE Y%+1, X%  : PRINT  SPACE$ (3)
  83.  
  84. END SUB
  85. '----------------------------------------------------------
  86. SUB EinStein (X%, Y%)
  87. LOCATE Y%, X%   : CALL SetzeStein
  88. END SUB
  89. '----------------------------------------------------------
  90. SUB ZweiSteine (X%, Y%)
  91. CALL EinStein (X%, Y%)
  92. LOCATE Y%, X% + 2 : CALL SetzeStein
  93. END SUB
  94. '----------------------------------------------------------
  95. SUB DreiSteine (X%, Y%)
  96. CALL ZweiSteine (X%, Y%)
  97. LOCATE Y% +1, X%    : CALL SetzeStein
  98. END SUB
  99. '----------------------------------------------------------
  100. SUB VierSteine (X%, Y%)
  101. CALL DreiSteine (X%, Y%)
  102. LOCATE Y% +1, X% +2 : CALL SetzeStein
  103. END SUB
  104. '----------------------------------------------------------
  105. SUB SteineImFeld (Lage%, Spalte%, Zeile%)
  106.  
  107. SHARED   Feld.Besitzer% (), Feld.Vorhanden% (),_
  108.          Feld.Zulaessig% (),_
  109.          Runde%, Spieler%
  110.  
  111. LOCAL    XFeld%, YFeld%
  112.  
  113. XFeld% = 5 + 6 * Zeile%     ' die Bildschirm-Koordinaten
  114. YFeld% = 2 + 3 * Spalte%
  115.  
  116. SELECT CASE Feld.Vorhanden% (Lage%)
  117.   CASE 1 : CALL EinStein (XFeld%, YFeld%)
  118.   CASE 2 : CALL ZweiSteine (XFeld%, YFeld%)
  119.   CASE 3 : CALL DreiSteine (XFeld%, YFeld%)
  120.   CASE 4 : CALL VierSteine (XFeld%, YFeld%)
  121.   CASE  ELSE
  122.            CALL Leer (XFeld%, YFeld%)
  123. END SELECT
  124. END SUB
  125. '----------------------------------------------------------
  126. SUB Wo (Nummer%, X%, Y%)
  127. X% = INT ((Nummer% - 1) / 6) + 1
  128. Y% = Nummer% - 6 * (X% - 1)
  129. END SUB
  130. '----------------------------------------------------------
  131. SUB Deckung (Nummer%, X%, Y%)
  132.  
  133. SHARED   Feld.Besitzer% (), Feld.Vorhanden% (),_
  134.          Feld.Zulaessig% (),_
  135.          Runde%, Spieler%
  136.  
  137. CALL BELL
  138. INCR Feld.Vorhanden% (Nummer%), 1
  139. Feld.Besitzer% (Nummer%) = Spieler%
  140. CALL Wo (Nummer%, X%, Y%)
  141. CALL SteineImFeld (Nummer%, X%, Y%)
  142. CALL BELL
  143. END SUB
  144. '----------------------------------------------------------
  145. SUB Explosion  (Ort%)
  146.  
  147. SHARED   Feld.Besitzer% (), Feld.Vorhanden% (),_
  148.          Feld.Zulaessig% (),_
  149.          Runde%, Spieler%
  150.  
  151. Feld.Vorhanden% (Ort%) = 0
  152. FeldNummer% = Ort% : CALL Wo (Feldnummer%, X%, Y%)
  153.  
  154. CALL SteineImFeld (FeldNummer%, X%, Y%)
  155. ' Unterstriche "_" beim Zeilenwechsel nicht vergessen !
  156. IF Ort% - 6 >   0 THEN FeldNummer% = Ort% - 6 :_
  157.                        CALL Deckung (FeldNummer%, X%, Y%)
  158. IF Ort% + 6 <= 36 THEN FeldNummer% = Ort% + 6 :_
  159.                        CALL Deckung (FeldNummer%, X%, Y%)
  160. IF Y% - 1   >   0 THEN FeldNummer% = Ort% - 1 :_
  161.                        CALL Deckung (FeldNummer%, X%, Y%)
  162. IF Y% + 1   <   6 THEN FeldNummer% = Ort% + 1 :_
  163.                        CALL Deckung (FeldNummer%, X%, Y%)
  164. END SUB
  165. '----------------------------------------------------------
  166. SUB Probe
  167.  
  168. SHARED   Feld.Besitzer% (), Feld.Vorhanden% (),_
  169.          Feld.Zulaessig% (),_
  170.          Runde%, Spieler%
  171.  
  172. LOCAL    Explodiert%, Stelle%
  173.  
  174. DO
  175.   Explodiert% = 0     'FALSE
  176.   FOR Stelle% = 1 TO %Max
  177.     IF Feld.Vorhanden% (Stelle%) >=_
  178.                              Feld.Zulaessig% (Stelle%) THEN
  179.       CALL Explosion (Stelle%)
  180.       Explodiert% = 1     ' TRUE
  181.     END IF
  182.   NEXT
  183. LOOP UNTIL Explodiert% = 0
  184.  
  185. END SUB
  186. '----------------------------------------------------------
  187. SUB SpielStand (Ende%)
  188.  
  189. SHARED   Feld.Besitzer% (), Feld.Vorhanden% (),_
  190.          Feld.Zulaessig% (),_
  191.          Runde%, Spieler%
  192.  
  193. LOCAL    FelderVonEins%, FelderVonZwei%, Fertig%, Kasten%
  194.  
  195. Ende% = 0
  196. FelderVonEins% = 0 : FelderVonZwei% = 0
  197. Fertig% = 0  ' FALSE
  198. FOR Kasten% = 1 TO %Max
  199.   IF Feld.Besitzer%(Kasten%) = 1 THEN INCR FelderVonEins%,1
  200.   IF Feld.Besitzer%(Kasten%) = 2 THEN INCR FelderVonZwei%,1
  201. NEXT
  202. IF Runde% > 1 THEN
  203.   IF (FelderVonEins% =0) OR (FelderVonZwei% = 0) THEN
  204.     LOCATE 23,25 : PRINT "SIEGER : Spieler ";
  205.     PRINT Spieler%; " in Runde "; Runde%
  206.     Ende% = 1
  207.   END IF
  208. END IF
  209. IF Spieler% = 2 THEN INCR Runde%
  210. LOCATE 2,55   : PRINT "Runde "; Runde%
  211. LOCATE 19,70  : PRINT USING "##"; FelderVonEins%;
  212. PRINT " Feld(er)"
  213. LOCATE 20,70  : PRINT USING "##"; FelderVonZwei%;
  214. PRINT " Feld(er)"
  215.  
  216. END SUB
  217. '----------------------------------------------------------
  218. SUB Fehler
  219. CALL BELL
  220. LOCATE 23, 32 : CALL INVERS
  221. PRINT " Nicht zulaessig ! " : CALL BELL
  222. DELAY (5)    ' Sekunden
  223. CALL NORMAL : CALL ClrEol (23, 32)
  224. END SUB
  225. '----------------------------------------------------------
  226. SUB HolEingabe (Taste$)
  227.  
  228. LOCAL Dummy$
  229.  
  230. WHILE INSTAT                    ' Tastaturpuffer leeren
  231.   Dummy$ = INKEY$
  232. WEND
  233. Taste$ = ""
  234. DO
  235.  Taste$ = INKEY$
  236. LOOP UNTIL Taste$ <> ""
  237.  
  238. ' Abfrage der IBM-Sondertasten, wir brauchen nur CONTROL-Q
  239. IF (ASC (Taste$) = 0) THEN_
  240.   IF ASC (MID$(Taste$,2,1)) <> 17 THEN Taste$ = "Z"
  241.                                     ' CTRL Q         ^
  242. END SUB
  243. '----------------------------------------------------------
  244. SUB Titel
  245.  
  246. CLS
  247. LOCATE 1,36: CALL INVERS: PRINT " STRATEGO ": CALL NORMAL
  248. END SUB
  249. '----------------------------------------------------------
  250. SUB SpielBeschreibung
  251.  
  252. %Zeile = 5
  253. CALL TITEL
  254. LOCATE %Zeile,2
  255. PRINT "Die Aufgabe bei diesem Spiel ist es, auf einem ";
  256. PRINT "Brett mit 36 Feldern alle"
  257. LOCATE %Zeile+1,2
  258. PRINT "Steine des Gegners zu zerstoeren."
  259. LOCATE %Zeile+4,26
  260. COLOR 9,0   ' Text wird unterstrichen
  261. PRINT "Dabei gelten folgende REGELN :"
  262. CALL NORMAL
  263. LOCATE %Zeile+6,2
  264. PRINT "1 - Die Steine werden abwechselnd gesetzt."
  265. LOCATE %Zeile+7,2
  266. PRINT "2 - Jedes Feld hat abhaengig von seiner Lage ";
  267. PRINT "eine bestimmte maximale Kapazitaet"
  268. CALL INVERS
  269. LOCATE %Zeile+8,24 : PRINT SPACE$ (32)
  270. LOCATE %Zeile+9,24
  271. PRINT " >>> Eckfelder   : 2 Steine <<< "
  272. LOCATE %Zeile+10,24
  273. PRINT " >>> Randfelder  : 3 Steine <<< "
  274. LOCATE %Zeile+11,24
  275. PRINT " >>> Innenfelder : 4 Steine <<< "
  276. LOCATE %Zeile+12,24 : PRINT SPACE$ (32)
  277. CALL NORMAL
  278. LOCATE %Zeile+13, 2
  279. PRINT "3 - Erreicht ein Feld seine maximale Kapazitaet, ";
  280. PRINT "werden die Steine explo-"
  281. LOCATE %Zeile+14, 6
  282. PRINT "sionsartig auf die Nachbarfelder geschleudert."
  283. LOCATE %Zeile+15, 2
  284. PRINT "4 - Auf ein irgendwann vom Gegner besetztes Feld ";
  285. PRINT "darf nicht gesetzt werden."
  286. LOCATE 23,31: CALL INVERS: PRINT " Weiter mit Tastendruck "
  287. CALL NORMAL
  288. WHILE NOT INSTAT
  289. WEND
  290. CALL TITEL
  291. END SUB
  292. '----------------------------------------------------------
  293. SUB SpielBrett
  294.  
  295. LOCAL   XL%, YL%,_
  296.         E1%, E2%, E3%, E4%, VE%, HO%, KR%,_
  297.         ZL%, ZR%, ZO%, ZU%, Temp$, Linie$, Leer$,_
  298.         Zeile1$, Zeile2$, Zeile3$, Zeile4$,_
  299.         Schleife%
  300.  
  301. ' Linien fuer den erweiterten IBM-Zeichensatz
  302. E1% = 218    '  OBEN LINKS
  303. E2% = 191    '  OBEN  RECHTS
  304. E3% = 192    '  UNTEN LINKS
  305. E4% = 217    '  UNTEN RECHTS
  306. VE% = 179    '  VERTIKALE LINIE
  307. HO% = 196    '  HORIZONTALE LINIE
  308. KR% = 197    '  KREUZUNG
  309. ZL% = 180    '  ZEIGER NACH LINKS
  310. ZR% = 195    '  ZEIGER NACH RECHTS
  311. ZO% = 193    '  ZEIGER NACH OBEN
  312. ZU% = 194    '  ZEIGER NACH UNTEN
  313.  
  314. XL% = 8 : YL% = 3
  315.  
  316. ' das Spielbrett wird mit fertigen Strings aufgebaut
  317. Linie$  = STRING$ (5, CHR$ (HO%))
  318. ' der STRING$-Befehl verwendet nur das erste Zeichen
  319. ' eines STRINGs!
  320. Leer$   = SPACE$ (5)
  321.  
  322. Temp$   = Linie$ + CHR$ (ZU%)
  323. Zeile1$ = CHR$ (E1%)
  324. FOR Schleife% = 1 TO 5
  325.   Zeile1$ = Zeile1$ + Temp$
  326. NEXT
  327. Zeile1$ = Zeile1$ + Linie$ + CHR$ (E2%)
  328.  
  329. Temp$ =  SPACE$ (5) + CHR$ (VE%)
  330. Zeile2$ = CHR$ (VE%)
  331. FOR Schleife% = 1 TO 6
  332.   Zeile2$ = Zeile2$ + Temp$
  333. NEXT
  334.  
  335. Temp$   = Linie$ + CHR$ (KR%)
  336. Zeile3$ = CHR$ (ZR%)
  337. FOR Schleife% = 1 TO 5
  338.   Zeile3$ = Zeile3$ + Temp$
  339. NEXT
  340. Zeile3$ = Zeile3$ + Linie$ + CHR$ (ZL%)
  341.  
  342. Temp$   = Linie$ + CHR$ (ZO%)
  343. Zeile4$ = CHR$ (E3%)
  344. FOR Schleife% = 1 TO 5
  345.   Zeile4$ = Zeile4$ + Temp$
  346. NEXT
  347. Zeile4$ = Zeile4$ + Linie$ + CHR$ (E4%)
  348.  
  349. FOR Schleife% = 1 TO 6
  350.   LOCATE YL%, XL%-2+6*Schleife% : PRINT CHR$(64+Schleife%)
  351. NEXT
  352.  
  353. INCR XL%, 1 : INCR YL%, 1
  354. LOCATE YL%, XL% : PRINT Zeile1$
  355.  
  356. FOR Schleife% = 1 TO 5
  357.   INCR YL%, 1
  358.   LOCATE YL%, XL% : PRINT Zeile2$
  359.   INCR YL%, 1
  360.   LOCATE YL%, XL% : PRINT Zeile2$
  361.   LOCATE YL%, XL% -4 : PRINT Schleife%
  362.   INCR YL%, 1
  363.   LOCATE YL%, XL% : PRINT Zeile3$
  364. NEXT
  365.  
  366. INCR YL%, 1
  367. LOCATE YL%, XL% : PRINT Zeile2$
  368. INCR YL%, 1
  369. LOCATE YL%, XL% : PRINT Zeile2$
  370. LOCATE YL%, XL% -4: PRINT Schleife%
  371.  
  372. INCR YL%, 1
  373. LOCATE YL%, XL% : PRINT Zeile4$
  374.  
  375. LOCATE 12,52 :  PRINT "Eingabebeispiel : A1"
  376. LOCATE 14,52 :  PRINT "Ende mit '^Q'"
  377. LOCATE 18,52 :  CALL INVERS : PRINT SPACE$ (17)
  378. LOCATE 19,52
  379. PRINT " Spieler 1   : " + CHR$ (%Stein.1) + SPACE$ (1)
  380. LOCATE 20,52
  381. PRINT " Spieler 2   : " + CHR$ (%Stein.2) + SPACE$ (1)
  382. LOCATE 21,52 :  PRINT SPACE$ (17) : CALL NORMAL
  383. END SUB
  384. '----------------------------------------------------------
  385. SUB WerIstDran
  386.  
  387. SHARED   Spieler%
  388.  
  389. IF Spieler% = 1 THEN Spieler% = 2 ELSE Spieler% = 1
  390.   CALL INVERS
  391.   LOCATE 5,50
  392.   PRINT " Zugeingabe Spieler "; Spieler%; " : "
  393.   LOCATE 7,50 :  PRINT SPACE$ (14)
  394.   LOCATE 8,50 :  PRINT "  auf Feld  : "
  395.   LOCATE 9,50 :  PRINT SPACE$ (14)
  396.   CALL NORMAL
  397. END SUB
  398. '----------------------------------------------------------
  399. SUB Kontrolle (Zeile$, Spalte$, Richtig%)
  400.  
  401. SHARED   Feld.Besitzer% (), Feld.Vorhanden% (),_
  402.          Feld.Zulaessig% (),_
  403.          Runde%, Spieler%
  404. LOCAL    ZE%, SP%
  405.  
  406. ZE% = ASC (Spalte$)-48 : SP% = ASC (Zeile$)-64
  407. Position% = (ZE% - 1) * 6 + SP%
  408. IF (Feld.Besitzer% (Position%) = Spieler%) OR_
  409.    (Feld.Besitzer% (Position%) = 0) THEN
  410.   Feld.Besitzer% (Position%) = Spieler%
  411.   INCR  Feld.Vorhanden% (Position%), 1
  412.   Richtig% = 1
  413.   CALL SteineImFeld (Position%, ZE%, SP%)
  414. ELSE
  415.   CALL Fehler
  416. END IF
  417. END SUB
  418. '----------------------------------------------------------
  419. SUB ZugEingabe
  420.  
  421. LOCAL   Korrekt%, OK%, Hilf%, Wahl1$, Wahl2$
  422.  
  423. Korrekt% = 0    ' FALSE
  424. DO     ' LOOP UNTIL Korrekt% = 1
  425.   CALL ClrEol (8, 65)
  426.   DO    ' LOOP UNTIL OK% = 1    ' Eingabe der Spalte A..F
  427.     OK% = 0
  428.     CALL HolEingabe (Taste$)
  429.     IF Taste$ = CHR$ (17) THEN STOP
  430.     Wahl1$ = UCASE$ (Taste$)
  431.     Hilf% = ASC (Wahl1$)
  432.     IF Hilf% >= 65 AND Hilf% <= 70 THEN OK% = 1_
  433.     ELSE CALL BELL
  434.   LOOP UNTIL OK% = 1
  435.   PRINT Wahl1$;
  436.   DO    ' LOOP UNTIL OK% = 1      ' Eingabe der Zeile 1..6
  437.     OK% = 0
  438.     CALL HolEingabe (Taste$)
  439.     Wahl2$ = UCASE$ (Taste$)
  440.     Hilf% = ASC (Wahl2$)
  441.     IF Hilf% >= 49 AND Hilf% <= 54 THEN OK% = 1_
  442.     ELSE CALL BELL
  443.   LOOP UNTIL OK% = 1
  444.   PRINT Wahl2$
  445.   CALL Kontrolle (Wahl1$, Wahl2$, Korrekt%)
  446. LOOP UNTIL Korrekt% = 1
  447.  
  448. END SUB
  449. '----------------------------------------------------------
  450. '              Hauptprogramm
  451. '----------------------------------------------------------
  452. CALL Initialisierung
  453. CALL Spielbeschreibung
  454. CALL Spielbrett
  455. DO
  456.   CALL WerIstDran
  457.   CALL ZugEingabe
  458.   CALL Probe
  459.   CALL SpielStand (Ende%)
  460. LOOP UNTIL Ende% = 1
  461. CALL HolEingabe (Taste$)
  462.  
  463. END
  464. '----------------------------------------------------------
  465. '                   Ende von STRATEGO.BAS