mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-05 23:22:25 +00:00
added PacMan demo
This commit is contained in:
parent
c1f0081478
commit
9fb89d2a14
5 changed files with 1007 additions and 0 deletions
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.
|
||||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue