' Mhle ' unter Verwendung von Feldern sowie eines mathematischen ' Graphes fr die Darstellung der Mhlen DECLARE SUB PruefeMuehle (p%, Anfang%) DECLARE SUB Meldung (s%, m$) DECLARE SUB ZeichneFeld (p%, blk%) DECLARE SUB WaehlePosition (typ%, p%) DECLARE SUB HLinie (x1%, x2%, y%) DECLARE SUB VLinie (x%, y1%, y2%) SCREEN 0 WIDTH 40, 25 CLS DIM SHARED feld%(23), Eckz$(-1 TO 1, -1 TO 1), aSteine%(1 TO 2) DIM SHARED mgraph%(23, 3) FOR i% = -1 TO 1 FOR j% = -1 TO 1 Eckz$(j%, i%) = MID$("Ú¿ÃÅ´ÀÁÙ", 5 + 3 * i% + j%, 1) NEXT j% NEXT i% ' Quadrate FOR i% = 0 TO 2 ' obere Seite HLinie 3 + 2 * i%, 15 - 2 * i%, 3 + 2 * i% ' rechte Seite VLinie 15 - 2 * i%, 3 + 2 * i%, 15 - 2 * i% ' untere Seite HLinie 3 + 2 * i%, 15 - 2 * i%, 15 - 2 * i% ' linke Seite VLinie 3 + 2 * i%, 3 + 2 * i%, 15 - 2 * i% NEXT i% ' Strahlen VLinie 9, 3, 7 HLinie 11, 15, 9 VLinie 9, 11, 15 HLinie 3, 7, 9 ' Graph erzeugen ' Zuerst "resetten", d.h. alles auf -1 (da geht's nicht weiter) setzen FOR i% = 0 TO 23 FOR j% = 0 TO 3 mgraph%(i%, j%) = -1 NEXT j% NEXT i% ' Wege "herausbrennen" ' Strahlen FOR i% = 0 TO 7 ' Von innen nach aussen mgraph%(9 + 2 * i%, i% MOD 4) = 1 + 2 * i% ' Von aussen nach innen mgraph%(1 + 2 * i%, (i% + 2) MOD 4) = 9 + 2 * i% NEXT i% ' Quadrate FOR i% = 0 TO 23 ' Uhrzeigersinn mgraph%(i%, (i% \ 2 + 1) MOD 4) = 8 * (i% \ 8) + (i% + 1) MOD 8 ' Gegenuhrzeigersinn mgraph%(i%, (i% + 5) \ 2 MOD 4) = 8 * (i% \ 8) + (i% + 7) MOD 8 NEXT i% ' Spielfeld zurcksetzen und gleichzeitig fertig zeichnen FOR i% = 0 TO 23 feld%(i%) = 0 ZeichneFeld i%, 0 NEXT i% ' Spielbeginn: Alle 9 Steine der beiden Spieler setzen p% = 15 aSteine%(1) = 0 aSteine%(2) = 0 FOR i% = 1 TO 9 FOR s% = 1 TO 2 Meldung s%, "Spieler" + STR$(s%) + " bitte den" + STR$(i%) + ". Stein setzen" WaehlePosition 0, p% feld%(p%) = s% aSteine%(s%) = aSteine%(s%) + 1 ZeichneFeld p%, 0 PruefeMuehle p%, -1 NEXT s% NEXT i% s% = 1 gesperrt% = 0 WHILE aSteine%(1) >= 3 AND aSteine%(2) >= 3 AND NOT gesperrt% ' Prfen, ob nicht gesperrt IF aSteine%(s%) > 3 THEN gesperrt% = -1 FOR i% = 0 TO 23 IF feld%(i%) = s% THEN FOR j% = 0 TO 3 IF mgraph%(i%, j%) <> -1 THEN IF feld%(mgraph%(i%, j%)) = 0 THEN gesperrt% = 0 END IF END IF NEXT j% END IF NEXT i% END IF IF NOT gesperrt% THEN Meldung s%, "Spieler" + STR$(s%) + " am Zug - Stein w„hlen" DO WaehlePosition s%, p% IF aSteine%(s%) = 3 THEN ' Nur noch drei Steine -> darf springen gueltig% = -1 ELSE gueltig% = 0 ' Nur Stein erlauben, den man auch ziehen kann FOR i% = 0 TO 3 IF mgraph%(p%, i%) <> -1 THEN IF feld%(mgraph%(p%, i%)) = 0 THEN gueltig% = -1 END IF END IF NEXT i% END IF IF NOT gueltig% THEN SOUND 440! / 2! ^ .75, 7! END IF LOOP UNTIL gueltig% Meldung s%, "Spieler" + STR$(s%) + " am Zug - Zielfeld w„hlen" p1% = p% ZeichneFeld p1%, 1 DO WaehlePosition 0, p% IF aSteine%(s%) = 3 THEN ' Nur noch drei Steine => darf springen gueltig% = -1 ELSE gueltig% = 0 ' Nur Nachbarfeld erlauben FOR i% = 0 TO 3 IF mgraph%(p%, i%) = p1% THEN gueltig% = -1 END IF NEXT i% END IF IF NOT gueltig% THEN SOUND 440! * 2! ^ .75, 2! END IF LOOP UNTIL gueltig% feld%(p1%) = 0 ZeichneFeld p1%, 0 feld%(p%) = s% ZeichneFeld p%, 0 PruefeMuehle p%, 0 s% = 3 - s% END IF WEND IF gesperrt% THEN Meldung 3 - s%, "Spieler" + STR$(3 - s%) + " hat gewonnen (gesperrt)" ELSE Meldung 3 - s%, "Spieler" + STR$(3 - s%) + " hat gewonnen" END IF d$ = INPUT$(1) SUB HLinie (x1%, x2%, y%) LOCATE y%, x1% PRINT STRING$(x2% - x1% + 1, 196); END SUB SUB Meldung (s%, m$) LOCATE 1, 1 COLOR 14 - 5 * s% PRINT m$; SPACE$(39 - LEN(m$)); END SUB SUB PruefeMuehle (p%, Anfang%) DIM f1%(23), p1%(1) s% = feld%(p%) m% = -1 FOR i% = 0 TO 1 p1%(i%) = p% ' Anfang der Mhle suchen WHILE mgraph%(p1%(i%), i% + 2) <> -1 p1%(i%) = mgraph%(p1%(i%), i% + 2) WEND m2% = -1 p2% = p1%(i%) WHILE p2% <> -1 IF feld%(p2%) <> s% THEN m2% = 0 END IF p2% = mgraph%(p2%, i%) WEND IF m2% THEN m% = i% END IF NEXT i% IF m% <> -1 THEN p2% = p1%(m%) WHILE p2% <> -1 ZeichneFeld p2%, 1 p2% = mgraph%(p2%, m%) WEND PLAY "o3t90l16cd#cd#" FOR i% = 0 TO 23 f1%(i%) = feld%(i%) NEXT i% ' Alle Mhlen des Gegners suchen, da Steine einer ' Mhle nicht weggenommen werden drfen FOR i% = 0 TO 23 IF f1%(i%) = 3 - s% THEN FOR j% = 0 TO 1 p2% = i% ' Anfang der Mhle suchen WHILE mgraph%(p2%, j% + 2) <> -1 p2% = mgraph%(p2%, j% + 2) WEND m2% = -1 p3% = p2% WHILE p3% <> -1 IF feld%(p3%) <> 3 - s% THEN m2% = 0 END IF p3% = mgraph%(p3%, j%) WEND IF m2% THEN WHILE p2% <> -1 f1%(p2%) = -1 p2% = mgraph%(p2%, j%) WEND END IF NEXT j% END IF NEXT i% IF aSteine%(3 - s%) > 3 OR Anfang% THEN Meldung s%, "Mhle -> Stein vom Gegner entfernen" DO WaehlePosition 3 - s%, p% IF f1%(p%) = -1 THEN ' Geh”rt zu einer Mhle => nachschauen, ob der ' Gegner nur noch Mhlen hat (nur dann darf er genommen ' werden) gueltig% = -1 FOR i% = 0 TO 23 IF f1%(i%) = 3 - s% THEN gueltig% = 0 END IF NEXT i% ELSE gueltig% = -1 END IF IF NOT gueltig% THEN SOUND 440! / 2! ^ .5, 5! END IF LOOP UNTIL gueltig% feld%(p%) = 0 ZeichneFeld p%, 0 ' Hervorhebung wieder l”schen p2% = p1%(m%) WHILE p2% <> -1 ZeichneFeld p2%, 0 p2% = mgraph%(p2%, m%) WEND END IF aSteine%(3 - s%) = aSteine%(3 - s%) - 1 END IF END SUB SUB VLinie (x%, y1%, y2%) FOR i% = y1% TO y2% LOCATE i%, x% PRINT "³"; NEXT i% END SUB SUB WaehlePosition (typ%, p%) ' Eingangsparameter: ' typ%=Feldtyp, z.B. leer ' Ausgangsparameter: ' p% = Position im Spielfeld ' (p%\8 = Quadrat, p% MOD 8 = Richtung) DO r% = p% MOD 8 q% = p% \ 8 IF r% >= 2 AND r% <= 4 THEN ry% = 1 ELSEIF r% = 0 OR r% >= 6 THEN ry% = -1 ELSE ry% = 0 END IF IF r% <= 2 THEN rx% = 1 ELSEIF r% >= 4 AND r% <= 6 THEN rx% = -1 ELSE rx% = 0 END IF LOCATE 9 + ry% * (6 - 2 * q%), 9 + rx% * (6 - 2 * q%), 1 DO t$ = INKEY$ LOOP WHILE t$ = "" LOCATE , , 0 rAbs% = -1 SELECT CASE t$ CASE CHR$(0) + "M" rAbs% = 0 CASE CHR$(0) + "P" rAbs% = 1 CASE CHR$(0) + "K" rAbs% = 2 CASE CHR$(0) + "H" rAbs% = 3 CASE CHR$(13) IF feld%(p%) <> typ% THEN SOUND 440! * 2! ^ 1.5, 4! t$ = "" END IF CASE ELSE SOUND 880!, 2! END SELECT IF rAbs% <> -1 THEN ' Cursor anhand des Graphen wandern lassen IF mgraph%(p%, rAbs%) = -1 THEN IF p% < 8 THEN ' „usseres Quadrat => kein Weiterbewegen m”glich SOUND 440! * 2! ^ 1.75, 1! ELSEIF p% MOD 2 = 0 THEN ' Eckfelder => eins nach aussen p% = p% - 8 ELSE ' bleiben nur noch die Mittelfelder p% = 8 * (p% \ 8) + (p% + 4) MOD 8 END IF ELSE p% = mgraph%(p%, rAbs%) END IF END IF LOOP UNTIL t$ = CHR$(13) END SUB SUB ZeichneFeld (p%, blk%) r% = p% MOD 8 q% = p% \ 8 IF r% >= 2 AND r% <= 4 THEN ry% = 1 ELSEIF r% = 0 OR r% >= 6 THEN ry% = -1 ELSE ry% = 0 END IF IF r% <= 2 THEN rx% = 1 ELSEIF r% >= 4 AND r% <= 6 THEN rx% = -1 ELSE rx% = 0 END IF LOCATE 9 + ry% * (6 - 2 * q%), 9 + rx% * (6 - 2 * q%) IF feld%(p%) = 0 THEN COLOR 7 IF r% MOD 2 = 0 OR q% = 0 THEN PRINT Eckz$(rx%, ry%); ELSEIF q% = 1 THEN PRINT Eckz$(0, 0); ELSE PRINT Eckz$(-rx%, -ry%); END IF ELSE COLOR 14 - 5 * feld%(p%) + 16 * blk% PRINT "þ"; END IF END SUB