mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 20:22:24 +00:00
parent
262a44b56c
commit
7cdca222af
32 changed files with 0 additions and 0 deletions
15
src/test/x11/0/makefile
Normal file
15
src/test/x11/0/makefile
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#for old systems like RHEL4 use
|
||||
#CFLAGS=-L/usr/X11R6/lib -lX11
|
||||
CFLAGS=-lX11
|
||||
export CFLAGS
|
||||
|
||||
VOC = $(SETPATH) /opt/voc/bin/voc
|
||||
|
||||
all:
|
||||
$(VOC) -m test.Mod
|
||||
#$(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 *.o
|
||||
29
src/test/x11/0/test.Mod
Normal file
29
src/test/x11/0/test.Mod
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
MODULE test;
|
||||
|
||||
IMPORT p := oocXYplane, Out := Console;
|
||||
VAR ch : CHAR;
|
||||
i : INTEGER;
|
||||
BEGIN
|
||||
|
||||
p.Open;
|
||||
|
||||
(*p.Clear;*)
|
||||
FOR i := 1 TO 555 DO
|
||||
p.Dot(i,300 ,p.draw)
|
||||
END;
|
||||
(*
|
||||
FOR i := 100 TO 500 DO
|
||||
p.Dot(i,300 ,p.erase)
|
||||
END;
|
||||
*)
|
||||
|
||||
IF p.IsDot (5, 300) THEN Out.String("Yes") ELSE Out.String("No") END; Out.Ln;
|
||||
IF p.IsDot (5, 500) THEN Out.String("Yes") ELSE Out.String("No") END; Out.Ln;
|
||||
|
||||
REPEAT
|
||||
ch := p.Key();
|
||||
UNTIL ch # 0X;
|
||||
|
||||
p.Close;
|
||||
|
||||
END test.
|
||||
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.
|
||||
26
src/test/x11/mines/Readme.md
Normal file
26
src/test/x11/mines/Readme.md
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
This is a game historycal source taken from http://web.archive.org/web/20050212180221/http://www.vis.inf.ethz.ch/~andy/Oberon.html
|
||||
|
||||
It serves as an example of XYplane module useage
|
||||
|
||||
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
|
||||
442
src/test/x11/pacman/Grafik.Mod
Normal file
442
src/test/x11/pacman/Grafik.Mod
Normal file
|
|
@ -0,0 +1,442 @@
|
|||
MODULE Grafik;
|
||||
(*enthƒlt verschiedene Grafik-Befehle*)
|
||||
|
||||
IMPORT XYplane := oocXYplane,Out := Console;
|
||||
|
||||
TYPE sprite*=ARRAY 10,10 OF BOOLEAN;
|
||||
|
||||
VAR zahlen*:ARRAY 10 OF sprite;
|
||||
buchstaben*:ARRAY 27 OF sprite;
|
||||
satzzeichen*:ARRAY 2 OF sprite;
|
||||
|
||||
PROCEDURE Linie*(StartX,StartY,EndeX,EndeY:INTEGER);
|
||||
VAR LaengeX,LaengeY,PunktX,PunktY,hilfe,zaehler:INTEGER;
|
||||
Steigung:REAL;
|
||||
BEGIN
|
||||
IF StartX>EndeX THEN
|
||||
hilfe:=StartX;
|
||||
StartX:=EndeX;
|
||||
EndeX:=hilfe;
|
||||
hilfe:=StartY;
|
||||
StartY:=EndeY;
|
||||
EndeY:=hilfe;
|
||||
END;
|
||||
LaengeX:=EndeX-StartX;
|
||||
LaengeY:=EndeY-StartY;
|
||||
IF LaengeX=0 THEN
|
||||
IF EndeY>StartY THEN
|
||||
PunktY:=StartY
|
||||
ELSE
|
||||
PunktY:=EndeY
|
||||
END;
|
||||
PunktX:=StartX;
|
||||
LaengeY:=ABS(LaengeY);
|
||||
FOR zaehler:=1 TO LaengeY DO
|
||||
INC(PunktY);
|
||||
XYplane.Dot(PunktX,PunktY,XYplane.draw);
|
||||
END;
|
||||
RETURN;
|
||||
END;
|
||||
Steigung:=LaengeY/LaengeX;
|
||||
FOR zaehler:=1 TO LaengeX DO
|
||||
PunktX:=StartX+zaehler;
|
||||
hilfe:=SHORT(ENTIER(zaehler*Steigung));
|
||||
PunktY:=StartY+hilfe;
|
||||
XYplane.Dot(PunktX,PunktY,XYplane.draw);
|
||||
END;
|
||||
END Linie;
|
||||
|
||||
PROCEDURE SpriteSetzen*(s:sprite; x,y:INTEGER);
|
||||
VAR i,j:INTEGER;
|
||||
BEGIN
|
||||
FOR j:=0 TO 9 DO
|
||||
FOR i:=0 TO 9 DO
|
||||
IF s[i,j] THEN XYplane.Dot(x+i,y+j,XYplane.draw)
|
||||
ELSE XYplane.Dot(x+i,y+j,XYplane.erase);
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
END SpriteSetzen;
|
||||
|
||||
PROCEDURE SpriteLoeschen*(x,y:INTEGER);
|
||||
VAR i,j:INTEGER;
|
||||
BEGIN
|
||||
FOR j:=0 TO 9 DO
|
||||
FOR i:=0 TO 9 DO
|
||||
XYplane.Dot(x+i,y+j,XYplane.erase)
|
||||
END
|
||||
END
|
||||
END SpriteLoeschen;
|
||||
|
||||
PROCEDURE SpriteBewegen*(s:sprite; ax,ay,bx,by,bremse:INTEGER);
|
||||
VAR cx,cy,i,j:INTEGER;
|
||||
BEGIN
|
||||
cx:=ax;
|
||||
cy:=ay;
|
||||
REPEAT
|
||||
FOR i:=1 TO bremse DO j:=i MOD 7 END;
|
||||
IF cx>bx THEN
|
||||
FOR i:=0 TO 9 DO XYplane.Dot(cx+9,cy+i,XYplane.erase) END;
|
||||
DEC(cx);
|
||||
ELSIF cx<bx THEN
|
||||
FOR i:=0 TO 9 DO XYplane.Dot(cx,cy+i,XYplane.erase) END;
|
||||
INC(cx);
|
||||
END;
|
||||
IF cy>by THEN
|
||||
FOR i:=0 TO 9 DO XYplane.Dot(cx+i,cy+9,XYplane.erase) END;
|
||||
DEC(cy);
|
||||
ELSIF cy<by THEN
|
||||
FOR i:=0 TO 9 DO XYplane.Dot(cx+i,cy,XYplane.erase) END;
|
||||
INC(cy);
|
||||
END;
|
||||
SpriteSetzen(s,cx,cy);
|
||||
UNTIL (cx=bx) & (cy=by);
|
||||
END SpriteBewegen;
|
||||
|
||||
PROCEDURE SpriteDrehen*(anzahl:INTEGER; VAR s:sprite);
|
||||
VAR a,i,j:INTEGER;
|
||||
t:sprite;
|
||||
BEGIN
|
||||
FOR a:=1 TO anzahl DO
|
||||
t:=s;
|
||||
FOR j:=0 TO 9 DO
|
||||
FOR i:=0 TO 9 DO
|
||||
s[j,9-i]:=t[i,j]
|
||||
END
|
||||
END
|
||||
END
|
||||
END SpriteDrehen;
|
||||
|
||||
PROCEDURE SpriteEinfuegen*(s:sprite; x,y:INTEGER);
|
||||
VAR i,j:INTEGER;
|
||||
BEGIN
|
||||
FOR j:=0 TO 9 DO
|
||||
FOR i:=0 TO 9 DO
|
||||
IF s[i,j] & (~XYplane.IsDot(x+i,y+j)) THEN XYplane.Dot(x+i,y+j,XYplane.draw) END
|
||||
END
|
||||
END
|
||||
END SpriteEinfuegen;
|
||||
|
||||
PROCEDURE Schreiben*(ausgabe:ARRAY OF CHAR; laenge,x,y:INTEGER);
|
||||
VAR i,c:INTEGER;
|
||||
BEGIN
|
||||
FOR i:=0 TO laenge-1 DO
|
||||
c:=ORD(ausgabe[i]);
|
||||
IF (c>=48) & (c<=57) THEN
|
||||
SpriteSetzen(zahlen[c-48],x+10*i,y);
|
||||
END;
|
||||
IF c=58 THEN
|
||||
SpriteSetzen(satzzeichen[c-58],x+10*i,y);
|
||||
END;
|
||||
IF c=33 THEN
|
||||
SpriteSetzen(satzzeichen[c-32],x+10*i,y);
|
||||
END;
|
||||
IF (c>=65) & (c<=91) THEN
|
||||
SpriteSetzen(buchstaben[c+1-65],x+10*i,y);
|
||||
END;
|
||||
IF c=32 THEN
|
||||
SpriteLoeschen(x+10*i,y);
|
||||
END;
|
||||
END;
|
||||
END Schreiben;
|
||||
|
||||
PROCEDURE ZahlSchreiben*(zahl:LONGINT; x,y:INTEGER);
|
||||
VAR i,zaehler:INTEGER;
|
||||
BEGIN
|
||||
zaehler:=0;
|
||||
WHILE zahl>0 DO
|
||||
i:=SHORT(zahl-10*(ENTIER(zahl/10)));
|
||||
zahl:=ENTIER(zahl/10);
|
||||
SpriteSetzen(zahlen[i],x-10*zaehler,y);
|
||||
INC(zaehler);
|
||||
END;
|
||||
END ZahlSchreiben;
|
||||
|
||||
PROCEDURE InitZahlen;
|
||||
VAR i,j:INTEGER;
|
||||
BEGIN
|
||||
FOR j:=0 TO 9 DO
|
||||
FOR i:=0 TO 9 DO
|
||||
zahlen[1,i,j]:=FALSE;
|
||||
END;
|
||||
END;
|
||||
FOR j:=1 TO 8 DO
|
||||
FOR i:=0 TO 1 DO
|
||||
zahlen[0,j,i]:=TRUE;
|
||||
zahlen[0,j,9-i]:=TRUE;
|
||||
zahlen[0,i+1,j]:=TRUE;
|
||||
zahlen[0,8-i,j]:=TRUE;
|
||||
END;
|
||||
END;
|
||||
FOR i:=0 TO 9 DO
|
||||
zahlen[1,4,i]:=TRUE;
|
||||
zahlen[1,5,i]:=TRUE;
|
||||
END;
|
||||
FOR i:=1 TO 8 DO
|
||||
FOR j:=0 TO 1 DO
|
||||
zahlen[2,i,j]:=TRUE;
|
||||
zahlen[2,i,4+j]:=TRUE;
|
||||
zahlen[2,i,9-j]:=TRUE;
|
||||
END;
|
||||
END;
|
||||
zahlen[2,1,2]:=TRUE; zahlen[2,2,2]:=TRUE; zahlen[2,1,3]:=TRUE; zahlen[2,2,3]:=TRUE;
|
||||
zahlen[2,7,6]:=TRUE; zahlen[2,8,6]:=TRUE; zahlen[2,7,7]:=TRUE; zahlen[2,8,7]:=TRUE;
|
||||
FOR i:=1 TO 8 DO
|
||||
FOR j:=0 TO 1 DO
|
||||
zahlen[3,i,j]:=TRUE;
|
||||
zahlen[3,i,4+j]:=TRUE;
|
||||
zahlen[3,i,9-j]:=TRUE;
|
||||
zahlen[3,8-j,i]:=TRUE;
|
||||
END;
|
||||
END;
|
||||
FOR i:=0 TO 1 DO
|
||||
FOR j:=0 TO 9 DO
|
||||
zahlen[4,7+i,j]:=TRUE;
|
||||
END;
|
||||
FOR j:=1 TO 8 DO
|
||||
zahlen[4,j,4+i]:=TRUE;
|
||||
END;
|
||||
FOR j:=4 TO 9 DO
|
||||
zahlen[4,1+i,j]:=TRUE;
|
||||
END;
|
||||
END;
|
||||
FOR i:=1 TO 8 DO
|
||||
FOR j:=0 TO 1 DO
|
||||
zahlen[5,i,j]:=TRUE;
|
||||
zahlen[5,i,4+j]:=TRUE;
|
||||
zahlen[5,i,9-j]:=TRUE;
|
||||
END;
|
||||
END;
|
||||
zahlen[5,8,2]:=TRUE; zahlen[5,7,2]:=TRUE; zahlen[5,8,3]:=TRUE; zahlen[5,7,3]:=TRUE;
|
||||
zahlen[5,2,6]:=TRUE; zahlen[5,1,6]:=TRUE; zahlen[5,2,7]:=TRUE; zahlen[5,1,7]:=TRUE;
|
||||
zahlen[6]:=zahlen[2];
|
||||
FOR i:=0 TO 1 DO
|
||||
FOR j:=0 TO 1 DO
|
||||
zahlen[6,8-i,2+j]:=TRUE;
|
||||
zahlen[6,1+i,6+j]:=TRUE;
|
||||
zahlen[6,8-i,6+j]:=FALSE;
|
||||
END;
|
||||
END;
|
||||
FOR i:=0 TO 1 DO
|
||||
FOR j:=0 TO 9 DO
|
||||
zahlen[7,8-i,j]:=TRUE;
|
||||
END;
|
||||
FOR j:=1 TO 8 DO
|
||||
zahlen[7,j,9-i]:=TRUE;
|
||||
END;
|
||||
END;
|
||||
zahlen[8]:=zahlen[6];
|
||||
zahlen[8,7,6]:=TRUE; zahlen[8,8,6]:=TRUE; zahlen[8,7,7]:=TRUE; zahlen[8,8,7]:=TRUE;
|
||||
zahlen[9]:=zahlen[3];
|
||||
zahlen[9,1,6]:=TRUE; zahlen[9,2,6]:=TRUE; zahlen[9,1,7]:=TRUE; zahlen[9,2,7]:=TRUE;
|
||||
END InitZahlen;
|
||||
|
||||
PROCEDURE InitBuchstaben;
|
||||
VAR i,j,k:INTEGER;
|
||||
BEGIN
|
||||
FOR k:=0 TO 26 DO
|
||||
FOR j:=0 TO 9 DO
|
||||
FOR i:=0 TO 9 DO
|
||||
buchstaben[k,i,j]:=FALSE;
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
(* A *)
|
||||
FOR i:=0 TO 9 DO
|
||||
buchstaben[1,1,i]:=TRUE; buchstaben[1,2,i]:=TRUE;
|
||||
buchstaben[1,7,i]:=TRUE; buchstaben[1,8,i]:=TRUE;
|
||||
END;
|
||||
FOR i:=3 TO 6 DO
|
||||
buchstaben[1,i,4]:=TRUE; buchstaben[1,i,5]:=TRUE;
|
||||
buchstaben[1,i,8]:=TRUE; buchstaben[1,i,9]:=TRUE;
|
||||
END;
|
||||
(* B *)
|
||||
buchstaben[2]:=zahlen[8];
|
||||
buchstaben[2,8,0]:=FALSE; buchstaben[2,8,1]:=FALSE;
|
||||
buchstaben[2,8,4]:=FALSE; buchstaben[2,8,5]:=FALSE;
|
||||
buchstaben[2,8,8]:=FALSE; buchstaben[2,8,9]:=FALSE;
|
||||
(* C *)
|
||||
buchstaben[3]:=zahlen[0];
|
||||
FOR i:=2 TO 7 DO
|
||||
buchstaben[3,7,i]:=FALSE; buchstaben[3,8,i]:=FALSE;
|
||||
END;
|
||||
(* D *)
|
||||
buchstaben[4]:=zahlen[0];
|
||||
FOR i:=0 TO 2 DO
|
||||
buchstaben[4,8,i]:=FALSE; buchstaben[4,8,9-i]:=FALSE;
|
||||
END;
|
||||
buchstaben[4,7,0]:=FALSE; buchstaben[4,7,9]:=FALSE;
|
||||
buchstaben[4,6,2]:=TRUE; buchstaben[4,6,7]:=TRUE;
|
||||
(* E *)
|
||||
buchstaben[5]:=zahlen[3];
|
||||
SpriteDrehen(2,buchstaben[5]);
|
||||
(* F *)
|
||||
FOR i:=0 TO 9 DO
|
||||
buchstaben[6,1,i]:=TRUE; buchstaben[6,2,i]:=TRUE;
|
||||
IF i<8 THEN
|
||||
buchstaben[6,i+1,4]:=TRUE; buchstaben[6,i+1,5]:=TRUE;
|
||||
buchstaben[6,i+1,8]:=TRUE; buchstaben[6,i+1,9]:=TRUE;
|
||||
END;
|
||||
END;
|
||||
(* G *)
|
||||
buchstaben[7]:=zahlen[6];
|
||||
buchstaben[7,3,4]:=FALSE; buchstaben[7,4,4]:=FALSE;
|
||||
buchstaben[7,3,5]:=FALSE; buchstaben[7,4,5]:=FALSE;
|
||||
(* H *)
|
||||
FOR i:=0 TO 9 DO
|
||||
buchstaben[8,1,i]:=TRUE; buchstaben[8,2,i]:=TRUE;
|
||||
buchstaben[8,7,i]:=TRUE; buchstaben[8,8,i]:=TRUE;
|
||||
END;
|
||||
FOR i:=3 TO 6 DO
|
||||
buchstaben[8,i,4]:=TRUE; buchstaben[8,i,5]:=TRUE;
|
||||
END;
|
||||
(* I *)
|
||||
FOR i:=0 TO 9 DO
|
||||
buchstaben[9,4,i]:=TRUE; buchstaben[9,5,i]:=TRUE;
|
||||
END;
|
||||
buchstaben[10]:=buchstaben[9];
|
||||
FOR i:=1 TO 3 DO
|
||||
buchstaben[10,i,0]:=TRUE; buchstaben[10,i,1]:=TRUE;
|
||||
END;
|
||||
(* K *)
|
||||
FOR i:=0 TO 9 DO
|
||||
buchstaben[11,1,i]:=TRUE; buchstaben[11,2,i]:=TRUE;
|
||||
END;
|
||||
buchstaben[11,3,4]:=TRUE; buchstaben[11,3,5]:=TRUE;
|
||||
buchstaben[11,4,3]:=TRUE; buchstaben[11,4,4]:=TRUE;
|
||||
buchstaben[11,4,5]:=TRUE; buchstaben[11,4,6]:=TRUE;
|
||||
buchstaben[11,5,2]:=TRUE; buchstaben[11,5,3]:=TRUE;
|
||||
buchstaben[11,5,6]:=TRUE; buchstaben[11,5,7]:=TRUE;
|
||||
buchstaben[11,6,1]:=TRUE; buchstaben[11,6,2]:=TRUE;
|
||||
buchstaben[11,6,7]:=TRUE; buchstaben[11,6,8]:=TRUE;
|
||||
buchstaben[11,7,0]:=TRUE; buchstaben[11,7,1]:=TRUE;
|
||||
buchstaben[11,7,8]:=TRUE; buchstaben[11,7,9]:=TRUE;
|
||||
buchstaben[11,8,0]:=TRUE; buchstaben[11,8,9]:=TRUE;
|
||||
(* L *)
|
||||
buchstaben[12]:=zahlen[7];
|
||||
SpriteDrehen(2,buchstaben[12]);
|
||||
(* M *)
|
||||
buchstaben[13]:=buchstaben[8];
|
||||
buchstaben[13,3,4]:=FALSE; buchstaben[13,3,5]:=FALSE;
|
||||
buchstaben[13,3,6]:=TRUE; buchstaben[13,3,7]:=TRUE;
|
||||
buchstaben[13,6,4]:=FALSE; buchstaben[13,6,5]:=FALSE;
|
||||
buchstaben[13,6,6]:=TRUE; buchstaben[13,6,7]:=TRUE;
|
||||
(* N *)
|
||||
buchstaben[14]:=buchstaben[8];
|
||||
buchstaben[14,3,4]:=FALSE; buchstaben[14,3,5]:=FALSE;
|
||||
buchstaben[14,3,6]:=TRUE; buchstaben[14,3,7]:=TRUE;
|
||||
buchstaben[14,6,2]:=TRUE; buchstaben[14,6,3]:=TRUE;
|
||||
buchstaben[14,6,4]:=FALSE; buchstaben[14,6,5]:=FALSE;
|
||||
(* O *)
|
||||
buchstaben[15]:=zahlen[0];
|
||||
(* P *)
|
||||
buchstaben[16]:=buchstaben[6];
|
||||
buchstaben[16,7,7]:=TRUE; buchstaben[16,7,6]:=TRUE;
|
||||
buchstaben[16,8,7]:=TRUE; buchstaben[16,8,6]:=TRUE;
|
||||
(* Q *)
|
||||
buchstaben[17]:=zahlen[0];
|
||||
buchstaben[17,5,0]:=FALSE; buchstaben[17,6,0]:=FALSE;
|
||||
buchstaben[17,5,1]:=FALSE; buchstaben[17,6,1]:=FALSE;
|
||||
buchstaben[17,5,2]:=TRUE; buchstaben[17,6,2]:=TRUE;
|
||||
buchstaben[17,5,3]:=TRUE; buchstaben[17,6,3]:=TRUE;
|
||||
buchstaben[17,7,2]:=FALSE; buchstaben[17,8,2]:=FALSE;
|
||||
buchstaben[17,7,3]:=FALSE; buchstaben[17,8,3]:=FALSE;
|
||||
(* R *)
|
||||
buchstaben[18]:=buchstaben[16];
|
||||
buchstaben[18,4,3]:=TRUE; buchstaben[18,5,3]:=TRUE;
|
||||
buchstaben[18,5,2]:=TRUE; buchstaben[18,6,2]:=TRUE;
|
||||
buchstaben[18,6,1]:=TRUE; buchstaben[18,7,1]:=TRUE;
|
||||
buchstaben[18,7,0]:=TRUE; buchstaben[18,8,0]:=TRUE;
|
||||
(* S *)
|
||||
buchstaben[19]:=zahlen[5];
|
||||
(* T *)
|
||||
FOR i:=0 TO 9 DO
|
||||
buchstaben[20,4,i]:=TRUE; buchstaben[20,5,i]:=TRUE;
|
||||
IF (i>0) & (i<9) THEN
|
||||
buchstaben[20,i,8]:=TRUE; buchstaben[20,i,9]:=TRUE;
|
||||
END;
|
||||
END;
|
||||
(* U *)
|
||||
buchstaben[21]:=buchstaben[12];
|
||||
FOR i:=2 TO 9 DO
|
||||
buchstaben[21,7,i]:=TRUE; buchstaben[21,8,i]:=TRUE;
|
||||
END;
|
||||
(* V *)
|
||||
FOR i:=5 TO 9 DO
|
||||
buchstaben[22,1,i]:=TRUE; buchstaben[22,2,i]:=TRUE;
|
||||
buchstaben[22,7,i]:=TRUE; buchstaben[22,8,i]:=TRUE;
|
||||
END;
|
||||
buchstaben[22,2,3]:=TRUE; buchstaben[22,2,4]:=TRUE;
|
||||
buchstaben[22,7,3]:=TRUE; buchstaben[22,7,4]:=TRUE;
|
||||
buchstaben[22,3,3]:=TRUE; buchstaben[22,3,4]:=TRUE;
|
||||
buchstaben[22,6,3]:=TRUE; buchstaben[22,6,4]:=TRUE;
|
||||
buchstaben[22,3,2]:=TRUE; buchstaben[22,4,2]:=TRUE;
|
||||
buchstaben[22,5,2]:=TRUE; buchstaben[22,5,2]:=TRUE;
|
||||
buchstaben[22,4,1]:=TRUE; buchstaben[22,5,1]:=TRUE;
|
||||
buchstaben[22,4,0]:=TRUE; buchstaben[22,5,0]:=TRUE;
|
||||
(* W *)
|
||||
buchstaben[23]:=buchstaben[13];
|
||||
SpriteDrehen(2,buchstaben[23]);
|
||||
(* X *)
|
||||
buchstaben[24,1,0]:=TRUE; buchstaben[24,2,0]:=TRUE;
|
||||
buchstaben[24,1,1]:=TRUE; buchstaben[24,2,1]:=TRUE;
|
||||
buchstaben[24,2,2]:=TRUE; buchstaben[24,3,2]:=TRUE;
|
||||
buchstaben[24,3,3]:=TRUE; buchstaben[24,4,3]:=TRUE;
|
||||
buchstaben[24,4,4]:=TRUE;
|
||||
FOR j:=0 TO 4 DO
|
||||
FOR i:=0 TO 4 DO
|
||||
buchstaben[24,9-i,j]:=buchstaben[24,i,j];
|
||||
buchstaben[24,i,9-j]:=buchstaben[24,i,j];
|
||||
buchstaben[24,9-i,9-j]:=buchstaben[24,i,j];
|
||||
END;
|
||||
END;
|
||||
(* Y *)
|
||||
FOR i:=0 TO 6 DO
|
||||
buchstaben[25,4,i]:=TRUE; buchstaben[25,5,i]:=TRUE;
|
||||
END;
|
||||
buchstaben[25,3,6]:=TRUE; buchstaben[25,6,6]:=TRUE;
|
||||
buchstaben[25,2,7]:=TRUE; buchstaben[25,3,7]:=TRUE;
|
||||
buchstaben[25,6,7]:=TRUE; buchstaben[25,7,7]:=TRUE;
|
||||
buchstaben[25,1,8]:=TRUE; buchstaben[25,2,8]:=TRUE;
|
||||
buchstaben[25,7,8]:=TRUE; buchstaben[25,8,8]:=TRUE;
|
||||
buchstaben[25,1,9]:=TRUE; buchstaben[25,2,9]:=TRUE;
|
||||
buchstaben[25,7,9]:=TRUE; buchstaben[25,8,9]:=TRUE;
|
||||
(* Z *)
|
||||
FOR i:=1 TO 8 DO
|
||||
buchstaben[26,i,0]:=TRUE; buchstaben[26,i,1]:=TRUE;
|
||||
buchstaben[26,i,8]:=TRUE; buchstaben[26,i,9]:=TRUE;
|
||||
END;
|
||||
buchstaben[26,2,2]:=TRUE; buchstaben[26,3,2]:=TRUE;
|
||||
buchstaben[26,3,3]:=TRUE; buchstaben[26,4,3]:=TRUE;
|
||||
buchstaben[26,4,4]:=TRUE; buchstaben[26,5,4]:=TRUE;
|
||||
buchstaben[26,4,5]:=TRUE; buchstaben[26,5,5]:=TRUE;
|
||||
buchstaben[26,5,6]:=TRUE; buchstaben[26,6,6]:=TRUE;
|
||||
buchstaben[26,6,7]:=TRUE; buchstaben[26,7,7]:=TRUE;
|
||||
END InitBuchstaben;
|
||||
|
||||
PROCEDURE InitSatzzeichen;
|
||||
VAR i,j,k:INTEGER;
|
||||
BEGIN
|
||||
FOR k:=0 TO 0 DO
|
||||
FOR j:=0 TO 9 DO
|
||||
FOR i:=0 TO 9 DO
|
||||
satzzeichen[k,i,j]:=FALSE;
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
(* : *)
|
||||
satzzeichen[0,4,2]:=TRUE; satzzeichen[0,5,2]:=TRUE;
|
||||
satzzeichen[0,4,3]:=TRUE; satzzeichen[0,5,3]:=TRUE;
|
||||
satzzeichen[0,4,6]:=TRUE; satzzeichen[0,5,6]:=TRUE;
|
||||
satzzeichen[0,4,7]:=TRUE; satzzeichen[0,5,7]:=TRUE;
|
||||
(* ! *)
|
||||
satzzeichen[1]:=buchstaben[9];
|
||||
satzzeichen[1,4,2]:=FALSE; satzzeichen[1,5,2]:=FALSE;
|
||||
satzzeichen[1,4,3]:=FALSE; satzzeichen[1,5,3]:=FALSE;
|
||||
END InitSatzzeichen;
|
||||
|
||||
BEGIN
|
||||
InitZahlen;
|
||||
InitBuchstaben;
|
||||
InitSatzzeichen;
|
||||
END Grafik.
|
||||
548
src/test/x11/pacman/PacMan.Mod
Normal file
548
src/test/x11/pacman/PacMan.Mod
Normal file
|
|
@ -0,0 +1,548 @@
|
|||
MODULE PacMan;
|
||||
|
||||
(* (C) Copyright 1996 by Roland Brand, Aarau *)
|
||||
|
||||
IMPORT XYplane := oocXYplane ,Out := Console ,Grafik,RandomNumbers := ethRandomNumbers;
|
||||
|
||||
TYPE figur=RECORD
|
||||
PosX,PosY,Richtung,Blick:INTEGER;
|
||||
END;
|
||||
|
||||
CONST stop=0;
|
||||
links=1;
|
||||
rechts=2;
|
||||
hoch=3;
|
||||
runter=4;
|
||||
Bremse=100;
|
||||
|
||||
VAR Feld:ARRAY 39,25 OF INTEGER;
|
||||
pcman,geistli,punkt,linie,kreuzung,ecke:Grafik.sprite;
|
||||
pcm:figur;
|
||||
geist: ARRAY 4 OF figur;
|
||||
score:LONGINT;
|
||||
AnzPunkte:INTEGER;
|
||||
|
||||
PROCEDURE Initialisieren;
|
||||
VAR i,j:INTEGER;
|
||||
BEGIN
|
||||
XYplane.Clear;
|
||||
score:=0;
|
||||
FOR j:=0 TO 24 DO
|
||||
FOR i:=0 TO 38 DO
|
||||
Feld[i,j]:=0;
|
||||
END;
|
||||
END;
|
||||
FOR j:=0 TO 9 DO
|
||||
FOR i:=0 TO 9 DO
|
||||
pcman[i,j]:=FALSE;
|
||||
punkt[i,j]:=FALSE;
|
||||
linie[i,j]:=FALSE;
|
||||
kreuzung[i,j]:=FALSE;
|
||||
ecke[i,j]:=FALSE;
|
||||
END;
|
||||
END;
|
||||
pcman[4,0]:=TRUE; pcman[5,0]:=TRUE;
|
||||
FOR i:=3 TO 7 DO pcman[i,1]:=TRUE END;
|
||||
FOR i:=2 TO 9 DO pcman[i,2]:=TRUE END;
|
||||
FOR i:=1 TO 7 DO pcman[i,3]:=TRUE END;
|
||||
FOR i:=0 TO 6 DO pcman[i,4]:=TRUE END;
|
||||
FOR i:=0 TO 6 DO pcman[i,5]:=TRUE END;
|
||||
FOR i:=1 TO 7 DO pcman[i,6]:=TRUE END;
|
||||
FOR i:=2 TO 9 DO pcman[i,7]:=TRUE END;
|
||||
FOR i:=3 TO 7 DO pcman[i,8]:=TRUE END;
|
||||
pcman[4,9]:=TRUE; pcman[5,9]:=TRUE;
|
||||
FOR j:=0 TO 9 DO
|
||||
FOR i:=0 TO 9 DO
|
||||
geistli[i,j]:=TRUE;
|
||||
END;
|
||||
END;
|
||||
FOR i:=0 TO 3 DO
|
||||
geistli[i,9]:=FALSE;
|
||||
geistli[9-i,9]:=FALSE;
|
||||
END;
|
||||
geistli[0,8]:=FALSE; geistli[1,8]:=FALSE; geistli[8,8]:=FALSE; geistli[9,8]:=FALSE;
|
||||
geistli[0,7]:=FALSE; geistli[9,7]:=FALSE;
|
||||
geistli[3,6]:=FALSE; geistli[6,6]:=FALSE;
|
||||
geistli[2,1]:=FALSE; geistli[6,1]:=FALSE;
|
||||
FOR i:=1 TO 3 DO
|
||||
geistli[i,0]:=FALSE;
|
||||
geistli[9-i,0]:=FALSE;
|
||||
END;
|
||||
Feld[1,1]:=1;
|
||||
punkt[4,4]:=TRUE; punkt[5,4]:=TRUE; punkt[4,5]:=TRUE; punkt[5,5]:=TRUE;
|
||||
FOR i:=0 TO 9 DO
|
||||
linie[i,4]:=TRUE;
|
||||
linie[i,5]:=TRUE;
|
||||
kreuzung[i,4]:=TRUE;
|
||||
kreuzung[i,5]:=TRUE;
|
||||
kreuzung[4,i]:=TRUE;
|
||||
kreuzung[5,i]:=TRUE;
|
||||
END;
|
||||
FOR i:=0 TO 5 DO
|
||||
ecke[4,i]:=TRUE;
|
||||
ecke[5,i]:=TRUE;
|
||||
ecke[9-i,4]:=TRUE;
|
||||
ecke[9-i,5]:=TRUE;
|
||||
END;
|
||||
pcm.Blick:=rechts;
|
||||
END Initialisieren;
|
||||
|
||||
PROCEDURE Bitmuster(a,b:INTEGER):BOOLEAN;
|
||||
(* prueft ob das b. Bit in a gesetzt ist und gibt in dem Fall true zurueck *)
|
||||
VAR c:INTEGER;
|
||||
BEGIN
|
||||
IF b<0 THEN
|
||||
Out.String("Fehler im Programm: Procedure Bitmuster");
|
||||
HALT(35);
|
||||
END;
|
||||
IF a<ASH(1,b) THEN RETURN FALSE END;
|
||||
c:=a;
|
||||
REPEAT
|
||||
IF c<ASH(1,b) THEN RETURN FALSE END;
|
||||
IF (c>=ASH(1,b)) & (c<ASH(1,b+1)) THEN RETURN TRUE END;
|
||||
c:=c-SHORT(ASH(1,b+1));
|
||||
UNTIL c<0;
|
||||
RETURN FALSE;
|
||||
END Bitmuster;
|
||||
|
||||
PROCEDURE Zeichnen;
|
||||
VAR i,j,x,y:INTEGER;
|
||||
BEGIN
|
||||
FOR j:=0 TO 24 DO
|
||||
y:=400-j*10;
|
||||
FOR i:=0 TO 38 DO
|
||||
x:=10+i*10;
|
||||
IF Bitmuster(Feld[i,j],7) THEN
|
||||
IF Bitmuster(Feld[i,j],6) THEN Grafik.SpriteSetzen(kreuzung,x,y)
|
||||
ELSE Grafik.SpriteSetzen(linie,x,y)
|
||||
END;
|
||||
ELSIF Bitmuster(Feld[i,j],6) THEN
|
||||
Grafik.SpriteDrehen(1,linie);
|
||||
Grafik.SpriteSetzen(linie,x,y);
|
||||
Grafik.SpriteDrehen(1,linie);
|
||||
ELSIF Bitmuster(Feld[i,j],5) THEN
|
||||
IF i=0 THEN
|
||||
IF j=0 THEN Grafik.SpriteSetzen(ecke,x,y)
|
||||
ELSIF ~Bitmuster(Feld[i,j-1],6) THEN Grafik.SpriteSetzen(ecke,x,y)
|
||||
ELSE
|
||||
Grafik.SpriteDrehen(3,ecke);
|
||||
Grafik.SpriteSetzen(ecke,x,y);
|
||||
Grafik.SpriteDrehen(1,ecke);
|
||||
END;
|
||||
ELSE
|
||||
IF j=0 THEN
|
||||
IF ~Bitmuster(Feld[i-1,j],7) THEN Grafik.SpriteSetzen(ecke,x,y)
|
||||
ELSE
|
||||
Grafik.SpriteDrehen(1,ecke);
|
||||
Grafik.SpriteSetzen(ecke,x,y);
|
||||
Grafik.SpriteDrehen(3,ecke);
|
||||
END;
|
||||
ELSIF Bitmuster(Feld[i,j+1],6) THEN
|
||||
IF Bitmuster(Feld[i-1,j],7) THEN
|
||||
Grafik.SpriteDrehen(1,ecke);
|
||||
Grafik.SpriteSetzen(ecke,x,y);
|
||||
Grafik.SpriteDrehen(3,ecke);
|
||||
ELSE Grafik.SpriteSetzen(ecke,x,y)
|
||||
END;
|
||||
ELSE
|
||||
Grafik.SpriteDrehen(2,ecke);
|
||||
Grafik.SpriteSetzen(ecke,x,y);
|
||||
Grafik.SpriteDrehen(2,ecke);
|
||||
END;
|
||||
END;
|
||||
ELSIF Bitmuster(Feld[i,j],3) THEN Grafik.SpriteSetzen(punkt,x,y);
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
END Zeichnen;
|
||||
|
||||
PROCEDURE Level1;
|
||||
VAR i,j:INTEGER;
|
||||
BEGIN
|
||||
RandomNumbers.InitSeed(93247856);
|
||||
Initialisieren;
|
||||
Feld[0,0]:=32;
|
||||
FOR i:=1 TO 37 DO
|
||||
Feld[i,0]:=128;
|
||||
Feld[i,2]:=128;
|
||||
Feld[i,4]:=128;
|
||||
Feld[i,6]:=128;
|
||||
Feld[i,16]:=128;
|
||||
Feld[i,20]:=128;
|
||||
Feld[i,22]:=128;
|
||||
Feld[i,24]:=128;
|
||||
END;
|
||||
Feld[18,0]:=32; Feld[19,0]:=0; Feld[20,0]:=32; Feld[38,0]:=32;
|
||||
FOR i:=1 TO 5 DO
|
||||
Feld[0,i]:=64;
|
||||
Feld[38,i]:=64;
|
||||
END;
|
||||
Feld[18,1]:=64; Feld[20,1]:=64;
|
||||
Feld[1,2]:=0; Feld[9,2]:=0; Feld[17,2]:=0; Feld[18,2]:=192; Feld[20,2]:=192;
|
||||
Feld[21,2]:=0; Feld[29,2]:=0; Feld[37,2]:=0;
|
||||
Feld[1,4]:=0; Feld[9,4]:=0; Feld[10,4]:=32; Feld[12,4]:=32; Feld[13,4]:=0;
|
||||
Feld[19,4]:=192; Feld[25,4]:=0; Feld[26,4]:=192; Feld[28,4]:=192; Feld[29,4]:=0;
|
||||
Feld[37,4]:=0;
|
||||
FOR i:=5 TO 9 DO
|
||||
Feld[10,i]:=64;
|
||||
Feld[28,i]:=64;
|
||||
END;
|
||||
Feld[12,5]:=64; Feld[19,5]:=64; Feld[26,5]:=64;
|
||||
Feld[0,6]:=32; Feld[8,6]:=32; Feld[9,6]:=0; Feld[10,6]:=64; Feld[11,6]:=0;
|
||||
Feld[12,6]:=192; Feld[17,6]:=192; Feld[18,6]:=0; Feld[19,6]:=64;Feld[20,6]:=0;
|
||||
Feld[21,6]:=192; Feld[26,6]:=192; Feld[27,6]:=0; Feld[28,6]:=64; Feld[29,6]:=0;
|
||||
Feld[30,6]:=192; Feld[38,6]:=192;
|
||||
FOR i:=7 TO 9 DO
|
||||
Feld[8,i]:=64;
|
||||
Feld[12,i]:=64;
|
||||
Feld[26,i]:=64;
|
||||
Feld[30,i]:=64;
|
||||
END;
|
||||
Feld[12,7]:=192; Feld[13,7]:=128; Feld[14,7]:=128; Feld[15,7]:=128; Feld[16,7]:=128;
|
||||
Feld[17,7]:=192; Feld[19,7]:=64; Feld[21,7]:=192; Feld[22,7]:=128; Feld[23,7]:=128;
|
||||
Feld[24,7]:=128; Feld[25,7]:=128; Feld[26,7]:=192;
|
||||
Feld[14,9]:=192;
|
||||
FOR i:=15 TO 23 DO Feld[i,9]:=128 END;
|
||||
Feld[19,9]:=0; Feld[24,9]:=192;
|
||||
FOR i:=0 TO 7 DO
|
||||
Feld[i,10]:=128;
|
||||
Feld[i+31,10]:=128;
|
||||
END;
|
||||
Feld[8,10]:=192; Feld[10,10]:=192; Feld[11,10]:=128; Feld[12,10]:=192;
|
||||
Feld[14,10]:=64; Feld[24,10]:=64; Feld[26,10]:=192; Feld[27,10]:=128;
|
||||
Feld[28,10]:=192; Feld[30,10]:=192;
|
||||
Feld[14,11]:=64; Feld[24,11]:=64;
|
||||
FOR i:=0 TO 38 DO
|
||||
Feld[i,12]:=Feld[i,10];
|
||||
Feld[i,13]:=Feld[i,9];
|
||||
Feld[i,14]:=Feld[i,8];
|
||||
Feld[i,15]:=Feld[i,9];
|
||||
Feld[i,18]:=Feld[i,2];
|
||||
END;
|
||||
Feld[19,13]:=128;
|
||||
Feld[19,15]:=128;
|
||||
Feld[0,16]:=192; Feld[8,16]:=192; Feld[9,16]:=0; Feld[10,16]:=192; Feld[12,16]:=192;
|
||||
Feld[13,16]:=0; Feld[14,16]:=192; Feld[18,16]:=192; Feld[19,16]:=0; Feld[20,16]:=192;
|
||||
Feld[24,16]:=192; Feld[25,16]:=0; Feld[26,16]:=192; Feld[28,16]:=192;
|
||||
Feld[29,16]:=0; Feld[30,16]:=192; Feld[38,16]:=192;
|
||||
Feld[0,17]:=64; Feld[18,17]:=64; Feld[20,17]:=64; Feld[38,17]:=64;
|
||||
Feld[5,18]:=192; Feld[8,18]:=192; Feld[30,18]:=192; Feld[33,18]:=192;
|
||||
Feld[0,19]:=64; Feld[5,19]:=64; Feld[8,19]:=64; Feld[30,19]:=64; Feld[33,19]:=64;
|
||||
Feld[38,19]:=64;
|
||||
Feld[0,20]:=192; Feld[4,20]:=0; Feld[5,20]:=192; Feld[8,20]:=192; Feld[9,20]:=0;
|
||||
Feld[10,20]:=192; Feld[13,20]:=192; Feld[14,20]:=0; Feld[18,20]:=192;
|
||||
Feld[20,20]:=192; Feld[24,20]:=0; Feld[25,20]:=192; Feld[28,20]:=192;
|
||||
Feld[29,20]:=0; Feld[30,20]:=192; Feld[33,20]:=192; Feld[34,20]:=0; Feld[38,20]:=192;
|
||||
Feld[0,21]:=64; Feld[10,21]:=64; Feld[13,21]:=64; Feld[18,21]:=64; Feld[20,21]:=64;
|
||||
Feld[25,21]:=64; Feld[28,21]:=64; Feld[38,21]:=64;
|
||||
Feld[0,22]:=64; Feld[1,22]:=0; Feld[10,22]:=192; Feld[13,22]:=192; Feld[17,22]:=0;
|
||||
Feld[18,22]:=192; Feld[20,22]:=192; Feld[21,22]:=0; Feld[25,22]:=192;
|
||||
Feld[28,22]:=192; Feld[37,22]:=0; Feld[38,22]:=64;
|
||||
Feld[0,23]:=64; Feld[38,23]:=64;
|
||||
Feld[0,24]:=192; Feld[38,24]:=192;
|
||||
FOR j:=0 TO 24 DO
|
||||
FOR i:=0 TO 38 DO
|
||||
IF Feld[i,j]=0 THEN
|
||||
Feld[i,j]:=8;
|
||||
END
|
||||
END
|
||||
END;
|
||||
Feld[19,0]:=0; Feld[19,1]:=0;
|
||||
FOR j:=7 TO 9 DO
|
||||
FOR i:=0 TO 7 DO
|
||||
Feld[i,j]:=0;
|
||||
Feld[38-i,j]:=0;
|
||||
Feld[i,j+6]:=0;
|
||||
Feld[38-i,j+6]:=0;
|
||||
END;
|
||||
END;
|
||||
FOR i:=5 TO 9 DO
|
||||
Feld[11,i]:=0;
|
||||
Feld[27,i]:=0;
|
||||
END;
|
||||
Feld[11,13]:=0; Feld[11,14]:=0; Feld[11,15]:=0; Feld[27,13]:=0; Feld[27,14]:=0; Feld[27,15]:=0;
|
||||
Feld[6,19]:=0; Feld[7,19]:=0; Feld[19,21]:=0; Feld[11,21]:=0; Feld[12,21]:=0; Feld[26,21]:=0;
|
||||
Feld[27,21]:=0; Feld[31,19]:=0; Feld[32,19]:=0; Feld[19,16]:=0; Feld[19,17]:=0;
|
||||
FOR j:=10 TO 12 DO
|
||||
FOR i:=15 TO 23 DO
|
||||
Feld[i,j]:=0;
|
||||
END;
|
||||
END;
|
||||
Zeichnen;
|
||||
pcm.PosX:=19; pcm.PosY:=19;
|
||||
Feld[pcm.PosX,pcm.PosY]:=1;
|
||||
Grafik.SpriteSetzen(pcman,10+pcm.PosX*10,400-pcm.PosY*10);
|
||||
geist[0].PosX:=15; geist[0].PosY:=8; geist[0].Richtung:=rechts; geist[0].Blick:=rechts;
|
||||
geist[1].PosX:=1; geist[1].PosY:=1; geist[1].Richtung:=rechts; geist[1].Blick:=rechts;
|
||||
geist[2].PosX:=37; geist[2].PosY:=1; geist[2].Richtung:=links; geist[2].Blick:=links;
|
||||
geist[3].PosX:=19; geist[3].PosY:=12; geist[3].Richtung:=hoch; geist[3].Blick:=hoch;
|
||||
FOR i:=0 TO 3 DO
|
||||
Feld[geist[i].PosX,geist[i].PosY]:=10;
|
||||
Grafik.SpriteSetzen(geistli,10+geist[i].PosX*10,400-geist[i].PosY*10);
|
||||
END;
|
||||
Feld[geist[3].PosX,geist[3].PosY]:=2;
|
||||
AnzPunkte:=344;
|
||||
END Level1;
|
||||
|
||||
PROCEDURE RichtungAnpassen(VAR s:Grafik.sprite; VAR f:figur);
|
||||
BEGIN
|
||||
IF (f.Richtung#f.Blick) & (f.Richtung#stop) THEN
|
||||
IF f.Blick=rechts THEN
|
||||
IF f.Richtung=runter THEN Grafik.SpriteDrehen(1,s)
|
||||
ELSIF f.Richtung=links THEN Grafik.SpriteDrehen(2,s)
|
||||
ELSIF f.Richtung=hoch THEN Grafik.SpriteDrehen(3,s)
|
||||
END
|
||||
ELSIF f.Blick=runter THEN
|
||||
IF f.Richtung=rechts THEN Grafik.SpriteDrehen(3,s)
|
||||
ELSIF f.Richtung=links THEN Grafik.SpriteDrehen(1,s)
|
||||
ELSIF f.Richtung=hoch THEN Grafik.SpriteDrehen(2,s)
|
||||
END
|
||||
ELSIF f.Blick=links THEN
|
||||
IF f.Richtung=rechts THEN Grafik.SpriteDrehen(2,s)
|
||||
ELSIF f.Richtung=runter THEN Grafik.SpriteDrehen(3,s)
|
||||
ELSIF f.Richtung=hoch THEN Grafik.SpriteDrehen(1,s)
|
||||
END
|
||||
ELSIF f.Blick=hoch THEN
|
||||
IF f.Richtung=rechts THEN Grafik.SpriteDrehen(1,s)
|
||||
ELSIF f.Richtung=runter THEN Grafik.SpriteDrehen(2,s)
|
||||
ELSIF f.Richtung=links THEN Grafik.SpriteDrehen(3,s)
|
||||
END
|
||||
END;
|
||||
f.Blick:=f.Richtung;
|
||||
END;
|
||||
END RichtungAnpassen;
|
||||
|
||||
PROCEDURE RandHuepfen(s:Grafik.sprite; VAR f:figur; kennung:INTEGER):BOOLEAN;
|
||||
VAR x,y:INTEGER;
|
||||
resultat:BOOLEAN;
|
||||
BEGIN
|
||||
resultat:=FALSE;
|
||||
x:=10+f.PosX*10;
|
||||
y:=400-f.PosY*10;
|
||||
IF f.Richtung=links THEN
|
||||
IF f.PosX=0 THEN
|
||||
IF (Feld[38,f.PosY]=0) OR (Feld[38,f.PosY]=8) THEN
|
||||
Grafik.SpriteLoeschen(x,y);
|
||||
f.PosX:=38;
|
||||
x:=10+f.PosX*10;
|
||||
y:=400-f.PosY*10;
|
||||
Grafik.SpriteSetzen(s,x,y);
|
||||
Feld[f.PosX,f.PosY]:=kennung;
|
||||
resultat:=TRUE;
|
||||
ELSE
|
||||
f.Richtung:=stop;
|
||||
END
|
||||
END
|
||||
ELSIF f.Richtung=rechts THEN
|
||||
IF f.PosX=38 THEN
|
||||
IF (Feld[0,f.PosY]=0) OR (Feld[0,f.PosY]=8) THEN
|
||||
Grafik.SpriteLoeschen(x,y);
|
||||
f.PosX:=0;
|
||||
x:=10+f.PosX*10;
|
||||
y:=400-f.PosY*10;
|
||||
Grafik.SpriteSetzen(s,x,y);
|
||||
Feld[f.PosX,f.PosY]:=kennung;
|
||||
resultat:=TRUE;
|
||||
ELSE f.Richtung:=stop
|
||||
END
|
||||
END
|
||||
ELSIF f.Richtung=hoch THEN
|
||||
IF f.PosY=0 THEN
|
||||
IF (Feld[f.PosX,24]=0) OR (Feld[f.PosX,24]=8) THEN
|
||||
Grafik.SpriteLoeschen(x,y);
|
||||
f.PosY:=24;
|
||||
x:=10+f.PosX*10;
|
||||
y:=400-f.PosY*10;
|
||||
Grafik.SpriteSetzen(s,x,y);
|
||||
Feld[f.PosX,f.PosY]:=kennung;
|
||||
resultat:=TRUE;
|
||||
ELSE f.Richtung:=stop
|
||||
END
|
||||
END
|
||||
ELSIF f.Richtung=runter THEN
|
||||
IF f.PosY=24 THEN
|
||||
IF (Feld[f.PosX,0]=0) OR (Feld[f.PosX,0]=8) THEN
|
||||
Grafik.SpriteLoeschen(x,y);
|
||||
f.PosY:=0;
|
||||
x:=10+f.PosX*10;
|
||||
y:=400-f.PosY*10;
|
||||
Grafik.SpriteSetzen(s,x,y);
|
||||
Feld[f.PosX,f.PosY]:=kennung;
|
||||
resultat:=TRUE;
|
||||
ELSE f.Richtung:=stop
|
||||
END
|
||||
END
|
||||
END;
|
||||
RETURN resultat;
|
||||
END RandHuepfen;
|
||||
|
||||
PROCEDURE NeuePosition(VAR f:figur);
|
||||
BEGIN
|
||||
IF f.Richtung=links THEN
|
||||
IF ~((Bitmuster(Feld[f.PosX-1,f.PosY],7) OR Bitmuster(Feld[f.PosX-1,f.PosY],6)) OR
|
||||
Bitmuster(Feld[f.PosX-1,f.PosY],5)) THEN DEC(f.PosX)
|
||||
ELSE f.Richtung:=stop
|
||||
END
|
||||
ELSIF f.Richtung=rechts THEN
|
||||
IF ~((Bitmuster(Feld[f.PosX+1,f.PosY],7) OR Bitmuster(Feld[f.PosX+1,f.PosY],6)) OR
|
||||
(Bitmuster(Feld[f.PosX+1,f.PosY],5))) THEN INC(f.PosX)
|
||||
ELSE f.Richtung:=stop
|
||||
END
|
||||
ELSIF f.Richtung=hoch THEN
|
||||
IF ~((Bitmuster(Feld[f.PosX,f.PosY-1],7) OR Bitmuster(Feld[f.PosX,f.PosY-1],6)) OR
|
||||
Bitmuster(Feld[f.PosX,f.PosY-1],5)) THEN DEC(f.PosY)
|
||||
ELSE f.Richtung:=stop
|
||||
END
|
||||
ELSIF f.Richtung=runter THEN
|
||||
IF ~((Bitmuster(Feld[f.PosX,f.PosY+1],7) OR Bitmuster(Feld[f.PosX,f.PosY+1],6)) OR
|
||||
Bitmuster(Feld[f.PosX,f.PosY+1],5)) THEN INC(f.PosY)
|
||||
ELSE f.Richtung:=stop
|
||||
END
|
||||
END;
|
||||
END NeuePosition;
|
||||
|
||||
PROCEDURE GeistliRichtung(VAR f:figur; VAR erwischt:BOOLEAN);
|
||||
VAR zufall:INTEGER;
|
||||
fertig:BOOLEAN;
|
||||
BEGIN
|
||||
fertig:=FALSE;
|
||||
DEC(Feld[f.PosX,f.PosY],2);
|
||||
zufall:=SHORT(ENTIER(10*RandomNumbers.Uniform()));
|
||||
IF (zufall<9) & (f.Richtung#stop) THEN
|
||||
IF RandHuepfen(geistli,f,2) THEN
|
||||
f.Richtung:=stop;
|
||||
RETURN;
|
||||
END;
|
||||
NeuePosition(f);
|
||||
erwischt:=Bitmuster(Feld[f.PosX,f.PosY],0);
|
||||
IF f.Richtung#stop THEN
|
||||
INC(Feld[f.PosX,f.PosY],2);
|
||||
fertig:=TRUE;
|
||||
END;
|
||||
END;
|
||||
IF ~fertig THEN
|
||||
REPEAT
|
||||
REPEAT
|
||||
zufall:=SHORT(ENTIER(10*RandomNumbers.Uniform()))
|
||||
UNTIL zufall<=4;
|
||||
f.Richtung:=zufall;
|
||||
IF RandHuepfen(geistli,f,2) THEN
|
||||
f.Richtung:=stop;
|
||||
RETURN;
|
||||
END;
|
||||
NeuePosition(f);
|
||||
erwischt:=Bitmuster(Feld[f.PosX,f.PosY],0);
|
||||
UNTIL f.Richtung#stop;
|
||||
INC(Feld[f.PosX,f.PosY],2);
|
||||
END;
|
||||
END GeistliRichtung;
|
||||
|
||||
PROCEDURE Bewegen(VAR erwischt:BOOLEAN);
|
||||
VAR ax,ay,bx,by,richtung:ARRAY 5 OF INTEGER;
|
||||
i,j:INTEGER;
|
||||
alt:ARRAY 5 OF figur;
|
||||
BEGIN
|
||||
alt[0]:=pcm;
|
||||
ax[0]:=10+pcm.PosX*10;
|
||||
ay[0]:=400-pcm.PosY*10;
|
||||
richtung[0]:=pcm.Richtung;
|
||||
DEC(Feld[pcm.PosX,pcm.PosY]);
|
||||
RichtungAnpassen(pcman,pcm);
|
||||
IF RandHuepfen(pcman,pcm,1) THEN RETURN END;
|
||||
NeuePosition(pcm);
|
||||
erwischt:=Bitmuster(Feld[pcm.PosX,pcm.PosY],1);
|
||||
IF erwischt THEN RETURN END;
|
||||
INC(Feld[pcm.PosX,pcm.PosY]);
|
||||
IF Bitmuster(Feld[pcm.PosX,pcm.PosY],3) THEN
|
||||
DEC(Feld[pcm.PosX,pcm.PosY],8);
|
||||
INC(score,10);
|
||||
DEC(AnzPunkte);
|
||||
END;
|
||||
FOR i:=1 TO 4 DO
|
||||
richtung[i]:=stop;
|
||||
ax[i]:=0;
|
||||
ay[i]:=0;
|
||||
ax[i]:=10+geist[i-1].PosX*10;
|
||||
ay[i]:=400-geist[i-1].PosY*10;
|
||||
alt[i]:=geist[i-1];
|
||||
GeistliRichtung(geist[i-1],erwischt);
|
||||
IF erwischt THEN RETURN END;
|
||||
richtung[i]:=geist[i-1].Richtung;
|
||||
END;
|
||||
FOR j:=0 TO 9 DO
|
||||
FOR i:=0 TO 4 DO
|
||||
bx[i]:=ax[i];
|
||||
by[i]:=ay[i];
|
||||
IF richtung[i]=links THEN DEC(bx[i])
|
||||
ELSIF richtung[i]=rechts THEN INC(bx[i])
|
||||
ELSIF richtung[i]=hoch THEN INC(by[i])
|
||||
ELSIF richtung[i]=runter THEN DEC(by[i])
|
||||
END;
|
||||
IF (i=0) & (richtung[0]#stop) THEN
|
||||
IF ~((alt[0].PosX=pcm.PosX) & (alt[0].PosY=pcm.PosY)) THEN
|
||||
Grafik.SpriteBewegen(pcman,ax[0],ay[0],bx[0],by[0],Bremse)
|
||||
END;
|
||||
ELSE
|
||||
IF richtung[i]#stop THEN
|
||||
Grafik.SpriteBewegen(geistli,ax[i],ay[i],bx[i],by[i],Bremse);
|
||||
IF Bitmuster(Feld[alt[i].PosX,alt[i].PosY],3) THEN
|
||||
Grafik.SpriteEinfuegen(punkt,10+alt[i].PosX*10,400-alt[i].PosY*10);
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
ax[i]:=bx[i];
|
||||
ay[i]:=by[i];
|
||||
END;
|
||||
END;
|
||||
END Bewegen;
|
||||
|
||||
PROCEDURE SpielStart;
|
||||
VAR c:CHAR;
|
||||
abbruch:BOOLEAN;
|
||||
BEGIN
|
||||
REPEAT
|
||||
c:=XYplane.Key();
|
||||
UNTIL c#CHR(0);
|
||||
IF c="4" THEN pcm.Richtung:=links;
|
||||
ELSIF c="6" THEN pcm.Richtung:=rechts;
|
||||
ELSIF c="8" THEN pcm.Richtung:=hoch;
|
||||
ELSIF c="2" THEN pcm.Richtung:=runter;
|
||||
ELSIF c=" " THEN pcm.Richtung:=stop;
|
||||
END;
|
||||
Grafik.Schreiben('PUNKTE:',7,250,420);
|
||||
Grafik.ZahlSchreiben(score,390,420);
|
||||
abbruch:=FALSE;
|
||||
REPEAT
|
||||
Bewegen(abbruch);
|
||||
IF abbruch THEN Grafik.Schreiben('ERWISCHT!',9,160,290) END;
|
||||
Grafik.ZahlSchreiben(score,390,420);
|
||||
IF AnzPunkte=99 THEN Grafik.SpriteSetzen(Grafik.buchstaben[0],10,420) END;
|
||||
IF AnzPunkte=9 THEN Grafik.SpriteSetzen(Grafik.buchstaben[0],20,420) END;
|
||||
Grafik.ZahlSchreiben(AnzPunkte,30,420);
|
||||
IF AnzPunkte<1 THEN
|
||||
abbruch:=TRUE;
|
||||
Grafik.Schreiben('!YOU WIN!',9,160,290);
|
||||
END;
|
||||
c:=XYplane.Key();
|
||||
IF c="4" THEN pcm.Richtung:=links;
|
||||
ELSIF c="6" THEN pcm.Richtung:=rechts;
|
||||
ELSIF c="8" THEN pcm.Richtung:=hoch;
|
||||
ELSIF c="2" THEN pcm.Richtung:=runter;
|
||||
ELSIF c=" " THEN pcm.Richtung:=stop;
|
||||
ELSIF c="q" THEN
|
||||
abbruch:=TRUE;
|
||||
Grafik.Schreiben('GAME OVER',9,160,290);
|
||||
END;
|
||||
UNTIL abbruch;
|
||||
END SpielStart;
|
||||
|
||||
PROCEDURE Spielen*;
|
||||
BEGIN
|
||||
XYplane.Open;
|
||||
Level1;
|
||||
SpielStart;
|
||||
END Spielen;
|
||||
|
||||
BEGIN
|
||||
Spielen
|
||||
END PacMan.
|
||||
24
src/test/x11/pacman/Readme.md
Normal file
24
src/test/x11/pacman/Readme.md
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
This is a game historycal source taken from http://web.archive.org/web/20050212180221/http://www.vis.inf.ethz.ch/~andy/Oberon.html
|
||||
|
||||
It serves as an example of XYplane module usage.
|
||||
|
||||
build by typing:
|
||||
|
||||
make
|
||||
|
||||
run by
|
||||
./PacMan
|
||||
|
||||
During the game, the following keys are availiable:
|
||||
|
||||
Player One:
|
||||
q ... move left
|
||||
w ... move right
|
||||
a ... mark field
|
||||
Player Two:
|
||||
o ... move left
|
||||
p ... move right
|
||||
l ... mark field
|
||||
General keys:
|
||||
h ... abort
|
||||
|
||||
17
src/test/x11/pacman/makefile
Normal file
17
src/test/x11/pacman/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 Grafik.Mod PacMan.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
|
||||
234
src/test/x11/tetris/Linie.Mod
Normal file
234
src/test/x11/tetris/Linie.Mod
Normal file
|
|
@ -0,0 +1,234 @@
|
|||
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 Linie2(x1,y1,x2,y2: INTEGER);
|
||||
|
||||
VAR dx,dy,sx,sy,d,x,y: INTEGER;
|
||||
|
||||
BEGIN
|
||||
dx:=ABS(x2-x1); IF (x2-x1)#0 THEN sx:=(x2-x1)DIV ABS(x2-x1); ELSE sx:=0; END;
|
||||
dy:=ABS(y2-y1); IF (y2-y1)#0 THEN sy:=(y2-y1) DIV ABS(y2-y1); ELSE sy:=0; END;
|
||||
d:=2*dy-dx; x:=x1; y:=y1;
|
||||
XYplane.Dot(x,y,1);
|
||||
WHILE x#x2 DO
|
||||
IF (d>0) OR ((d=0)&(sy=1)) THEN
|
||||
y:=y+sy; d:=d-2*dx;
|
||||
END;
|
||||
x:=x+sx; d:=d+2*dy;
|
||||
XYplane.Dot(x,y,1);
|
||||
END;
|
||||
END Linie2;
|
||||
|
||||
|
||||
PROCEDURE Fraktal(x1,y1,x2,y2: INTEGER);
|
||||
|
||||
BEGIN;
|
||||
IF ~abbruch THEN
|
||||
INC(Zaehler);
|
||||
IF Zaehler>Ende THEN abbruch:=TRUE; END;
|
||||
Linie2(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;
|
||||
Linie2(x1,y1,x2,y2);
|
||||
Linie2(x2,y2,x3,y3);
|
||||
Linie2(x3,y3,x4,y4);
|
||||
Linie2(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.
|
||||
|
||||
|
||||
|
||||
23
src/test/x11/tetris/Readme.md
Normal file
23
src/test/x11/tetris/Readme.md
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
This is a game historycal source taken from http://web.archive.org/web/20050212180221/http://www.vis.inf.ethz.ch/~andy/Oberon.html
|
||||
|
||||
It serves as an example of XYplane module usage.
|
||||
|
||||
build by typing:
|
||||
|
||||
make
|
||||
|
||||
run by
|
||||
./Tetris
|
||||
|
||||
|
||||
* Start Tetris with Tetris.Start a~
|
||||
a 1 or 2 for One or Two-Player-Modus
|
||||
|
||||
During the game the following keys are availiable:
|
||||
|
||||
General keys:
|
||||
p...Pause
|
||||
q...Quit
|
||||
|
||||
The other keys can be changed by the player.
|
||||
|
||||
953
src/test/x11/tetris/Tetris.Mod
Normal file
953
src/test/x11/tetris/Tetris.Mod
Normal file
|
|
@ -0,0 +1,953 @@
|
|||
MODULE Tetris;
|
||||
|
||||
(* Peter Brantschen, 15.April 96 , Version 1.1*)
|
||||
(* neuste Version vom 12. Dezember 1996, Version 1.2 *)
|
||||
(* Neuerungen: Spielparameter sind ueber Konstantendeklariert, Zweispielermodus
|
||||
bricht bei Limit-Linien ab, Pause-Funktion wurde eingefuehrt *)
|
||||
|
||||
IMPORT X:=oocXYplane, L:=Linie, In := compatIn, Out := Console, RN:=ethRandomNumbers, Ziffer, Oberon := Kernel;
|
||||
|
||||
CONST
|
||||
|
||||
(* Spielwerte : *)
|
||||
|
||||
Schrittweite=10;
|
||||
Limit=20;
|
||||
ende="q";
|
||||
pause="p";
|
||||
endepause=" ";
|
||||
|
||||
(* Werte fuer Verzoegerung:
|
||||
|
||||
Pentium 100: 1 Spieler Modus 25000
|
||||
Pentium 100: 2 Spieler Modus 20000
|
||||
*)
|
||||
|
||||
Verzoegerung=2000;
|
||||
|
||||
(* Steuerung Spieler 1: *)
|
||||
|
||||
links1="y";
|
||||
rechts1="x";
|
||||
runter1="-";
|
||||
drehunglinks1=".";
|
||||
drehungrechts1=",";
|
||||
|
||||
|
||||
(* Steuerung Spieler 2: *)
|
||||
|
||||
links2="4";
|
||||
rechts2="6";
|
||||
runter2="5";
|
||||
drehunglinks2="9";
|
||||
drehungrechts2="7";
|
||||
|
||||
|
||||
VAR Feld: ARRAY 32,22 OF BOOLEAN;
|
||||
geaendert1,geaendert2: ARRAY 21 OF BOOLEAN;
|
||||
AnzahlGeaenderteLinien1, AnzahlGeaenderteLinien2: INTEGER;
|
||||
Spielende, fertig1,fertig2, wechsel, Spieler2: BOOLEAN;
|
||||
Punkte1,Punkte2,x1,y1,a1,lage1,x2,y2,a2,lage2,tempo1,tempo2: INTEGER;
|
||||
altkey: CHAR;
|
||||
Linien1, Linien2: INTEGER;
|
||||
level1, level2: INTEGER;
|
||||
Straflinien1, Straflinien2: INTEGER;
|
||||
|
||||
PROCEDURE Spielfeldzeichnen;
|
||||
|
||||
CONST Bildschirmbreite=800; Bildschirmhoehe=600;
|
||||
|
||||
VAR x,y,i: INTEGER;
|
||||
|
||||
BEGIN;
|
||||
X.Open;
|
||||
L.Linie(50,50,150,50); L.Linie(50,30,50,250); L.Linie(150,30,150,250);
|
||||
L.Linie(50,30,150,30); L.Linie(50,40,150,40);
|
||||
L.Linie(180,180,180,220); L.Linie(180,220,220,220);L.Linie(220,220,220,180); L.Linie(220,180,180,180);
|
||||
IF Spieler2 THEN L.Linie(250,50,350,50); L.Linie(250,30,250,250); L.Linie(350,30,350,250);
|
||||
L.Linie(250,30,350,30); L.Linie(250,40,350,40); END;
|
||||
FOR x:=1 TO 31 DO;
|
||||
FOR y:=1 TO 21 DO;
|
||||
Feld[x,y]:=FALSE;
|
||||
END;
|
||||
END;
|
||||
FOR i:=0 TO 21 DO;
|
||||
Feld[0,i]:=TRUE;
|
||||
Feld[11,i]:=TRUE;
|
||||
Feld[20,i]:=TRUE;
|
||||
Feld[31,i]:=TRUE;
|
||||
END;
|
||||
FOR i:=1 TO 31 DO;
|
||||
Feld[i,0]:=TRUE;
|
||||
END;
|
||||
FOR i:=0 TO 20 DO;
|
||||
geaendert1[i]:=FALSE;
|
||||
geaendert2[i]:=FALSE;
|
||||
END;
|
||||
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 Spielfeldzeichnen;
|
||||
|
||||
PROCEDURE FuelleFeld(i,j: INTEGER);
|
||||
|
||||
VAR x,y: INTEGER;
|
||||
|
||||
BEGIN
|
||||
FOR x:=1 TO 9 DO;
|
||||
L.Linie(40+10*i+x,41+10*j,40+10*i+x,49+10*j);
|
||||
END;
|
||||
END FuelleFeld;
|
||||
|
||||
PROCEDURE LoescheFeld(i,j: INTEGER);
|
||||
|
||||
VAR x,y: INTEGER;
|
||||
|
||||
BEGIN
|
||||
FOR x:=1 TO 9 DO;
|
||||
L.LoescheLinie(40+10*i+x,41+10*j,40+10*i+x,49+10*j);
|
||||
END;
|
||||
END LoescheFeld;
|
||||
|
||||
PROCEDURE IstFeld(i,j: INTEGER):BOOLEAN;
|
||||
|
||||
BEGIN;
|
||||
RETURN X.IsDot(45+10*i,45+10*j);
|
||||
END IstFeld;
|
||||
|
||||
PROCEDURE MaleVorschau;
|
||||
|
||||
VAR i,j: INTEGER;
|
||||
|
||||
BEGIN;
|
||||
FOR i:=13 TO 18 DO;
|
||||
FOR j:=13 TO 18 DO;
|
||||
IF Feld[i,j] THEN
|
||||
IF ~IstFeld(i,j) THEN FuelleFeld(i,j); END;
|
||||
ELSE
|
||||
IF IstFeld(i,j) THEN LoescheFeld(i,j); END;
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
END MaleVorschau;
|
||||
|
||||
|
||||
PROCEDURE Malen1;
|
||||
|
||||
VAR i,j: INTEGER;
|
||||
|
||||
BEGIN;
|
||||
FOR i:=1 TO 10 DO;
|
||||
FOR j:=1 TO 20 DO;
|
||||
IF Feld[i,j] THEN
|
||||
IF ~IstFeld(i,j) THEN FuelleFeld(i,j); END;
|
||||
ELSE
|
||||
IF IstFeld(i,j) THEN LoescheFeld(i,j); END;
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
END Malen1;
|
||||
|
||||
PROCEDURE Malen2;
|
||||
|
||||
VAR i,j: INTEGER;
|
||||
|
||||
BEGIN;
|
||||
FOR i:=21 TO 30 DO;
|
||||
FOR j:=1 TO 20 DO;
|
||||
IF Feld[i,j] THEN
|
||||
IF ~IstFeld(i,j) THEN FuelleFeld(i,j); END;
|
||||
ELSE
|
||||
IF IstFeld(i,j) THEN LoescheFeld(i,j); END;
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
END Malen2;
|
||||
|
||||
PROCEDURE LoescheLinien1;
|
||||
|
||||
VAR i,j,h,k,Zaehler: INTEGER;
|
||||
|
||||
BEGIN;
|
||||
INC(Linien1,AnzahlGeaenderteLinien1);
|
||||
level1:=(Linien1 + Schrittweite) DIV Schrittweite;
|
||||
Punkte1:=Punkte1+level1*AnzahlGeaenderteLinien1*AnzahlGeaenderteLinien1*50;
|
||||
FOR i:=1 TO AnzahlGeaenderteLinien1 DO
|
||||
j:=1;
|
||||
WHILE j<19 DO
|
||||
WHILE ~geaendert1[j] DO INC(j); END;
|
||||
IF geaendert1[j] THEN
|
||||
FOR h:=j TO 19 DO
|
||||
FOR k:=1 TO 10 DO;
|
||||
Feld[k,h]:=Feld[k,h+1];
|
||||
END;
|
||||
geaendert1[h]:=geaendert1[h+1];
|
||||
END;
|
||||
Malen1;
|
||||
j:=22;
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
END LoescheLinien1;
|
||||
|
||||
PROCEDURE LoescheLinien2;
|
||||
|
||||
VAR i,j,h,k,Zaehler: INTEGER;
|
||||
|
||||
BEGIN;
|
||||
INC(Linien2,AnzahlGeaenderteLinien2);
|
||||
level2:=(Linien2 + Schrittweite) DIV Schrittweite;
|
||||
Punkte2:=Punkte2+level2*AnzahlGeaenderteLinien2*AnzahlGeaenderteLinien2*50;
|
||||
FOR i:=1 TO AnzahlGeaenderteLinien2 DO
|
||||
j:=1;
|
||||
WHILE j<19 DO
|
||||
WHILE ~geaendert2[j] DO INC(j); END;
|
||||
IF geaendert2[j] THEN
|
||||
FOR h:=j TO 19 DO
|
||||
FOR k:=21 TO 30 DO;
|
||||
Feld[k,h]:=Feld[k,h+1];
|
||||
END;
|
||||
geaendert2[h]:=geaendert2[h+1];
|
||||
END;
|
||||
Malen2;
|
||||
j:=22;
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
END LoescheLinien2;
|
||||
|
||||
PROCEDURE Kontrolle;
|
||||
|
||||
VAR i,j: INTEGER; Zustand1, Zustand2:BOOLEAN;
|
||||
|
||||
BEGIN;
|
||||
|
||||
AnzahlGeaenderteLinien1:=0;AnzahlGeaenderteLinien2:=0;
|
||||
FOR i:=1 TO 20 DO
|
||||
Zustand1:=TRUE; Zustand2:=TRUE;
|
||||
FOR j:=1 TO 10 DO
|
||||
Zustand1:=Zustand1&Feld[j,i]
|
||||
END;
|
||||
IF Zustand1 THEN INC(AnzahlGeaenderteLinien1);geaendert1[i]:=TRUE; ELSE geaendert1[i]:=FALSE;END;
|
||||
FOR j:=21 TO 30 DO
|
||||
Zustand2:=Zustand2&Feld[j,i]
|
||||
END;
|
||||
IF Zustand2 THEN INC(AnzahlGeaenderteLinien2);geaendert2[i]:=TRUE; ELSE geaendert2[i]:=FALSE;END;
|
||||
END;
|
||||
IF Spieler2 THEN
|
||||
IF AnzahlGeaenderteLinien1 > 1 THEN
|
||||
IF AnzahlGeaenderteLinien1=2 THEN Straflinien2:=1;
|
||||
ELSIF AnzahlGeaenderteLinien1=3 THEN Straflinien2:=2;
|
||||
ELSIF AnzahlGeaenderteLinien1=4 THEN Straflinien2:=4;
|
||||
END;
|
||||
END;
|
||||
IF AnzahlGeaenderteLinien2 > 1 THEN
|
||||
IF AnzahlGeaenderteLinien2=2 THEN Straflinien1:=1;
|
||||
ELSIF AnzahlGeaenderteLinien2=3 THEN Straflinien1:=2;
|
||||
ELSIF AnzahlGeaenderteLinien2=4 THEN Straflinien1:=4;
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
|
||||
END Kontrolle;
|
||||
|
||||
PROCEDURE LoescheTeil(a,lage: INTEGER; VAR x,y: INTEGER);
|
||||
|
||||
VAR i,j: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF a=1 THEN
|
||||
FOR i:=0 TO 1 DO;
|
||||
FOR j:=0 TO 1 DO;
|
||||
Feld[x+i,y+j]:=FALSE
|
||||
END;
|
||||
END;
|
||||
ELSIF a=2 THEN
|
||||
IF (lage=1)OR(lage=3) THEN
|
||||
FOR i:=0 TO 3 DO;
|
||||
Feld[x-1+i,y]:=FALSE;
|
||||
END;
|
||||
ELSE
|
||||
FOR i:=0 TO 3 DO;
|
||||
Feld[x,y-1+i]:=FALSE;
|
||||
END;
|
||||
END;
|
||||
ELSIF a=3 THEN
|
||||
IF lage=1 THEN
|
||||
Feld[x-1,y]:=FALSE;Feld[x,y]:=FALSE; Feld[x+1,y]:=FALSE;Feld[x,y+1]:=FALSE;
|
||||
ELSIF lage=2 THEN
|
||||
Feld[x,y-1]:=FALSE;Feld[x,y]:=FALSE; Feld[x+1,y]:=FALSE;Feld[x,y+1]:=FALSE;
|
||||
ELSIF lage=3 THEN
|
||||
Feld[x,y-1]:=FALSE;Feld[x,y]:=FALSE; Feld[x+1,y]:=FALSE;Feld[x-1,y]:=FALSE;
|
||||
ELSIF lage=4 THEN
|
||||
Feld[x,y-1]:=FALSE;Feld[x,y]:=FALSE; Feld[x,y+1]:=FALSE;Feld[x-1,y]:=FALSE;
|
||||
END;
|
||||
ELSIF a=4 THEN
|
||||
IF lage=1 THEN
|
||||
Feld[x-1,y]:=FALSE;Feld[x,y]:=FALSE; Feld[x+1,y]:=FALSE;Feld[x+1,y+1]:=FALSE;
|
||||
ELSIF lage=2 THEN
|
||||
Feld[x,y-1]:=FALSE;Feld[x,y]:=FALSE; Feld[x+1,y-1]:=FALSE;Feld[x,y+1]:=FALSE;
|
||||
ELSIF lage=3 THEN
|
||||
Feld[x-1,y-1]:=FALSE;Feld[x,y]:=FALSE; Feld[x+1,y]:=FALSE;Feld[x-1,y]:=FALSE;
|
||||
ELSIF lage=4 THEN
|
||||
Feld[x,y-1]:=FALSE;Feld[x,y]:=FALSE; Feld[x,y+1]:=FALSE;Feld[x-1,y+1]:=FALSE;
|
||||
END;
|
||||
ELSIF a=5 THEN
|
||||
IF lage=1 THEN
|
||||
Feld[x-1,y]:=FALSE;Feld[x,y]:=FALSE; Feld[x+1,y]:=FALSE;Feld[x-1,y+1]:=FALSE;
|
||||
ELSIF lage=2 THEN
|
||||
Feld[x,y-1]:=FALSE;Feld[x,y]:=FALSE; Feld[x+1,y+1]:=FALSE;Feld[x,y+1]:=FALSE;
|
||||
ELSIF lage=3 THEN
|
||||
Feld[x+1,y-1]:=FALSE;Feld[x,y]:=FALSE; Feld[x+1,y]:=FALSE;Feld[x-1,y]:=FALSE;
|
||||
ELSIF lage=4 THEN
|
||||
Feld[x,y-1]:=FALSE;Feld[x,y]:=FALSE; Feld[x,y+1]:=FALSE;Feld[x-1,y-1]:=FALSE;
|
||||
END;
|
||||
ELSIF a=6 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
Feld[x-1,y]:=FALSE;Feld[x,y]:=FALSE; Feld[x,y+1]:=FALSE;Feld[x+1,y+1]:=FALSE;
|
||||
ELSIF (lage=2) OR (lage= 4 )THEN
|
||||
Feld[x+1,y]:=FALSE;Feld[x,y]:=FALSE; Feld[x+1,y-1]:=FALSE; Feld[x,y+1]:=FALSE;
|
||||
END;
|
||||
ELSIF a=7 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
Feld[x,y+1]:=FALSE;Feld[x,y]:=FALSE; Feld[x+1,y]:=FALSE;Feld[x-1,y+1]:=FALSE;
|
||||
ELSIF (lage=2) OR (lage=4) THEN
|
||||
Feld[x,y+1]:=FALSE;Feld[x,y]:=FALSE; Feld[x-1,y-1]:=FALSE;Feld[x-1,y]:=FALSE;
|
||||
END;
|
||||
|
||||
END;
|
||||
END LoescheTeil;
|
||||
|
||||
PROCEDURE ZeichneTeil(a,lage: INTEGER; VAR x,y: INTEGER);
|
||||
|
||||
VAR i,j: INTEGER;
|
||||
|
||||
BEGIN;
|
||||
IF a=1 THEN
|
||||
FOR i:=0 TO 1 DO;
|
||||
FOR j:=0 TO 1 DO;
|
||||
Feld[x+i,y+j]:=TRUE
|
||||
END;
|
||||
END;
|
||||
ELSIF a=2 THEN
|
||||
IF (lage=1)OR(lage=3) THEN
|
||||
FOR i:=0 TO 3 DO;
|
||||
Feld[x-1+i,y]:=TRUE;
|
||||
END;
|
||||
ELSE
|
||||
FOR i:=0 TO 3 DO;
|
||||
Feld[x,y-1+i]:=TRUE;
|
||||
END;
|
||||
END;
|
||||
ELSIF a=3 THEN
|
||||
IF lage=1 THEN
|
||||
Feld[x-1,y]:=TRUE;Feld[x,y]:=TRUE; Feld[x+1,y]:=TRUE;Feld[x,y+1]:=TRUE;
|
||||
ELSIF lage=2 THEN
|
||||
Feld[x,y-1]:=TRUE;Feld[x,y]:=TRUE; Feld[x+1,y]:=TRUE;Feld[x,y+1]:=TRUE;
|
||||
ELSIF lage=3 THEN
|
||||
Feld[x,y-1]:=TRUE;Feld[x,y]:=TRUE; Feld[x+1,y]:=TRUE;Feld[x-1,y]:=TRUE;
|
||||
ELSIF lage=4 THEN
|
||||
Feld[x,y-1]:=TRUE;Feld[x,y]:=TRUE; Feld[x,y+1]:=TRUE;Feld[x-1,y]:=TRUE;
|
||||
END;
|
||||
ELSIF a=4 THEN
|
||||
IF lage=1 THEN
|
||||
Feld[x-1,y]:=TRUE;Feld[x,y]:=TRUE; Feld[x+1,y]:=TRUE;Feld[x+1,y+1]:=TRUE;
|
||||
ELSIF lage=2 THEN
|
||||
Feld[x,y-1]:=TRUE;Feld[x,y]:=TRUE; Feld[x+1,y-1]:=TRUE; Feld[x,y+1]:=TRUE;
|
||||
ELSIF lage=3 THEN
|
||||
Feld[x-1,y-1]:=TRUE;Feld[x,y]:=TRUE; Feld[x+1,y]:=TRUE;Feld[x-1,y]:=TRUE;
|
||||
ELSIF lage=4 THEN
|
||||
Feld[x,y-1]:=TRUE;Feld[x,y]:=TRUE; Feld[x,y+1]:=TRUE;Feld[x-1,y+1]:=TRUE;
|
||||
END;
|
||||
ELSIF a=5 THEN
|
||||
IF lage=1 THEN
|
||||
Feld[x-1,y]:=TRUE;Feld[x,y]:=TRUE; Feld[x+1,y]:=TRUE;Feld[x-1,y+1]:=TRUE;
|
||||
ELSIF lage=2 THEN
|
||||
Feld[x,y-1]:=TRUE;Feld[x,y]:=TRUE; Feld[x+1,y+1]:=TRUE;Feld[x,y+1]:=TRUE;
|
||||
ELSIF lage=3 THEN
|
||||
Feld[x+1,y-1]:=TRUE;Feld[x,y]:=TRUE; Feld[x+1,y]:=TRUE;Feld[x-1,y]:=TRUE;
|
||||
ELSIF lage=4 THEN
|
||||
Feld[x,y-1]:=TRUE;Feld[x,y]:=TRUE; Feld[x,y+1]:=TRUE;Feld[x-1,y-1]:=TRUE;
|
||||
END;
|
||||
ELSIF a=6 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
Feld[x-1,y]:=TRUE;Feld[x,y]:=TRUE; Feld[x,y+1]:=TRUE;Feld[x+1,y+1]:=TRUE;
|
||||
ELSIF (lage=2) OR (lage= 4 )THEN
|
||||
Feld[x+1,y]:=TRUE;Feld[x,y]:=TRUE; Feld[x+1,y-1]:=TRUE; Feld[x,y+1]:=TRUE;
|
||||
END;
|
||||
ELSIF a=7 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
Feld[x,y+1]:=TRUE;Feld[x,y]:=TRUE; Feld[x+1,y]:=TRUE;Feld[x-1,y+1]:=TRUE;
|
||||
ELSIF (lage=2) OR (lage=4) THEN
|
||||
Feld[x,y+1]:=TRUE;Feld[x,y]:=TRUE; Feld[x-1,y-1]:=TRUE;Feld[x-1,y]:=TRUE;
|
||||
END;
|
||||
END;
|
||||
END ZeichneTeil;
|
||||
|
||||
PROCEDURE HilfeLinks;
|
||||
|
||||
BEGIN
|
||||
wechsel:=TRUE; altkey:=",";
|
||||
END HilfeLinks;
|
||||
|
||||
PROCEDURE KontrolleLinks(a,lage: INTEGER; VAR x,y: INTEGER);
|
||||
|
||||
VAR hilfe1, hilfe2: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
IF a=1 THEN
|
||||
IF (~Feld[x-1,y])&(~Feld[x-1,y+1]) THEN DEC(x);
|
||||
ELSIF ~(x<2) THEN HilfeLinks;END;
|
||||
ELSIF a=2 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
IF (~Feld[x-2,y]) THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
ELSE
|
||||
hilfe1:=(~Feld[x-1,y-1])&(~Feld[x-1,y]); hilfe2:=(~Feld[x-1,y+1])&(~Feld[x-1,y+2]);
|
||||
IF hilfe1&hilfe2 THEN DEC(x);
|
||||
ELSIF ~(x<2) THEN HilfeLinks; END;
|
||||
END;
|
||||
ELSIF a=3 THEN
|
||||
IF lage=1 THEN
|
||||
IF (~Feld[x-2,y]&~Feld[x-1,y+1]) THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
ELSIF lage=2 THEN
|
||||
hilfe1:=(~Feld[x-1,y]&~Feld[x-1,y+1]);
|
||||
IF hilfe1 & ~Feld[x-1,y-1] THEN DEC(x);
|
||||
ELSIF ~(x<2) THEN HilfeLinks; END;
|
||||
ELSIF lage=3 THEN
|
||||
IF (~Feld[x-2,y]&~Feld[x-1,y-1]) THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
ELSIF lage=4 THEN
|
||||
hilfe1:=(~Feld[x-2,y]&~Feld[x-1,y+1]);
|
||||
IF hilfe1 & ~Feld[x-1,y-1] THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
END;
|
||||
ELSIF a=4 THEN
|
||||
IF lage=1 THEN
|
||||
IF (~Feld[x-2,y]&~Feld[x,y+1]) THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
ELSIF lage=2 THEN
|
||||
hilfe1:=(~Feld[x-1,y]&~Feld[x-1,y+1]);
|
||||
IF hilfe1 & ~Feld[x-1,y-1] THEN DEC(x);
|
||||
ELSIF ~(x<2) THEN HilfeLinks; END;
|
||||
ELSIF lage=3 THEN
|
||||
IF (~Feld[x-2,y]&~Feld[x-2,y-1]) THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
ELSIF lage=4 THEN
|
||||
hilfe1:=(~Feld[x-2,y+1]&~Feld[x-1,y]);
|
||||
IF hilfe1 & ~Feld[x-1,y-1] THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
END;
|
||||
ELSIF a=5 THEN
|
||||
IF lage=1 THEN
|
||||
IF (~Feld[x-2,y]&~Feld[x-2,y+1]) THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
ELSIF lage=2 THEN
|
||||
hilfe1:=(~Feld[x-1,y]&~Feld[x-1,y+1]);
|
||||
IF hilfe1 & ~Feld[x-1,y-1] THEN DEC(x);
|
||||
ELSIF ~(x<2) THEN HilfeLinks; END;
|
||||
ELSIF lage=3 THEN
|
||||
IF (~Feld[x-2,y]&~Feld[x,y-1]) THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
ELSIF lage=4 THEN
|
||||
hilfe1:=(~Feld[x-1,y+1]&~Feld[x-1,y]);
|
||||
IF hilfe1 & ~Feld[x-2,y-1] THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
END;
|
||||
ELSIF a=6 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
IF (~Feld[x-2,y])&(~Feld[x-1,y+1]) THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
ELSE
|
||||
hilfe1:=(~Feld[x,y-1])&(~Feld[x-1,y]); hilfe2:=(~Feld[x-1,y+1]);
|
||||
IF hilfe1&hilfe2 THEN DEC(x);
|
||||
ELSIF ~(x<2) THEN HilfeLinks; END;
|
||||
END;
|
||||
ELSIF a=7 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
IF (~Feld[x-1,y])&(~Feld[x-2,y+1]) THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
ELSE
|
||||
hilfe1:=(~Feld[x-2,y-1])&(~Feld[x-2,y]); hilfe2:=(~Feld[x-1,y+1]);
|
||||
IF hilfe1&hilfe2 THEN DEC(x);
|
||||
ELSIF ~(x<3) THEN HilfeLinks; END;
|
||||
END;
|
||||
END;
|
||||
END KontrolleLinks;
|
||||
|
||||
PROCEDURE HilfeRechts;
|
||||
|
||||
BEGIN
|
||||
wechsel:=TRUE; altkey:=".";
|
||||
END HilfeRechts;
|
||||
|
||||
PROCEDURE KontrolleRechts(a,lage: INTEGER; VAR x,y: INTEGER);
|
||||
|
||||
VAR hilfe1, hilfe2: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
IF a=1 THEN
|
||||
IF (~Feld[x+2,y])&(~Feld[x+2,y+1])THEN INC(x);
|
||||
ELSIF~(x>8) THEN HilfeRechts; END;
|
||||
ELSIF a=2 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
IF (~Feld[x+3,y]) THEN INC(x);
|
||||
ELSIF ~(x>7) THEN HilfeRechts; END;
|
||||
ELSE
|
||||
hilfe1:=(~Feld[x+1,y-1])&(~Feld[x+1,y]); hilfe2:=(~Feld[x+1,y+1])&(~Feld[x+1,y+2]);
|
||||
IF hilfe1&hilfe2 THEN INC(x);
|
||||
ELSIF ~(x>9) THEN HilfeRechts; END;
|
||||
END;
|
||||
ELSIF a=3 THEN
|
||||
IF lage=1 THEN
|
||||
IF (~Feld[x+2,y]&~Feld[x+1,y+1]) THEN INC(x);
|
||||
ELSIF ~(x>8) THEN HilfeRechts; END;
|
||||
ELSIF lage=2 THEN
|
||||
hilfe1:=(~Feld[x+2,y]&~Feld[x+1,y+1]);
|
||||
IF hilfe1 & ~Feld[x+1,y-1] THEN INC(x);
|
||||
ELSIF ~(x>8) THEN HilfeRechts; END;
|
||||
ELSIF lage=3 THEN
|
||||
IF (~Feld[x+2,y]&~Feld[x+1,y-1]) THEN INC(x);
|
||||
ELSIF ~(x>8) THEN HilfeRechts; END;
|
||||
ELSIF lage=4 THEN
|
||||
hilfe1:=(~Feld[x+1,y]&~Feld[x+1,y+1]);
|
||||
IF hilfe1 & ~Feld[x+1,y-1] THEN INC(x);
|
||||
ELSIF ~(x>9) THEN HilfeRechts; END;
|
||||
END;
|
||||
ELSIF a=4 THEN
|
||||
IF lage=1 THEN
|
||||
IF (~Feld[x+2,y]&~Feld[x+2,y+1]) THEN INC(x);
|
||||
ELSIF ~(x>8) THEN HilfeRechts; END;
|
||||
ELSIF lage=2 THEN
|
||||
hilfe1:=(~Feld[x+1,y]&~Feld[x+1,y+1]);
|
||||
IF hilfe1 & ~Feld[x+2,y-1] THEN INC(x);
|
||||
ELSIF ~(x>8) THEN HilfeRechts; END;
|
||||
ELSIF lage=3 THEN
|
||||
IF (~Feld[x+2,y]&~Feld[x,y-1]) THEN INC(x);
|
||||
ELSIF ~(x>8) THEN HilfeRechts; END;
|
||||
ELSIF lage=4 THEN
|
||||
hilfe1:=(~Feld[x+1,y]&~Feld[x+1,y+1]);
|
||||
IF hilfe1 & ~Feld[x+1,y-1] THEN INC(x);
|
||||
ELSIF ~(x>9) THEN HilfeRechts; END;
|
||||
END;
|
||||
ELSIF a=5 THEN
|
||||
IF lage=1 THEN
|
||||
IF (~Feld[x+2,y]&~Feld[x,y+1]) THEN INC(x);
|
||||
ELSIF ~(x>8) THEN HilfeRechts; END;
|
||||
ELSIF lage=2 THEN
|
||||
hilfe1:=(~Feld[x+1,y]&~Feld[x+2,y+1]);
|
||||
IF hilfe1 & ~Feld[x+1,y-1] THEN INC(x);
|
||||
ELSIF ~(x>8) THEN HilfeRechts; END;
|
||||
ELSIF lage=3 THEN
|
||||
IF (~Feld[x+2,y]&~Feld[x+2,y-1]) THEN INC(x);
|
||||
ELSIF ~(x>8) THEN HilfeRechts; END;
|
||||
ELSIF lage=4 THEN
|
||||
hilfe1:=(~Feld[x+1,y]&~Feld[x+1,y+1]);
|
||||
IF hilfe1 & ~Feld[x+1,y-1] THEN INC(x);
|
||||
ELSIF ~(x>9) THEN HilfeRechts; END;
|
||||
END;
|
||||
ELSIF a=6 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
IF (~Feld[x+1,y])&(~Feld[x+2,y+1]) THEN INC(x);
|
||||
ELSIF ~(x>8) THEN HilfeRechts; END;
|
||||
ELSE
|
||||
hilfe1:=(~Feld[x+2,y-1])&(~Feld[x+2,y]); hilfe2:=(~Feld[x+1,y+1]);
|
||||
IF hilfe1&hilfe2 THEN INC(x);
|
||||
ELSIF ~(x>8) THEN HilfeRechts; END;
|
||||
END;
|
||||
ELSIF a=7 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
IF (~Feld[x+2,y])&(~Feld[x+1,y+1]) THEN INC(x);
|
||||
ELSIF ~(x>8) THEN HilfeRechts; END;
|
||||
ELSE
|
||||
hilfe1:=(~Feld[x,y-1])&(~Feld[x+1,y]); hilfe2:=(~Feld[x+1,y+1]);
|
||||
IF hilfe1&hilfe2 THEN INC(x);
|
||||
ELSIF ~(x>9) THEN HilfeRechts; END;
|
||||
END;
|
||||
END;
|
||||
END KontrolleRechts;
|
||||
|
||||
PROCEDURE HilfeUnten(x,y: INTEGER);
|
||||
|
||||
BEGIN;
|
||||
IF y=19 THEN Spielende:=TRUE END;
|
||||
IF x<11 THEN fertig1:=TRUE; ELSE fertig2:=TRUE END;
|
||||
END HilfeUnten;
|
||||
|
||||
PROCEDURE KontrolleUnten(a,lage,x,y: INTEGER);
|
||||
|
||||
VAR hilfe1, hilfe2: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
IF y>1 THEN
|
||||
IF a=1 THEN
|
||||
IF Feld[x,y-1] OR Feld[x+1,y-1] THEN HilfeUnten(x,y) END;
|
||||
ELSIF a=2 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
hilfe1:=Feld[x-1,y-1] OR Feld[x,y-1]; hilfe2:=Feld[x+1,y-1] OR Feld[x+2,y-1];
|
||||
IF hilfe1 OR hilfe2 THEN HilfeUnten(x,y) END;
|
||||
ELSE
|
||||
IF Feld[x,y-2] THEN HilfeUnten(x,y) END;
|
||||
END;
|
||||
ELSIF a=3 THEN
|
||||
IF lage=1 THEN
|
||||
hilfe1:=Feld[x-1,y-1] OR Feld[x,y-1]; hilfe2:=Feld[x+1,y-1];
|
||||
IF hilfe1 OR hilfe2 THEN HilfeUnten(x,y) END;
|
||||
ELSIF lage=2 THEN
|
||||
IF Feld[x,y-2] OR Feld[x+1,y-1] THEN HilfeUnten(x,y) END;
|
||||
ELSIF lage=3 THEN
|
||||
hilfe1:=Feld[x-1,y-1] OR Feld[x,y-2]; hilfe2:=Feld[x+1,y-1];
|
||||
IF hilfe1 OR hilfe2 THEN HilfeUnten(x,y) END;
|
||||
ELSIF lage=4 THEN
|
||||
IF Feld[x,y-2] OR Feld[x-1,y-1] THEN HilfeUnten(x,y) END;
|
||||
END;
|
||||
ELSIF a=4 THEN
|
||||
IF lage=1 THEN
|
||||
hilfe1:=Feld[x-1,y-1] OR Feld[x,y-1]; hilfe2:=Feld[x+1,y-1];
|
||||
IF hilfe1 OR hilfe2 THEN HilfeUnten(x,y) END;
|
||||
ELSIF lage=2 THEN
|
||||
IF Feld[x,y-2] OR Feld[x+1,y-2] THEN HilfeUnten(x,y) END;
|
||||
ELSIF lage=3 THEN
|
||||
hilfe1:=Feld[x-1,y-2] OR Feld[x,y-1]; hilfe2:=Feld[x+1,y-1];
|
||||
IF hilfe1 OR hilfe2 THEN HilfeUnten(x,y) END;
|
||||
ELSIF lage=4 THEN
|
||||
IF Feld[x,y-2] OR Feld[x-1,y] THEN HilfeUnten(x,y) END;
|
||||
END;
|
||||
ELSIF a=5 THEN
|
||||
IF lage=1 THEN
|
||||
hilfe1:=Feld[x-1,y-1] OR Feld[x,y-1]; hilfe2:=Feld[x+1,y-1];
|
||||
IF hilfe1 OR hilfe2 THEN HilfeUnten(x,y) END;
|
||||
ELSIF lage=2 THEN
|
||||
IF Feld[x,y-2] OR Feld[x+1,y] THEN HilfeUnten(x,y) END;
|
||||
ELSIF lage=3 THEN
|
||||
hilfe1:=Feld[x-1,y-1] OR Feld[x,y-1]; hilfe2:=Feld[x+1,y-2];
|
||||
IF hilfe1 OR hilfe2 THEN HilfeUnten(x,y) END;
|
||||
ELSIF lage=4 THEN
|
||||
IF Feld[x,y-2] OR Feld[x-1,y-2] THEN HilfeUnten(x,y) END;
|
||||
END;
|
||||
ELSIF a=6 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
hilfe1:=Feld[x-1,y-1] OR Feld[x,y-1]; hilfe2:=Feld[x+1,y];
|
||||
IF hilfe1 OR hilfe2 THEN HilfeUnten(x,y) END;
|
||||
ELSE
|
||||
IF Feld[x,y-1] OR Feld[x+1,y-2] THEN HilfeUnten(x,y) END;
|
||||
END;
|
||||
ELSIF a=7 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
hilfe1:=Feld[x-1,y] OR Feld[x,y-1]; hilfe2:=Feld[x+1,y-1];
|
||||
IF hilfe1 OR hilfe2 THEN HilfeUnten(x,y) END;
|
||||
ELSE
|
||||
IF Feld[x,y-1] OR Feld[x-1,y-2] THEN HilfeUnten(x,y) END;
|
||||
END;
|
||||
END;
|
||||
ELSE HilfeUnten(x,y); END;
|
||||
END KontrolleUnten;
|
||||
|
||||
PROCEDURE DrehungLinks(VAR a,lage,x,y: INTEGER):BOOLEAN;
|
||||
|
||||
VAR hilfe1: BOOLEAN;
|
||||
|
||||
BEGIN;
|
||||
IF a=2 THEN
|
||||
IF lage DIV 2 # 0 THEN
|
||||
hilfe1:=~Feld[x-1,y]&~Feld[x+1,y];
|
||||
RETURN ~Feld[x+2,y]&hilfe1 ;
|
||||
ELSE
|
||||
hilfe1:=~Feld[x,y-1]&~Feld[x,y+1];
|
||||
RETURN ~Feld[x,y+2]&hilfe1 ;
|
||||
END;
|
||||
ELSIF a=3 THEN
|
||||
IF lage=1 THEN RETURN ~Feld[x,y-1];
|
||||
ELSIF lage=2 THEN RETURN ~Feld[x-1,y];
|
||||
ELSIF lage=3 THEN RETURN ~Feld[x,y+1];
|
||||
ELSIF lage=4 THEN RETURN ~Feld[x+1,y];
|
||||
END;
|
||||
ELSIF a=4 THEN
|
||||
IF lage=1 THEN
|
||||
hilfe1:=~Feld[x+1,y-1]&~Feld[x,y-1];
|
||||
RETURN hilfe1&~Feld[x,y+1];
|
||||
ELSIF lage=2 THEN
|
||||
hilfe1:=~Feld[x+1,y]&~Feld[x-1,y-1];
|
||||
RETURN hilfe1&~Feld[x-1,y];
|
||||
ELSIF lage=3 THEN
|
||||
hilfe1:=~Feld[x-1,y+1]&~Feld[x,y-1];
|
||||
RETURN hilfe1&~Feld[x,y+1];
|
||||
ELSIF lage=4 THEN
|
||||
hilfe1:=~Feld[x+1,y]&~Feld[x+1,y+1];
|
||||
RETURN hilfe1&~Feld[x-1,y];
|
||||
END;
|
||||
ELSIF a=5 THEN
|
||||
IF lage=1 THEN
|
||||
hilfe1:=~Feld[x+1,y+1]&~Feld[x,y-1];
|
||||
RETURN hilfe1&~Feld[x,y+1];
|
||||
ELSIF lage=2 THEN
|
||||
hilfe1:=~Feld[x+1,y]&~Feld[x+1,y-1];
|
||||
RETURN hilfe1&~Feld[x-1,y];
|
||||
ELSIF lage=3 THEN
|
||||
hilfe1:=~Feld[x-1,y-1]&~Feld[x,y-1];
|
||||
RETURN hilfe1&~Feld[x,y+1];
|
||||
ELSIF lage=4 THEN
|
||||
hilfe1:=~Feld[x+1,y]&~Feld[x-1,y+1];
|
||||
RETURN hilfe1&~Feld[x-1,y];
|
||||
END;
|
||||
END;
|
||||
RETURN TRUE;
|
||||
END DrehungLinks;
|
||||
|
||||
PROCEDURE DrehungRechts(VAR a,lage,x,y: INTEGER):BOOLEAN;
|
||||
|
||||
VAR hilfe1: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
IF a=2 THEN
|
||||
IF lage DIV 2 # 0 THEN
|
||||
hilfe1:=~Feld[x-1,y]&~Feld[x+1,y];
|
||||
RETURN ~Feld[x+2,y]&hilfe1 ;
|
||||
ELSE
|
||||
hilfe1:=~Feld[x,y-1]&~Feld[x,y+1];
|
||||
RETURN ~Feld[x,y+2]&hilfe1 ;
|
||||
END;
|
||||
ELSIF a=3 THEN
|
||||
IF lage=3 THEN RETURN ~Feld[x,y-1];
|
||||
ELSIF lage=2 THEN RETURN ~Feld[x-1,y];
|
||||
ELSIF lage=1 THEN RETURN ~Feld[x,y+1];
|
||||
ELSIF lage=4 THEN RETURN ~Feld[x+1,y];
|
||||
END;
|
||||
ELSIF a=4 THEN
|
||||
IF lage=3 THEN
|
||||
hilfe1:=~Feld[x+1,y-1]&~Feld[x,y-1];
|
||||
RETURN hilfe1&~Feld[x,y+1];
|
||||
ELSIF lage=4 THEN
|
||||
hilfe1:=~Feld[x+1,y]&~Feld[x-1,y-1];
|
||||
RETURN hilfe1&~Feld[x-1,y];
|
||||
ELSIF lage=1 THEN
|
||||
hilfe1:=~Feld[x-1,y+1]&~Feld[x,y-1];
|
||||
RETURN hilfe1&~Feld[x,y+1];
|
||||
ELSIF lage=2 THEN
|
||||
hilfe1:=~Feld[x+1,y]&~Feld[x+1,y+1];
|
||||
RETURN hilfe1&~Feld[x-1,y];
|
||||
END;
|
||||
ELSIF a=5 THEN
|
||||
IF lage=3 THEN
|
||||
hilfe1:=~Feld[x+1,y+1]&~Feld[x,y-1];
|
||||
RETURN hilfe1&~Feld[x,y+1];
|
||||
ELSIF lage=4 THEN
|
||||
hilfe1:=~Feld[x+1,y]&~Feld[x+1,y-1];
|
||||
RETURN hilfe1&~Feld[x-1,y];
|
||||
ELSIF lage=1 THEN
|
||||
hilfe1:=~Feld[x-1,y-1]&~Feld[x,y-1];
|
||||
RETURN hilfe1&~Feld[x,y+1];
|
||||
ELSIF lage=2 THEN
|
||||
hilfe1:=~Feld[x+1,y]&~Feld[x-1,y+1];
|
||||
RETURN hilfe1&~Feld[x-1,y];
|
||||
END;
|
||||
ELSIF a=6 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
RETURN ~Feld[x+1,y-1]&~Feld[x+1,y];
|
||||
ELSE
|
||||
RETURN ~Feld[x+1,y+1]&~Feld[x-1,y];
|
||||
END;
|
||||
ELSIF a=7 THEN
|
||||
IF (lage=1) OR (lage=3) THEN
|
||||
RETURN ~Feld[x-1,y-1]&~Feld[x-1,y];
|
||||
ELSE
|
||||
RETURN ~Feld[x-1,y+1]&~Feld[x+1,y];
|
||||
END;
|
||||
END;
|
||||
RETURN TRUE;
|
||||
END DrehungRechts;
|
||||
|
||||
PROCEDURE Strafen1;
|
||||
|
||||
VAR Hoehe,i,j,freiesFeld: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF Straflinien1#0 THEN
|
||||
Hoehe:=20-Straflinien1;
|
||||
WHILE Hoehe>=1 DO
|
||||
FOR i:=1 TO 10 DO;
|
||||
Feld[i,Hoehe+Straflinien1]:=Feld[i,Hoehe];
|
||||
END;
|
||||
DEC(Hoehe);
|
||||
END;
|
||||
FOR i:=1 TO Straflinien1 DO;
|
||||
FOR j:=1 TO 10 DO;
|
||||
Feld[j,i]:=TRUE;
|
||||
END;
|
||||
freiesFeld:=0;
|
||||
WHILE freiesFeld=0 DO freiesFeld:=SHORT(ENTIER(10*RN.Uniform())); END;
|
||||
Feld[freiesFeld,i]:=FALSE;
|
||||
END;
|
||||
Straflinien1:=0;
|
||||
END;
|
||||
END Strafen1;
|
||||
|
||||
PROCEDURE Strafen2;
|
||||
|
||||
VAR Hoehe,i,j,freiesFeld: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF Straflinien2#0 THEN
|
||||
Hoehe:=20-Straflinien2;
|
||||
WHILE Hoehe>=1 DO
|
||||
FOR i:=21 TO 30 DO;
|
||||
Feld[i,Hoehe+Straflinien2]:=Feld[i,Hoehe];
|
||||
END;
|
||||
DEC(Hoehe);
|
||||
END;
|
||||
FOR i:=1 TO Straflinien2 DO;
|
||||
FOR j:=21 TO 30 DO;
|
||||
Feld[j,i]:=TRUE;
|
||||
END;
|
||||
freiesFeld:=0;
|
||||
WHILE freiesFeld=0 DO freiesFeld:=SHORT(ENTIER(10*RN.Uniform())); END;
|
||||
Feld[20+freiesFeld,i]:=FALSE;
|
||||
END;
|
||||
Straflinien2:=0;
|
||||
END;
|
||||
END Strafen2;
|
||||
|
||||
PROCEDURE Spiel;
|
||||
|
||||
VAR i,j,k,Zaehler: INTEGER; key: CHAR; hilfe1,hilfe2: BOOLEAN;next,altnext,OrtX, OrtY: INTEGER;
|
||||
|
||||
BEGIN;
|
||||
WHILE ~Spielende DO
|
||||
IF y1=0 THEN
|
||||
IF y2=0 THEN
|
||||
x2:=25; y2:=19;lage2:=1;fertig2:=FALSE; tempo2:=1; a2:=0;
|
||||
a2:=next;
|
||||
END;
|
||||
x1:=5; y1:=19;lage1:=1; fertig1:=FALSE; tempo1:=1;a1:=0;
|
||||
a1:=next;
|
||||
ELSE
|
||||
x2:=25; y2:=19;lage2:=1;fertig2:=FALSE; tempo2:=1; a2:=0;
|
||||
IF next=0 THEN a2:=a1; ELSE a2:=next; END;
|
||||
END;
|
||||
next:=0;
|
||||
WHILE next=0 DO next:=SHORT(ENTIER(7*RN.Uniform()+0.5)); END;
|
||||
OrtX:=15; OrtY:=15;
|
||||
LoescheTeil(altnext,1,OrtX,OrtY);
|
||||
ZeichneTeil(next,1,OrtX, OrtY);
|
||||
MaleVorschau;
|
||||
altnext:=next;
|
||||
wechsel:=FALSE;
|
||||
Ziffer.Zeichne(3,level1,1,0); Ziffer.Zeichne(4,Linien1,7,0);Ziffer.Zeichne(8,Punkte1,3,-1);
|
||||
IF Spieler2 THEN Ziffer.Zeichne(3,level2,21,0); Ziffer.Zeichne(4,Linien2,27,0);
|
||||
Ziffer.Zeichne(8,Punkte2,23,-1); END;
|
||||
WHILE (y1>0) & (y2>0) DO;
|
||||
IF ~Spieler2 THEN y2:=7; END;
|
||||
INC(Zaehler);
|
||||
key:=X.Key();
|
||||
(* IF wechsel THEN key:=altkey; END; *);
|
||||
IF key=links1 THEN
|
||||
LoescheTeil(a1,lage1,x1,y1);
|
||||
KontrolleLinks(a1,lage1,x1,y1);
|
||||
END;
|
||||
IF key=rechts1 THEN
|
||||
LoescheTeil(a1,lage1,x1,y1);
|
||||
KontrolleRechts(a1,lage1,x1,y1);
|
||||
END;
|
||||
IF Spieler2 THEN
|
||||
IF key=links2 THEN
|
||||
LoescheTeil(a2,lage2,x2,y2);
|
||||
KontrolleLinks(a2,lage2,x2,y2);
|
||||
END;
|
||||
IF key=rechts2 THEN
|
||||
LoescheTeil(a2,lage2,x2,y2);
|
||||
KontrolleRechts(a2,lage2,x2,y2);
|
||||
END; END;
|
||||
hilfe1:=(x1>1)&(x1<10);
|
||||
IF Spieler2 THEN hilfe2:=(x2>21)&(x2<30); END;
|
||||
IF key=drehunglinks1 THEN
|
||||
IF hilfe1 & DrehungLinks(a1,lage1,x1,y1) THEN INC(lage1); IF lage1>4 THEN lage1:=1 END; END; END;
|
||||
IF key=drehungrechts1 THEN
|
||||
IF hilfe1 & DrehungRechts(a1,lage1,x1,y1) THEN DEC(lage1); IF lage1<1 THEN lage1:=4 END; END; END;
|
||||
IF Spieler2 THEN
|
||||
IF key=drehunglinks2 THEN
|
||||
IF hilfe2 & DrehungLinks(a2,lage2,x2,y2) THEN INC(lage2); IF lage2>4 THEN lage2:=1 END; END; END;
|
||||
IF key=drehungrechts2 THEN
|
||||
IF hilfe2 & DrehungRechts(a2,lage2,x2,y2) THEN DEC(lage2); IF lage2<1 THEN lage2:=4 END; END; END;
|
||||
END;
|
||||
IF key=ende THEN Spielende:=TRUE; END;
|
||||
IF key=runter1 THEN
|
||||
IF tempo1=8(*Verzoegerung DIV level1*) THEN tempo1:=1
|
||||
ELSE tempo1:=8(*Verzoegerung DIV level1*); Punkte1:=Punkte1 + level1*y1; END;
|
||||
END;
|
||||
IF Spieler2 THEN IF key=runter2 THEN
|
||||
IF tempo2=8(*Verzoegerung DIV level2*) THEN tempo2:=1
|
||||
ELSE tempo2:=8(*Verzoegerung DIV level2*); Punkte2:=Punkte2 + level2*y2;END;
|
||||
END; END;
|
||||
IF Zaehler MOD (Verzoegerung DIV level1 DIV tempo1) = 0 THEN
|
||||
KontrolleUnten(a1,lage1,x1,y1);
|
||||
ZeichneTeil(a1,lage1,x1,y1);
|
||||
Malen1;
|
||||
IF fertig1 THEN Kontrolle; LoescheLinien1; Malen1; Strafen1; END;
|
||||
IF ~fertig1 THEN
|
||||
LoescheTeil(a1,lage1,x1,y1);
|
||||
END;
|
||||
IF fertig1 THEN y1:=0 ELSE DEC(y1); END;
|
||||
END;
|
||||
IF Spieler2 THEN
|
||||
IF Zaehler MOD (Verzoegerung DIV level2 DIV tempo2) = 0 THEN
|
||||
KontrolleUnten(a2,lage2,x2,y2);
|
||||
ZeichneTeil(a2,lage2,x2,y2);
|
||||
Malen2;
|
||||
IF fertig2 THEN Kontrolle; LoescheLinien2; Malen2; Strafen2; END;
|
||||
IF ~fertig2 THEN
|
||||
LoescheTeil(a2,lage2,x2,y2);
|
||||
END;
|
||||
IF fertig2 THEN y2:=0 ELSE DEC(y2); END;
|
||||
END;
|
||||
END;
|
||||
IF Spieler2 THEN
|
||||
IF (Linien1>=Limit) OR (Linien2>=Limit) THEN
|
||||
IF Linien2<Limit THEN Out.String("Spieler1 hat gewonnen!"); Spielende:=TRUE;
|
||||
ELSIF Linien1<Limit THEN Out.String("Spieler2 hat gewonnen!"); Spielende:=TRUE;
|
||||
ELSE Out.String("Beide haben gewonnen!"); Spielende:=TRUE;
|
||||
END
|
||||
END;
|
||||
END;
|
||||
IF key=pause THEN
|
||||
REPEAT key:=X.Key() UNTIL key=endepause;
|
||||
END;
|
||||
IF Zaehler=Verzoegerung THEN Zaehler:=0; END;
|
||||
END;
|
||||
END;
|
||||
END Spiel;
|
||||
|
||||
PROCEDURE Start*;
|
||||
|
||||
VAR p: INTEGER;
|
||||
|
||||
BEGIN
|
||||
In.Open;
|
||||
In.Int(p);
|
||||
IF p=2 THEN Spieler2:=TRUE; ELSE Spieler2:=FALSE; END;
|
||||
Spielfeldzeichnen;
|
||||
RN.InitSeed(Oberon.Time());
|
||||
Spielende:=FALSE;
|
||||
IF Spieler2 THEN x2:=26; y2:=19;lage2:=1;fertig2:=FALSE; tempo2:=1; a2:=0;
|
||||
WHILE a2=0 DO a2:=SHORT(ENTIER(7*RN.Uniform()+0.5)); END ; END;
|
||||
x1:=5; y1:=19;lage1:=1; fertig1:=FALSE; tempo1:=1;a1:=0;
|
||||
WHILE a1=0 DO a1:=SHORT(ENTIER(7*RN.Uniform()+0.5)); END;
|
||||
wechsel:=FALSE;
|
||||
Linien1:=0; Linien2:=0; level1:=1; level2:=1; Punkte1:=0; Punkte2:=0;
|
||||
Straflinien1:=0; Straflinien2:=0;
|
||||
Spiel;
|
||||
END Start;
|
||||
|
||||
BEGIN
|
||||
Start
|
||||
|
||||
END Tetris.
|
||||
|
||||
134
src/test/x11/tetris/Ziffer.Mod
Normal file
134
src/test/x11/tetris/Ziffer.Mod
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
MODULE Ziffer;
|
||||
|
||||
IMPORT X:=oocXYplane, L:=Linie, In := compatIn, Out := Console, RN:=ethRandomNumbers;
|
||||
|
||||
PROCEDURE Loesche*(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 Loesche;
|
||||
|
||||
PROCEDURE Eins*(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 Eins;
|
||||
|
||||
PROCEDURE Zwei*(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 Zwei;
|
||||
|
||||
PROCEDURE Drei*(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 Drei;
|
||||
|
||||
PROCEDURE Vier*(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 Vier;
|
||||
|
||||
PROCEDURE Fuenf*(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 Fuenf;
|
||||
|
||||
PROCEDURE Sechs*(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 Sechs;
|
||||
|
||||
PROCEDURE Sieben*(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 Sieben;
|
||||
|
||||
PROCEDURE Acht*(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 Acht;
|
||||
|
||||
PROCEDURE Neun*(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+5);
|
||||
L.Linie(40+10*x+7,40+10*y+8,40+10*x+7,40+10*y+2);
|
||||
END Neun;
|
||||
|
||||
PROCEDURE Null*(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+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 Null ;
|
||||
|
||||
PROCEDURE Zeichne*(Laenge, Zahl, x,y: INTEGER);
|
||||
|
||||
VAR j,a,i,k: INTEGER;
|
||||
|
||||
BEGIN;
|
||||
FOR i:=0 TO Laenge-1 DO;
|
||||
Loesche(x+i,y);
|
||||
a:=1;
|
||||
FOR k:=2 TO Laenge-i DO
|
||||
a:=10*a;
|
||||
END;
|
||||
j:=Zahl DIV a;
|
||||
IF j=0 THEN Null(x+i,y);
|
||||
ELSIF j=1 THEN Eins(x+i,y);
|
||||
ELSIF j=2 THEN Zwei(x+i,y);
|
||||
ELSIF j=3 THEN Drei(x+i,y);
|
||||
ELSIF j=4 THEN Vier(x+i,y);
|
||||
ELSIF j=5 THEN Fuenf(x+i,y);
|
||||
ELSIF j=6 THEN Sechs(x+i,y);
|
||||
ELSIF j=7 THEN Sieben(x+i,y);
|
||||
ELSIF j=8 THEN Acht(x+i,y);
|
||||
ELSIF j=9 THEN Neun(x+i,y);
|
||||
END;
|
||||
Zahl:=Zahl - j*a;
|
||||
END;
|
||||
END Zeichne;
|
||||
|
||||
END Ziffer.
|
||||
|
||||
|
||||
17
src/test/x11/tetris/makefile
Normal file
17
src/test/x11/tetris/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 Ziffer.Mod Tetris.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
|
||||
27
src/test/x11/tron/Readme.md
Normal file
27
src/test/x11/tron/Readme.md
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
This is a game historycal source taken from http://web.archive.org/web/20050212180221/http://www.vis.inf.ethz.ch/~andy/Oberon.html
|
||||
|
||||
It serves as an example of XYplane module usage.
|
||||
|
||||
build by typing:
|
||||
|
||||
make
|
||||
|
||||
run by ./Tron <number>
|
||||
|
||||
Start Tron with a Games.Tron a ~
|
||||
a (1 - 10) speed of the game.
|
||||
|
||||
During the game, the following keys are availiable:
|
||||
|
||||
Player One:
|
||||
a ... turn left
|
||||
s ... turn right
|
||||
d ... turbo On/Off
|
||||
Player Two:
|
||||
4 ... turn left
|
||||
5 ... turn right
|
||||
6 ... turbo on/off
|
||||
General keys:
|
||||
p ... pause
|
||||
q ... quit
|
||||
|
||||
230
src/test/x11/tron/Tron.Mod
Normal file
230
src/test/x11/tron/Tron.Mod
Normal file
|
|
@ -0,0 +1,230 @@
|
|||
MODULE Tron;
|
||||
|
||||
IMPORT In := compatIn, X:=oocXYplane;
|
||||
|
||||
(* Programmiert von Peter Brantschen, Version 1.00, 21. April 1996
|
||||
Neue Features: - Tastatursteuerung nur noch links und rechts
|
||||
- Spielstand zaehlen unter dem Logo
|
||||
|
||||
Verbesserungsvorschlaege an: INDIANA@EZINFO.VMSMAIL.ETHZ.CH
|
||||
oder: PBRANTSC@G26.ETHZ.CH
|
||||
|
||||
Tastatur:
|
||||
Spieler1:
|
||||
a ... Drehung gegen den Uhrzeigersinn
|
||||
s ... Drehung mit dem Uhrzeigersinn
|
||||
d ... Turbo
|
||||
|
||||
Spieler2:
|
||||
4 ... Drehung gegen den Uhrzeigersinn
|
||||
5 ... Drehung mit dem Uhrzeigersinn
|
||||
6 ... Turbo
|
||||
|
||||
p ... Pause
|
||||
q ... Quit
|
||||
|
||||
Programmaufruf:
|
||||
|
||||
Games.Tron TEMPO
|
||||
|
||||
TEMPO ist eine Zahl zwischen 1 und 10
|
||||
|
||||
Gespielt wird BEST OF 51 *)
|
||||
|
||||
CONST links=10; rechts=350; unten=10; oben=300;
|
||||
x1start=100; y1start=100; x2start=260; y2start=100; Limit=51;
|
||||
|
||||
VAR SiegeSpieler1, SiegeSpieler2: INTEGER;
|
||||
|
||||
PROCEDURE LoescheBildschirm;
|
||||
|
||||
BEGIN
|
||||
X.Clear;
|
||||
END LoescheBildschirm;
|
||||
|
||||
PROCEDURE Linie(x1,x2,h,dicke: INTEGER);
|
||||
|
||||
VAR i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
WHILE x1<=x2 DO;
|
||||
FOR i:=0 TO (dicke-1) DO;
|
||||
X.Dot(x1,h+i,1);
|
||||
END;
|
||||
INC(x1);
|
||||
END;
|
||||
END Linie;
|
||||
|
||||
PROCEDURE Zwischenstand;
|
||||
|
||||
VAR i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
i:=0;
|
||||
WHILE i<SiegeSpieler1 DO;
|
||||
Linie(60+2*i,60+2*i,330,5);
|
||||
INC(i)
|
||||
END;
|
||||
i:=0;
|
||||
WHILE i<SiegeSpieler2 DO;
|
||||
Linie(60+2*i,60+2*i,320,5);
|
||||
INC(i)
|
||||
END;
|
||||
END Zwischenstand;
|
||||
|
||||
PROCEDURE Logo;
|
||||
|
||||
VAR i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
(* T *)
|
||||
FOR i:=60 TO 110 DO; X.Dot(i,400,1); END;
|
||||
FOR i:=350 TO 400 DO; X.Dot(85,i,1); END;
|
||||
(* R *)
|
||||
FOR i:=350 TO 400 DO; X.Dot(120,i,1); END;
|
||||
FOR i:=120 TO 170 DO; X.Dot(i,400,1); END;
|
||||
FOR i:=120 TO 170 DO; X.Dot(i,375,1); END;
|
||||
FOR i:=375 TO 400 DO; X.Dot(170,i,1); END;
|
||||
FOR i:=1 TO 25 DO; X.Dot(145+i,375-i,1); END;
|
||||
(* O *)
|
||||
FOR i:=350 TO 400 DO; X.Dot(180,i,1); END;
|
||||
FOR i:=180 TO 230 DO; X.Dot(i,400,1); END;
|
||||
FOR i:=180 TO 230 DO; X.Dot(i,350,1); END;
|
||||
FOR i:=350 TO 400 DO; X.Dot(230,i,1); END;
|
||||
(* N *)
|
||||
FOR i:=350 TO 400 DO; X.Dot(240,i,1); END;
|
||||
FOR i:=1 TO 50 DO; X.Dot(240+i,400-i,1); END;
|
||||
FOR i:=350 TO 400 DO; X.Dot(290,i,1); END;
|
||||
(* unterstrichen *)
|
||||
FOR i:=60 TO 290 DO; X.Dot(i,345,1); END;
|
||||
FOR i:=60 TO 290 DO; X.Dot(i,343,1); END;
|
||||
|
||||
END Logo;
|
||||
|
||||
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 Tron*;
|
||||
|
||||
VAR key:CHAR; abbruch, malen,weiter: BOOLEAN;
|
||||
x1,y1,xweiter1,yweiter1, Anzahl: INTEGER;
|
||||
x2,y2,xweiter2,yweiter2, i: INTEGER;
|
||||
imspiel1, imspiel2, pause, Ende: BOOLEAN;
|
||||
Spieler1, Spieler2, Runde, Tempo1, Tempo2,langsam,schnell: INTEGER;
|
||||
|
||||
BEGIN;
|
||||
X.Open;
|
||||
Spieler1:=0; Spieler2:=0; Runde:=0; Ende:=FALSE;
|
||||
SiegeSpieler1:=0; SiegeSpieler2:=0;
|
||||
In.Open;
|
||||
In.Int(i);
|
||||
IF i<1 THEN i:=1 END;
|
||||
IF i>10 THEN i:=10 END;
|
||||
langsam:=1000 DIV i;
|
||||
schnell:=600 DIV i;
|
||||
weiter:=TRUE;
|
||||
WHILE Runde<Limit DO;
|
||||
WHILE ~weiter DO;
|
||||
IF X.Key()=" " THEN weiter:=TRUE; END;
|
||||
END;
|
||||
weiter:=FALSE;
|
||||
LoescheBildschirm;
|
||||
abbruch:=FALSE; x1:=x1start; y1:=y1start;
|
||||
Anzahl:=0; xweiter1:=0; yweiter1:=1;
|
||||
x2:=x2start; y2:=y2start; xweiter2:=0; yweiter2:=1;
|
||||
imspiel1:=TRUE; imspiel2:=TRUE; Tempo1:=langsam; Tempo2:=langsam;
|
||||
Linie(links,rechts,unten,1);
|
||||
Linie(links,rechts,oben,1);
|
||||
FOR i:=unten TO oben DO;
|
||||
Linie(links,links,i,1);
|
||||
Linie(rechts,rechts,i,1);
|
||||
END;
|
||||
Signatur;
|
||||
Zwischenstand;
|
||||
Logo;
|
||||
WHILE ~abbruch DO;
|
||||
pause:=FALSE;
|
||||
key:=X.Key();
|
||||
IF key="a" THEN
|
||||
IF (xweiter1=-1) & (yweiter1=0) THEN xweiter1:=0;yweiter1:=-1;
|
||||
ELSIF (xweiter1=0) & (yweiter1=-1) THEN xweiter1:=1;yweiter1:=0;
|
||||
ELSIF (xweiter1=1) & (yweiter1=0) THEN xweiter1:=0;yweiter1:=1;
|
||||
ELSIF (xweiter1=0) & (yweiter1=1) THEN xweiter1:=-1;yweiter1:=0; END;
|
||||
END;
|
||||
IF key="s" THEN
|
||||
IF (xweiter1=-1) & (yweiter1=0) THEN xweiter1:=0;yweiter1:=1;
|
||||
ELSIF (xweiter1=0) & (yweiter1=1) THEN xweiter1:=1;yweiter1:=0;
|
||||
ELSIF (xweiter1=1) & (yweiter1=0) THEN xweiter1:=0;yweiter1:=-1;
|
||||
ELSIF (xweiter1=0) & (yweiter1=-1) THEN xweiter1:=-1;yweiter1:=0; END;
|
||||
END;
|
||||
IF key="d" THEN
|
||||
IF Tempo1=schnell THEN Tempo1:=langsam ELSE Tempo1 := schnell; END;
|
||||
END;
|
||||
IF key="4" THEN
|
||||
IF (xweiter2=-1) & (yweiter2=0) THEN xweiter2:=0;yweiter2:=-1;
|
||||
ELSIF (xweiter2=0) & (yweiter2=-1) THEN xweiter2:=1;yweiter2:=0;
|
||||
ELSIF (xweiter2=1) & (yweiter2=0) THEN xweiter2:=0;yweiter2:=1;
|
||||
ELSIF (xweiter2=0) & (yweiter2=1) THEN xweiter2:=-1;yweiter2:=0; END;
|
||||
END;
|
||||
IF key="5" THEN
|
||||
IF (xweiter2=-1) & (yweiter2=0) THEN xweiter2:=0;yweiter2:=1;
|
||||
ELSIF (xweiter2=0) & (yweiter2=1) THEN xweiter2:=1;yweiter2:=0;
|
||||
ELSIF (xweiter2=1) & (yweiter2=0) THEN xweiter2:=0;yweiter2:=-1;
|
||||
ELSIF (xweiter2=0) & (yweiter2=-1) THEN xweiter2:=-1;yweiter2:=0; END;
|
||||
END;
|
||||
IF key="6" THEN
|
||||
IF Tempo2=schnell THEN Tempo2:=langsam ELSE Tempo2 := schnell; END;
|
||||
END;
|
||||
IF (Anzahl MOD Tempo1) = 0 THEN Linie(x1,x1,y1,1); END;
|
||||
IF (Anzahl MOD Tempo2) = 0 THEN Linie(x2,x2,y2,1); END;
|
||||
IF (Anzahl MOD Tempo2) = 0 THEN INC(x2,xweiter2); INC(y2,yweiter2); END;
|
||||
IF (Anzahl MOD Tempo1) = 0 THEN INC(x1,xweiter1); INC(y1,yweiter1); END;
|
||||
IF (Anzahl MOD Tempo1) = 0 THEN
|
||||
IF X.IsDot(x1,y1) THEN
|
||||
abbruch:=TRUE;
|
||||
imspiel1:=FALSE;
|
||||
END;
|
||||
END;
|
||||
IF (Anzahl MOD Tempo2) = 0 THEN
|
||||
IF X.IsDot(x2,y2) THEN
|
||||
abbruch:=TRUE;
|
||||
imspiel2:=FALSE;
|
||||
END;
|
||||
END;
|
||||
IF Anzahl=8000 THEN Anzahl:=0; END;
|
||||
IF key="q" THEN abbruch:=TRUE;Ende:=TRUE; END;
|
||||
IF key="p" THEN
|
||||
WHILE ~pause DO;
|
||||
IF X.Key()=" " THEN pause:=TRUE; END;
|
||||
END;
|
||||
END;
|
||||
INC(Anzahl);
|
||||
END;
|
||||
IF ~imspiel1 THEN
|
||||
IF imspiel2 THEN INC(SiegeSpieler2); END;
|
||||
END;
|
||||
IF imspiel1 THEN
|
||||
IF ~imspiel2 THEN INC(SiegeSpieler1);
|
||||
END;
|
||||
END;
|
||||
IF Spieler1>Spieler2 THEN Runde:=Spieler1 ELSE Runde:=Spieler2;END;
|
||||
IF Ende THEN Runde:=Limit; END;
|
||||
Zwischenstand;
|
||||
END;
|
||||
END Tron;
|
||||
|
||||
BEGIN;
|
||||
Tron
|
||||
END Tron.
|
||||
17
src/test/x11/tron/makefile
Normal file
17
src/test/x11/tron/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) Tron.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 *.o
|
||||
rm *.h
|
||||
rm *.sym
|
||||
217
src/test/x11/vier/Ausgabe.Mod
Normal file
217
src/test/x11/vier/Ausgabe.Mod
Normal file
|
|
@ -0,0 +1,217 @@
|
|||
MODULE Ausgabe;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
IMPORT Out := Console, XYplane := oocXYplane;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
PROCEDURE RealFix*(x: REAL; n, m: INTEGER);
|
||||
|
||||
|
||||
VAR mul: LONGINT;
|
||||
|
||||
|
||||
BEGIN
|
||||
|
||||
|
||||
IF x < 0 THEN Out.Char("-"); x := -x END;
|
||||
|
||||
|
||||
IF m > 0 THEN
|
||||
|
||||
|
||||
mul := 1;
|
||||
|
||||
|
||||
REPEAT mul := mul*10; DEC(m) UNTIL m = 0;
|
||||
|
||||
|
||||
Out.Int(ENTIER(x+(0.5/mul)), n);
|
||||
|
||||
|
||||
Out.Char(".");
|
||||
|
||||
|
||||
IF ENTIER(mul*x+0.5) MOD mul = 0 THEN
|
||||
|
||||
|
||||
REPEAT mul := mul DIV 10; Out.Char("0") UNTIL mul = 1
|
||||
|
||||
|
||||
ELSE Out.Int(ENTIER(mul*x+0.5) MOD mul, 0)
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
ELSE Out.Int(ENTIER(x+0.5), n)
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
END RealFix;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
PROCEDURE Line*(X0, Y0, X1, Y1, mode: INTEGER);
|
||||
|
||||
|
||||
(* Draws a line from (X0, Y0) to (X1, Y1) inclusive. For all line points (x, y) the following holds
|
||||
|
||||
|
||||
always: (min(X0, X1) <= x) & (x <= max(X0, X1) & (min(Y0, Y0) <= y) & (y <= max(Y0, Y1). *)
|
||||
|
||||
|
||||
VAR x, y, dx, dy, d, inc, L, B, R, T, Xmin, Xmax, Ymin, Ymax: INTEGER;
|
||||
|
||||
|
||||
BEGIN
|
||||
|
||||
|
||||
L := XYplane.X; B := XYplane.Y; R := XYplane.X + XYplane.W; T := XYplane.Y + XYplane.H;
|
||||
|
||||
|
||||
IF X0 < X1 THEN Xmin := X0; Xmax := X1 ELSE Xmin := X1; Xmax := X0 END;
|
||||
|
||||
|
||||
IF Y0 < Y1 THEN Ymin := Y0; Ymax := Y1 ELSE Ymin := Y1; Ymax := Y0 END;
|
||||
|
||||
|
||||
IF (L <= Xmax) & (Xmin < R) & (B <= Ymax) & (Ymin < T) THEN (* line may be visible *)
|
||||
|
||||
|
||||
IF Xmin = Xmax THEN FOR y := Ymin TO Ymax DO XYplane.Dot(Xmin, y, mode) END
|
||||
|
||||
|
||||
ELSIF Ymin = Ymax THEN FOR x := Xmin TO Xmax DO XYplane.Dot(x, Ymin, mode) END
|
||||
|
||||
|
||||
ELSE
|
||||
|
||||
|
||||
IF (Y1-Y0) < (X0-X1) THEN x := X0; X0 := X1; X1 := x; y := Y0; Y0 := Y1; Y1 := y END;
|
||||
|
||||
|
||||
dx := 2*(X1-X0); dy := 2*(Y1-Y0); x := X0; y := Y0; inc := 1;
|
||||
|
||||
|
||||
IF (L <= Xmin) & (Xmax < R) & (B <= Ymin) & (Ymax < T) THEN (* no clipping *)
|
||||
|
||||
|
||||
IF dy > dx THEN d := dy DIV 2;
|
||||
|
||||
|
||||
IF dx < 0 THEN inc := -1; dx := -dx END;
|
||||
|
||||
|
||||
WHILE y <= Y1 DO
|
||||
|
||||
|
||||
XYplane.Dot(x, y, mode);
|
||||
|
||||
|
||||
INC(y); DEC(d, dx);
|
||||
|
||||
|
||||
IF d < 0 THEN INC(d, dy); INC(x, inc) END
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
ELSE d := dx DIV 2;
|
||||
|
||||
|
||||
IF dy < 0 THEN inc := -1; dy := -dy END;
|
||||
|
||||
|
||||
WHILE x <= X1 DO
|
||||
|
||||
|
||||
XYplane.Dot(x, y, mode);
|
||||
|
||||
|
||||
INC(x); DEC(d, dy);
|
||||
|
||||
|
||||
IF d < 0 THEN INC(d, dx); INC(y, inc) END
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
ELSE (* dot-wise clipping *)
|
||||
|
||||
|
||||
IF dy > dx THEN d := dy DIV 2;
|
||||
|
||||
|
||||
IF dx < 0 THEN inc := -1; dx := -dx END;
|
||||
|
||||
|
||||
WHILE y <= Y1 DO
|
||||
|
||||
|
||||
IF (L <= x) & (x < R) & (B <= y) & (y < T) THEN XYplane.Dot(x, y, mode) END;
|
||||
|
||||
|
||||
INC(y); DEC(d, dx);
|
||||
|
||||
|
||||
IF d < 0 THEN INC(d, dy); INC(x, inc) END
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
ELSE d := dx DIV 2;
|
||||
|
||||
|
||||
IF dy < 0 THEN inc := -1; dy := -dy END;
|
||||
|
||||
|
||||
WHILE x <= X1 DO
|
||||
|
||||
|
||||
IF (L <= x) & (x < R) & (B <= y) & (y < T) THEN XYplane.Dot(x, y, mode) END;
|
||||
|
||||
|
||||
INC(x); DEC(d, dy);
|
||||
|
||||
|
||||
IF d < 0 THEN INC(d, dx); INC(y, inc) END
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
END Line;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
END Ausgabe.
|
||||
26
src/test/x11/vier/Readme.md
Normal file
26
src/test/x11/vier/Readme.md
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
This is a game historycal source taken from http://web.archive.org/web/20050212180221/http://www.vis.inf.ethz.ch/~andy/Oberon.html
|
||||
|
||||
It serves as an example of XYplane module usage.
|
||||
|
||||
build by typing:
|
||||
|
||||
make
|
||||
|
||||
run by ./Vier <number>
|
||||
|
||||
Start Vier gewinnt with Vier.HitMe a~
|
||||
a Points to quit the program
|
||||
|
||||
During the game, the following keys are availiable:
|
||||
|
||||
Player One:
|
||||
q ... move left
|
||||
w ... move right
|
||||
a ... mark field
|
||||
Player Two:
|
||||
o ... move left
|
||||
p ... move right
|
||||
l ... mark field
|
||||
General keys:
|
||||
h ... abort
|
||||
|
||||
1207
src/test/x11/vier/Vier.Mod
Normal file
1207
src/test/x11/vier/Vier.Mod
Normal file
File diff suppressed because it is too large
Load diff
17
src/test/x11/vier/makefile
Normal file
17
src/test/x11/vier/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 Ausgabe.Mod Vier.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