mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 02:52:24 +00:00
minesweeper example added
This commit is contained in:
parent
1e13d96ce1
commit
a2fbb3aaa4
4 changed files with 666 additions and 0 deletions
216
src/test/X11/mines/Linie.Mod
Normal file
216
src/test/X11/mines/Linie.Mod
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
411
src/test/X11/mines/Minesweeper.Mod
Normal file
411
src/test/X11/mines/Minesweeper.Mod
Normal file
|
|
@ -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.
|
||||||
22
src/test/X11/mines/Readme.md
Normal file
22
src/test/X11/mines/Readme.md
Normal file
|
|
@ -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
|
||||||
|
|
||||||
17
src/test/X11/mines/makefile
Normal file
17
src/test/X11/mines/makefile
Normal file
|
|
@ -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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue