From a2fbb3aaa4680d068731530b19fee7477170559d Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Mon, 3 Feb 2014 16:48:44 +0400 Subject: [PATCH] minesweeper example added --- src/test/X11/mines/Linie.Mod | 216 +++++++++++++++ src/test/X11/mines/Minesweeper.Mod | 411 +++++++++++++++++++++++++++++ src/test/X11/mines/Readme.md | 22 ++ src/test/X11/mines/makefile | 17 ++ 4 files changed, 666 insertions(+) create mode 100644 src/test/X11/mines/Linie.Mod create mode 100644 src/test/X11/mines/Minesweeper.Mod create mode 100644 src/test/X11/mines/Readme.md create mode 100644 src/test/X11/mines/makefile diff --git a/src/test/X11/mines/Linie.Mod b/src/test/X11/mines/Linie.Mod new file mode 100644 index 00000000..53074e42 --- /dev/null +++ b/src/test/X11/mines/Linie.Mod @@ -0,0 +1,216 @@ +MODULE Linie; + +IMPORT XYplane := oocXYplane, In := compatIn; + +VAR abbruch: BOOLEAN; +Zaehler,Wert1, Wert2, Wert3, Wert4,Wert5, Wert6, Wert7, Wert8,Ende: INTEGER; + +(* Version 1.0 / 6.April 96 / Peter Brantschen *) + +PROCEDURE Linie*(StartX,StartY,EndeX,EndeY: INTEGER); + +VAR i,x,y,LaengeX,LaengeY: INTEGER; + + +BEGIN +LaengeX:=EndeX-StartX; +LaengeY:=EndeY-StartY; +IF LaengeX>=0 THEN + IF LaengeY>=0 THEN + FOR i:=0 TO LaengeX DO; + IF LaengeX#0 THEN + x:=StartX+i; + y:=StartY + (i*LaengeY)DIV LaengeX; + XYplane.Dot(x,y,1); + END; + END; + FOR i:=0 TO LaengeY DO; + IF LaengeY#0 THEN + x:=StartX + (i*LaengeX) DIV LaengeY; + y:=StartY + i; + XYplane.Dot(x,y,1); + END; + END; + ELSE + FOR i:=0 TO LaengeX DO; + IF LaengeX#0 THEN + x:=StartX+i; + y:=StartY + (i*LaengeY)DIV LaengeX; + XYplane.Dot(x,y,1); + END; + END; + FOR i:=LaengeY TO 0 DO; + IF LaengeY#0 THEN + x:=StartX + (i*LaengeX) DIV LaengeY; + y:=StartY + i; + XYplane.Dot(x,y,1); + END; + END; + END; +ELSE + IF LaengeY>=0 THEN + FOR i:=LaengeX TO 0 DO; + IF LaengeX#0 THEN + x:=StartX+i; + y:=StartY + (i*LaengeY)DIV LaengeX; + XYplane.Dot(x,y,1); + END; + END; + FOR i:=0 TO LaengeY DO; + IF LaengeY#0 THEN + x:=StartX + (i*LaengeX) DIV LaengeY; + y:=StartY + i; + XYplane.Dot(x,y,1); + END; + END; + ELSE + FOR i:=LaengeX TO 0 DO; + IF LaengeX#0 THEN + x:=StartX+i; + y:=StartY + (i*LaengeY)DIV LaengeX; + XYplane.Dot(x,y,1); + END; + END; + FOR i:=LaengeY TO 0 DO; + IF LaengeY#0 THEN + x:=StartX + (i*LaengeX) DIV LaengeY; + y:=StartY + i; + XYplane.Dot(x,y,1); + END; + END; + END; +END; + +END Linie; + +PROCEDURE LoescheLinie*(StartX,StartY,EndeX,EndeY: INTEGER); + +VAR i,x,y,LaengeX,LaengeY: INTEGER; + + +BEGIN +LaengeX:=EndeX-StartX; +LaengeY:=EndeY-StartY; +IF LaengeX>=0 THEN + IF LaengeY>=0 THEN + FOR i:=0 TO LaengeX DO; + IF LaengeX#0 THEN + x:=StartX+i; + y:=StartY + (i*LaengeY)DIV LaengeX; + XYplane.Dot(x,y,0); + END; + END; + FOR i:=0 TO LaengeY DO; + IF LaengeY#0 THEN + x:=StartX + (i*LaengeX) DIV LaengeY; + y:=StartY + i; + XYplane.Dot(x,y,0); + END; + END; + ELSE + FOR i:=0 TO LaengeX DO; + IF LaengeX#0 THEN + x:=StartX+i; + y:=StartY + (i*LaengeY)DIV LaengeX; + XYplane.Dot(x,y,0); + END; + END; + FOR i:=LaengeY TO 0 DO; + IF LaengeY#0 THEN + x:=StartX + (i*LaengeX) DIV LaengeY; + y:=StartY + i; + XYplane.Dot(x,y,0); + END; + END; + END; +ELSE + IF LaengeY>=0 THEN + FOR i:=LaengeX TO 0 DO; + IF LaengeX#0 THEN + x:=StartX+i; + y:=StartY + (i*LaengeY)DIV LaengeX; + XYplane.Dot(x,y,0); + END; + END; + FOR i:=0 TO LaengeY DO; + IF LaengeY#0 THEN + x:=StartX + (i*LaengeX) DIV LaengeY; + y:=StartY + i; + XYplane.Dot(x,y,0); + END; + END; + ELSE + FOR i:=LaengeX TO 0 DO; + IF LaengeX#0 THEN + x:=StartX+i; + y:=StartY + (i*LaengeY)DIV LaengeX; + XYplane.Dot(x,y,0); + END; + END; + FOR i:=LaengeY TO 0 DO; + IF LaengeY#0 THEN + x:=StartX + (i*LaengeX) DIV LaengeY; + y:=StartY + i; + XYplane.Dot(x,y,0); + END; + END; + END; +END; + +END LoescheLinie; + + +PROCEDURE Fraktal(x1,y1,x2,y2: INTEGER); + +BEGIN; +IF ~abbruch THEN + INC(Zaehler); + IF Zaehler>Ende THEN abbruch:=TRUE; END; + Linie(x1,y1,x2,y2); + Fraktal(x1+ Wert1,y1+Wert2,x2+Wert3,y2+Wert4); +END; + +END Fraktal; + +PROCEDURE Fraktal4Eck(x1,y1,x2,y2,x3,y3,x4,y4: INTEGER); + +BEGIN +IF ~abbruch THEN + INC(Zaehler); + IF Zaehler>Ende THEN abbruch:=TRUE; END; + Linie(x1,y1,x2,y2); + Linie(x2,y2,x3,y3); + Linie(x3,y3,x4,y4); + Linie(x4,y4,x1,y1); + Fraktal4Eck(x1+ Wert1,y1+Wert2,x2+Wert3,y2+Wert4,x3+ Wert5,y3+Wert6,x4+Wert7,y4+Wert8); +END; + +END Fraktal4Eck; + +PROCEDURE Start*; + +BEGIN + XYplane.Open; + In.Open; + In.Int(Wert1); In.Int(Wert2); In.Int(Wert3); In.Int(Wert4);In.Int(Ende); + abbruch:=FALSE; + Zaehler:=0; + Fraktal(150,150,250,250); +END Start; + +PROCEDURE Start4Eck*; + +BEGIN + XYplane.Open; + In.Open; + In.Int(Wert1); In.Int(Wert2); In.Int(Wert3); In.Int(Wert4); + In.Int(Wert5); In.Int(Wert6); In.Int(Wert7); In.Int(Wert8);In.Int(Ende); + abbruch:=FALSE; + Zaehler:=0; + Fraktal4Eck(150,150,150,250,250,250,250,150); +END Start4Eck; + +END Linie. + + + diff --git a/src/test/X11/mines/Minesweeper.Mod b/src/test/X11/mines/Minesweeper.Mod new file mode 100644 index 00000000..b7878f2a --- /dev/null +++ b/src/test/X11/mines/Minesweeper.Mod @@ -0,0 +1,411 @@ +MODULE Minesweeper; + +IMPORT X:=oocXYplane, L:=Linie, In := compatIn, Out := Console, RN:=ethRandomNumbers; + +VAR + Feld: ARRAY 41, 41 OF INTEGER; + Spielfeld: ARRAY 41, 41 OF INTEGER; + Bombenfeld: ARRAY 41, 41 OF BOOLEAN; + Anzahl: ARRAY 42, 42 OF INTEGER; + Test: ARRAY 42, 42 OF BOOLEAN; + Nummer,Bomben : INTEGER; + Feldgroesse,Schritte: INTEGER; + +PROCEDURE FuelleKaestchen(x,y: INTEGER); + +VAR i: INTEGER; + +BEGIN + FOR i:=0 TO 8 DO; + IF i MOD 2=0 THEN + L.Linie(40+10*x+9-i,40+10*y+1,40+10*x+1,40+10*y+9-i); + L.Linie(40+10*x+9, 40+10*y+1+i,40+10*x+1+i,40+10*y+9); + END; + END; +END FuelleKaestchen; + +PROCEDURE Signatur; + +BEGIN; + X.Dot(2,2,1);X.Dot(3,2,1); X.Dot(4,2,1); X.Dot(6,2,1);X.Dot(8,2,1); X.Dot(9,2,1); X.Dot(10,2,1); X.Dot(14,2,1); + X.Dot(19,2,1);X.Dot(20,2,1); X.Dot(21,2,1); X.Dot(23,2,1); X.Dot(24,2,1); X.Dot(25,2,1); + X.Dot(3,3,1);X.Dot(6,3,1); X.Dot(8,3,1); X.Dot(9,3,1);X.Dot(11,3,1); X.Dot(14,3,1); X.Dot(21,3,1); X.Dot(23,3,1); + X.Dot(25,3,1); + X.Dot(3,4,1);X.Dot(6,4,1); X.Dot(7,4,1); X.Dot(8,4,1);X.Dot(9,4,1); X.Dot(11,4,1); X.Dot(14,4,1); + X.Dot(19,4,1);X.Dot(20,4,1); X.Dot(21,4,1); X.Dot(23,4,1); X.Dot(24,4,1); X.Dot(25,4,1); + X.Dot(3,5,1);X.Dot(6,5,1); X.Dot(7,5,1); X.Dot(8,5,1);X.Dot(9,5,1); X.Dot(11,5,1); X.Dot(13,5,1); X.Dot(15,5,1); + X.Dot(19,5,1);X.Dot(21,5,1); X.Dot(23,5,1); + X.Dot(2,6,1);X.Dot(3,6,1); X.Dot(4,6,1); X.Dot(6,6,1);X.Dot(8,6,1); X.Dot(9,6,1); X.Dot(10,6,1); X.Dot(13,6,1); + X.Dot(15,6,1); X.Dot(17,6,1); X.Dot(19,6,1);X.Dot(20,6,1); X.Dot(21,6,1); X.Dot(23,6,1); X.Dot(24,6,1); X.Dot(25,6,1); +END Signatur; + +PROCEDURE MaleFeld; + +VAR i,j: INTEGER; + +BEGIN + X.Open; + Signatur; + Schritte:=0; + FOR i:=1 TO Feldgroesse DO; FOR j:=1 TO Feldgroesse DO; Feld[i,j]:=0; END; END; + FOR i:=1 TO Feldgroesse DO; FOR j:=1 TO Feldgroesse DO; Spielfeld[i,j]:=11; END; END; + FOR i:=1 TO Feldgroesse DO; FOR j:=1 TO Feldgroesse DO; Bombenfeld[i,j]:=FALSE; END; END; + FOR i:=0 TO Feldgroesse+1 DO; FOR j:=0 TO Feldgroesse+1 DO; Test[i,j]:=FALSE; END; END; + FOR i:=0 TO Feldgroesse+1 DO; FOR j:=0 TO Feldgroesse+1 DO; Anzahl[i,j]:=0; END; END; + FOR i:=0 TO Feldgroesse+1 DO; Test[i,0]:=TRUE; END; + FOR i:=0 TO Feldgroesse+1 DO; Test[i,Feldgroesse+1]:=TRUE; END; + FOR i:=0 TO Feldgroesse+1 DO; Test[0,i]:=TRUE; END; + FOR i:=0 TO Feldgroesse+1 DO; Test[Feldgroesse+1,i]:=TRUE; END; + FOR i:=0 TO 10*Feldgroesse DO; + IF i MOD 10 = 0 THEN + L.Linie(50,50+i,50+10*Feldgroesse,50+i); + L.Linie(50+i,50,50+i,50+10*Feldgroesse); + END; + END; + FOR i:=0 TO Feldgroesse-1 DO; + FOR j:=0 TO Feldgroesse-1 DO; + FuelleKaestchen(1+i,1+j); + Feld[i+1,j+1]:=11; + END; + END; + +END MaleFeld; + +PROCEDURE MarkKaestchen(x,y: INTEGER); + +VAR i: INTEGER; + +BEGIN + L.Linie(40+10*x+1,40+10*y+1,40+10*x+9,40+10*y+1); + L.Linie(40+10*x+9,40+10*y+1,40+10*x+9,40+10*y+9); + L.Linie(40+10*x+9,40+10*y+9,40+10*x+1,40+10*y+9); + L.Linie(40+10*x+1,40+10*y+9,40+10*x+1,40+10*y+1); +END MarkKaestchen; + +PROCEDURE LoescheKaestchen(x,y: INTEGER); + +VAR i: INTEGER; + +BEGIN + FOR i:=1 TO 9 DO; + L.LoescheLinie(40+10*x+1,40+10*y+i,40+10*x+9,40+10*y+i); + END; +END LoescheKaestchen; + +PROCEDURE KreuzeKaestchen(x,y: INTEGER); + +VAR i: INTEGER; + +BEGIN + FOR i:=1 TO 9 DO; + L.Linie(40+10*x+i,40+10*y+i,40+10*x+10-i,40+10*y+10-i); + L.Linie(40+10*x+10-i,40+10*y+i,40+10*x+i,40+10*y+10-i) + END; +END KreuzeKaestchen; + +PROCEDURE EinsKaestchen(x,y: INTEGER); + +BEGIN + L.Linie(40+10*x+3,40+10*y+5,40+10*x+6,40+10*y+8); + L.Linie(40+10*x+6,40+10*y+8,40+10*x+6,40+10*y+2); +END EinsKaestchen; + +PROCEDURE ZweiKaestchen(x,y: INTEGER); + +BEGIN + L.Linie(40+10*x+3,40+10*y+8,40+10*x+6,40+10*y+8); + L.Linie(40+10*x+3,40+10*y+5,40+10*x+6,40+10*y+5); + L.Linie(40+10*x+3,40+10*y+2,40+10*x+6,40+10*y+2); + L.Linie(40+10*x+6,40+10*y+8,40+10*x+6,40+10*y+5); + L.Linie(40+10*x+3,40+10*y+5,40+10*x+3,40+10*y+2); +END ZweiKaestchen; + +PROCEDURE DreiKaestchen(x,y: INTEGER); + +BEGIN + L.Linie(40+10*x+3,40+10*y+8,40+10*x+6,40+10*y+8); + L.Linie(40+10*x+3,40+10*y+5,40+10*x+6,40+10*y+5); + L.Linie(40+10*x+3,40+10*y+2,40+10*x+6,40+10*y+2); + L.Linie(40+10*x+6,40+10*y+8,40+10*x+6,40+10*y+5); + L.Linie(40+10*x+6,40+10*y+5,40+10*x+6,40+10*y+2); +END DreiKaestchen; + +PROCEDURE VierKaestchen(x,y: INTEGER); + +BEGIN + L.Linie(40+10*x+3,40+10*y+8,40+10*x+3,40+10*y+5); + L.Linie(40+10*x+3,40+10*y+5,40+10*x+6,40+10*y+5); + L.Linie(40+10*x+5,40+10*y+7,40+10*x+5,40+10*y+2); +END VierKaestchen; + +PROCEDURE FuenfKaestchen(x,y: INTEGER); + +BEGIN + L.Linie(40+10*x+3,40+10*y+8,40+10*x+6,40+10*y+8); + L.Linie(40+10*x+3,40+10*y+5,40+10*x+6,40+10*y+5); + L.Linie(40+10*x+3,40+10*y+2,40+10*x+6,40+10*y+2); + L.Linie(40+10*x+3,40+10*y+8,40+10*x+3,40+10*y+5); + L.Linie(40+10*x+6,40+10*y+5,40+10*x+6,40+10*y+2); +END FuenfKaestchen; + +PROCEDURE SechsKaestchen(x,y: INTEGER); + +BEGIN + L.Linie(40+10*x+3,40+10*y+5,40+10*x+6,40+10*y+5); + L.Linie(40+10*x+3,40+10*y+2,40+10*x+6,40+10*y+2); + L.Linie(40+10*x+3,40+10*y+8,40+10*x+3,40+10*y+2); + L.Linie(40+10*x+6,40+10*y+5,40+10*x+6,40+10*y+2); +END SechsKaestchen; + +PROCEDURE SiebenKaestchen(x,y: INTEGER); + +BEGIN + L.Linie(40+10*x+3,40+10*y+8,40+10*x+7,40+10*y+8); + L.Linie(40+10*x+3,40+10*y+2,40+10*x+7,40+10*y+8); +END SiebenKaestchen; + +PROCEDURE AchtKaestchen(x,y: INTEGER); + +BEGIN + L.Linie(40+10*x+3,40+10*y+8,40+10*x+7,40+10*y+8); + L.Linie(40+10*x+3,40+10*y+5,40+10*x+7,40+10*y+5); + L.Linie(40+10*x+3,40+10*y+2,40+10*x+7,40+10*y+2); + L.Linie(40+10*x+3,40+10*y+8,40+10*x+3,40+10*y+2); + L.Linie(40+10*x+7,40+10*y+8,40+10*x+7,40+10*y+2); +END AchtKaestchen; + +PROCEDURE BombeKaestchen(x,y: INTEGER); + +BEGIN + L.Linie(40+10*x+3,40+10*y+6,40+10*x+7,40+10*y+6); + L.Linie(40+10*x+2,40+10*y+5,40+10*x+8,40+10*y+5); + L.Linie(40+10*x+2,40+10*y+4,40+10*x+8,40+10*y+4); + L.Linie(40+10*x+3,40+10*y+3,40+10*x+7,40+10*y+3); + L.Linie(40+10*x+5,40+10*y+8,40+10*x+5,40+10*y+3); +END BombeKaestchen; + +PROCEDURE Zufall(a: INTEGER); + +VAR z: LONGINT; i,j,k,l:INTEGER; fertig: BOOLEAN; + gesetzt: ARRAY 41,41 OF BOOLEAN; + +BEGIN + Nummer:=0; + RN.InitSeed(a); + FOR i:=1 TO Feldgroesse DO; FOR j:=1 TO Feldgroesse DO; gesetzt[i,j]:=FALSE; END; END; + WHILE ~fertig DO; + z:= ENTIER(Feldgroesse*Feldgroesse*RN.Uniform()); + FOR i:=1 TO Feldgroesse DO + FOR j:=1 TO Feldgroesse DO + IF z=0 THEN + IF ~gesetzt[i,j] THEN + Bombenfeld[i,j]:=TRUE;; + FOR k:=1 TO 3 DO; + FOR l:=1 TO 3 DO; + INC(Anzahl[i-2+k,j-2+l]); + END; + END; + gesetzt[i,j]:=TRUE; + INC(Nummer); + IF Nummer=Bomben THEN fertig:=TRUE END; + END; + END; + DEC(z); + END; + END; + END; +END Zufall; + + +PROCEDURE Kontrolle(x,y: INTEGER); + +BEGIN + LoescheKaestchen(x,y); + INC(Schritte); + IF Feld[x,y]=1 THEN KreuzeKaestchen(x,y); END; + IF Feld[x,y]=2 THEN EinsKaestchen(x,y); END; + IF Feld[x,y]=3 THEN ZweiKaestchen(x,y); END; + IF Feld[x,y]=4 THEN DreiKaestchen(x,y); END; + IF Feld[x,y]=5 THEN VierKaestchen(x,y); END; + IF Feld[x,y]=6 THEN FuenfKaestchen(x,y); END; + IF Feld[x,y]=7 THEN SechsKaestchen(x,y); END; + IF Feld[x,y]=8 THEN SiebenKaestchen(x,y); END; + IF Feld[x,y]=9 THEN AchtKaestchen(x,y); END; + IF Feld[x,y]=10 THEN BombeKaestchen(x,y); END; + IF Feld[x,y]=11 THEN FuelleKaestchen(x,y); END; +END Kontrolle; + +PROCEDURE AnzahlBomben(x,y: INTEGER); + +BEGIN; + IF ~(((x<1)OR(x>Feldgroesse))OR((y<1)OR(y>Feldgroesse))) THEN + IF Anzahl[x,y]=1 THEN + IF Feld[x,y]=11 THEN EinsKaestchen(x,y); Feld[x,y]:=2; Test[x,y]:=TRUE;END; + ELSIF Anzahl[x,y]=2 THEN + IF Feld[x,y]=11 THEN ZweiKaestchen(x,y); Feld[x,y]:=3; Test[x,y]:=TRUE;END; + ELSIF Anzahl[x,y]=3 THEN + IF Feld[x,y]=11 THEN DreiKaestchen(x,y); Feld[x,y]:=4; Test[x,y]:=TRUE;END; + ELSIF Anzahl[x,y]=4 THEN + IF Feld[x,y]=11 THEN VierKaestchen(x,y); Feld[x,y]:=5;Test[x,y]:=TRUE;END; + ELSIF Anzahl[x,y]=5 THEN + IF Feld[x,y]=11 THEN FuenfKaestchen(x,y); Feld[x,y]:=6;Test[x,y]:=TRUE;END; + ELSIF Anzahl[x,y]=6 THEN + IF Feld[x,y]=11 THEN SechsKaestchen(x,y); Feld[x,y]:=7;Test[x,y]:=TRUE;END; + ELSIF Anzahl[x,y]=7 THEN + IF Feld[x,y]=11 THEN SiebenKaestchen(x,y); Feld[x,y]:=8;Test[x,y]:=TRUE;END; + ELSIF Anzahl[x,y]=8 THEN + IF Feld[x,y]=11 THEN AchtKaestchen(x,y);Feld[x,y]:=9;Test[x,y]:=TRUE; END; + END; + END; +END AnzahlBomben; + +PROCEDURE OeffneFreieKaestchen(x,y: INTEGER); + +VAR i,j: INTEGER; + +BEGIN +FOR i:=0 TO 2 DO + FOR j:=0 TO 2 DO + IF ~Test[x-1+i,y-1+j] THEN + IF ~(((x-1+i<1) OR (y-1+j<1)) OR ((x-1+i>Feldgroesse) OR (y-1+j>Feldgroesse))) THEN + Test[x-1+i,y-1+j]:=TRUE; + IF Feld[x-1+i,y-1+j]=11 THEN + LoescheKaestchen(x-1+i,y-1+j); + IF Anzahl[x-1+i,y-1+j]>0 THEN + AnzahlBomben(x-1+i,y-1+j); + ELSE + Feld[x-1+i,y-1+j]:=0; + OeffneFreieKaestchen(x-1+i,y-1+j); + END; + END; + END; + END; + END; +END; + +END OeffneFreieKaestchen; + +PROCEDURE Start*; + +VAR x,y,i,j, Zaehler,VermuteteBomben: INTEGER; key: CHAR; geloest,abbruch,wechsel: BOOLEAN; + +BEGIN + In.Open; x:=234; + In.Int(x); + Feldgroesse:=10; + In.Int(Feldgroesse); + Bomben:=15; + In.Int(Bomben); + Out.Ln; + MaleFeld; + Zufall(x); + x:=1; y:=1; Zaehler:=0; abbruch:=FALSE; wechsel:=FALSE; + VermuteteBomben:=0; + WHILE ~abbruch DO; + key:=X.Key(); + IF Bomben+5>Feldgroesse*Feldgroesse THEN Out.String("Weniger Bomben !"); key:="q";END; + IF key="8" THEN + Kontrolle(x,y); + INC(y); + IF y>Feldgroesse THEN y:=Feldgroesse; END; END; + IF key="2" THEN + Kontrolle(x,y); + DEC(y); + IF y<1 THEN y:=1;END; END; + IF key="6" THEN + Kontrolle(x,y); + INC(x); + IF x>Feldgroesse THEN x:=Feldgroesse; END; END; + IF key="4" THEN + Kontrolle(x,y); + DEC(x); + IF x<1 THEN x:=1;END; END; + IF key="5" THEN + IF Feld[x,y]=11 THEN Feld[x,y]:=1; Spielfeld[x,y]:=1; INC(VermuteteBomben); + ELSIF Feld[x,y]=1 THEN Feld[x,y]:=11; Spielfeld[x,y]:=11; DEC(VermuteteBomben); END; + wechsel:=TRUE; + Out.String("VermuteteBomben: ");Out.Int(VermuteteBomben,3); + Out.Char("/"); Out.Int(Bomben,3); Out.Ln; + IF VermuteteBomben=Bomben THEN + geloest:=TRUE; + FOR i:=1 TO Feldgroesse DO; + FOR j:=1 TO Feldgroesse DO; + IF Bombenfeld[i,j] THEN + IF Feld[i,j]#1 THEN geloest:=FALSE; Out.Char("."); END; + END; + END; + END; + IF geloest THEN Out.String("Bravo, du hast alle Bomben entdeckt."); Out.Ln; key:="q"; + Out.String("Koeffizient: "); Out.Int(100*Feldgroesse DIV Bomben * Schritte,3); Out.Ln; END; + END; + END; + IF key=" " THEN + IF ~Bombenfeld[x,y] THEN + IF Spielfeld[x,y]=11 THEN + IF Anzahl[x,y]>=1 THEN LoescheKaestchen(x,y); + AnzahlBomben(x,y); MarkKaestchen(x,y); + ELSE + LoescheKaestchen(x,y); + Feld[x,y]:=0; + MarkKaestchen(x,y); + Test[x,y]:=TRUE; + OeffneFreieKaestchen(x,y); + END; + END; + ELSE + IF Spielfeld[x,y]=11 THEN + Out.String("Treffer, Spiel leider fertig !"); Out.Ln; + FOR i:=1 TO Feldgroesse DO; FOR j:=1 TO Feldgroesse DO; + IF Bombenfeld[i,j] THEN + LoescheKaestchen(i,j); + BombeKaestchen(i,j); + IF Feld[i,j]=1 THEN MarkKaestchen(i,j);END; + END; + END; END; + key:="q"; + END; + END; + END; + IF wechsel THEN + LoescheKaestchen(x,y); + wechsel:=FALSE; + END; + IF Feld[x,y]=1 THEN MarkKaestchen(x,y); KreuzeKaestchen(x,y); + ELSIF Feld[x,y]=2 THEN MarkKaestchen(x,y); EinsKaestchen(x,y); + ELSIF Feld[x,y]=3 THEN MarkKaestchen(x,y); ZweiKaestchen(x,y); + ELSIF Feld[x,y]=4 THEN MarkKaestchen(x,y); DreiKaestchen(x,y); + ELSIF Feld[x,y]=5 THEN MarkKaestchen(x,y); VierKaestchen(x,y); + ELSIF Feld[x,y]=6 THEN MarkKaestchen(x,y); FuenfKaestchen(x,y); + ELSIF Feld[x,y]=7 THEN MarkKaestchen(x,y); SechsKaestchen(x,y); + ELSIF Feld[x,y]=8 THEN MarkKaestchen(x,y); SiebenKaestchen(x,y); + ELSIF Feld[x,y]=9 THEN MarkKaestchen(x,y); AchtKaestchen(x,y); + ELSIF Feld[x,y]=10 THEN MarkKaestchen(x,y); BombeKaestchen(x,y); + ELSIF Feld[x,y]=11 THEN MarkKaestchen(x,y); FuelleKaestchen(x,y); + ELSE + MarkKaestchen(x,y); + END; + IF key="q" THEN abbruch:=TRUE; END; + END; +END Start; + +PROCEDURE Anleitung*; + +BEGIN + Out.String("Minesweeper Version Beta 1"); Out.Ln; + Out.String("8 = nach oben ; "); + Out.String("2 = nach unten");Out.Ln; + Out.String("4 = nach links; "); + Out.String("6 = nach rechts");Out.Ln; + Out.String("5 = Bombe markieren");Out.Ln; + Out.String("(SPACE) = oeffnen");Out.Ln; + Out.String("q = abbrechen");Out.Ln; + Out.String("Minesweeper.Start Level Feldgroesse AnzahlBomben"); Out.Ln; + Out.String("Level = LONGINT Zahl"); Out.Ln; + Out.String("Feldgroesse = 3 - 40"); Out.Ln; + Out.String("AnzahlBomben = 1-(Feldgroesse^2-5)"); Out.Ln; + Out.String("z.B. Minesweeper.Start 13546 10 18");Out.Ln; +END Anleitung; + +BEGIN +Start +END Minesweeper. diff --git a/src/test/X11/mines/Readme.md b/src/test/X11/mines/Readme.md new file mode 100644 index 00000000..93be7b71 --- /dev/null +++ b/src/test/X11/mines/Readme.md @@ -0,0 +1,22 @@ +Build by typing + +# make + +Start Minesweeper with +./Minesweeper a b c ~ + + a Level (1-100); + b Row/Collumns of area; + c Number of bombs in area. + + + During the game, the following keys are availiable: + + 8 ... up + 2 ... down + 4 ... left + 6 ... right + 5 ... mark bomb (where you think one is) + Space ... open field + q ... quit + diff --git a/src/test/X11/mines/makefile b/src/test/X11/mines/makefile new file mode 100644 index 00000000..3a794e62 --- /dev/null +++ b/src/test/X11/mines/makefile @@ -0,0 +1,17 @@ +#for old systems like RHEL4 use +#CFLAGS=-L/usr/X11R6/lib -lX11 +CFLAGS=-lX11 +export CFLAGS + +VOC = $(SETPATH) /opt/voc/bin/voc + +all: + $(VOC) -s Linie.Mod Minesweeper.Mod -m + #$(VOC) -Cm test.Mod + #gcc -o test test.o -fPIC -g -I /opt/voc-1.0/src/lib/system/gnuc/x86_64 -I /opt/voc-1.0/lib/voc/obj -lVishapOberon -L. -L/opt/voc-1.0/lib -lX11 + +clean: + rm *.c + rm *.h + rm *.sym + rm *.o