added two more examples Tron and Vier

This commit is contained in:
Norayr Chilingarian 2014-02-03 18:12:15 +04:00
parent fd8a8cac54
commit 5356b94f89
7 changed files with 1741 additions and 0 deletions

View 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
View 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.

View 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

View 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.

View 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

File diff suppressed because it is too large Load diff

View 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