From 5356b94f898af0f70222e72faba1feeb00c7b425 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Mon, 3 Feb 2014 18:12:15 +0400 Subject: [PATCH] added two more examples Tron and Vier --- src/test/X11/tron/Readme.md | 27 + src/test/X11/tron/Tron.Mod | 230 +++++++ src/test/X11/tron/makefile | 17 + src/test/X11/vier/Ausgabe.Mod | 217 ++++++ src/test/X11/vier/Readme.md | 26 + src/test/X11/vier/Vier.Mod | 1207 +++++++++++++++++++++++++++++++++ src/test/X11/vier/makefile | 17 + 7 files changed, 1741 insertions(+) create mode 100644 src/test/X11/tron/Readme.md create mode 100644 src/test/X11/tron/Tron.Mod create mode 100644 src/test/X11/tron/makefile create mode 100644 src/test/X11/vier/Ausgabe.Mod create mode 100644 src/test/X11/vier/Readme.md create mode 100644 src/test/X11/vier/Vier.Mod create mode 100644 src/test/X11/vier/makefile diff --git a/src/test/X11/tron/Readme.md b/src/test/X11/tron/Readme.md new file mode 100644 index 00000000..30253d7b --- /dev/null +++ b/src/test/X11/tron/Readme.md @@ -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 + +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 + diff --git a/src/test/X11/tron/Tron.Mod b/src/test/X11/tron/Tron.Mod new file mode 100644 index 00000000..e77cc412 --- /dev/null +++ b/src/test/X11/tron/Tron.Mod @@ -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 i10 THEN i:=10 END; +langsam:=1000 DIV i; +schnell:=600 DIV i; +weiter:=TRUE; +WHILE RundeSpieler2 THEN Runde:=Spieler1 ELSE Runde:=Spieler2;END; + IF Ende THEN Runde:=Limit; END; + Zwischenstand; + END; +END Tron; + +BEGIN; +Tron +END Tron. diff --git a/src/test/X11/tron/makefile b/src/test/X11/tron/makefile new file mode 100644 index 00000000..51682996 --- /dev/null +++ b/src/test/X11/tron/makefile @@ -0,0 +1,17 @@ +#for old systems like RHEL4 use +#CFLAGS=-L/usr/X11R6/lib -lX11 +CFLAGS=-lX11 +export CFLAGS + +VOC = $(SETPATH) /opt/voc/bin/voc + +all: + $(VOC) 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 diff --git a/src/test/X11/vier/Ausgabe.Mod b/src/test/X11/vier/Ausgabe.Mod new file mode 100644 index 00000000..d582565f --- /dev/null +++ b/src/test/X11/vier/Ausgabe.Mod @@ -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. diff --git a/src/test/X11/vier/Readme.md b/src/test/X11/vier/Readme.md new file mode 100644 index 00000000..04a14b0f --- /dev/null +++ b/src/test/X11/vier/Readme.md @@ -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 + +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 + diff --git a/src/test/X11/vier/Vier.Mod b/src/test/X11/vier/Vier.Mod new file mode 100644 index 00000000..4172efa3 --- /dev/null +++ b/src/test/X11/vier/Vier.Mod @@ -0,0 +1,1207 @@ +(* Copyright 1996 by Michael Klein aka duke *) + + +(* Tastaturbelegung: + + + Spiel starten: Vier.HitMe {maximale Punktzahl} ~ + + + + + + Spieler1: q.....Zeiger links + + + w....Zeiger rechts + + + a.....Kreuz setzen + + + + + + Spieler2: o.....Zeiger links + + + p.....Zeiger rechts + + + l.......Feld ausmalen + + + + + + nach jedem Durchgang muss wieder neu mit ..."SPACE"... gestartet werden, bis die eingegebene + + + Punktzahl von einem der beiden Spieler erreicht wird! + + + + + + unsanfter Abbruch mit ..."h"... *) + + + + + +(* Verbesserungsvorschlaege sind jederzeit herzlich willkommen: mklein@g26.ethz.ch + + bzw. kleinm@ezinfo.vmsmail.ethz.ch *) + + + + + +(* die 1-Player Version gegen die Maschine ist zur Zeit noch in Arbeit *) + + + + + + + + +MODULE Vier; + + + + + +IMPORT + + + X:=oocXYplane, A:=Ausgabe, In := compatIn, O:=Console; + + + + + +CONST + + + breite = 30; + + + square = 10; + + + slide = 240; + + + start = 60; + + + beg = 50; + + + m = 7; + + + n = 6; + + + + + +TYPE + + + Array = ARRAY 7,6 OF INTEGER; + + + + + +VAR + + + a : Array; + + + + + + +PROCEDURE Signature(x,y,breite, field:INTEGER); +(* Schriftzug "Vier gewinnt" *) + + + + +VAR + + + free,leer,h,k,char, space,high,s: INTEGER; + + + + + +BEGIN + + + char:=11; + + + high := 24; + + + space := 20; + + + s := 3; + + + leer:=char-2; + + + free:=(field*breite-space-leer*s) DIV char; + + + h:=y+high; + + + (* V *) + + + A.Line(x,h, x+(free DIV 2), y, 1); + + + x:=x+(free DIV 2); + + + A.Line(x,y, x+(free DIV 2),h,1); + + + x:=x+free+s; + + + (* I *) + + + A.Line(x, y, x, h,1); + + + x:=x+(free DIV 2)+s; + + + (* E *) + + + A.Line(x,y, x,h,1); + + + A.Line(x,y, x+free, y,1); + + + A.Line(x, h, x+free, y+high, 1); + + + A.Line(x,y+(high DIV 2), x+free, y+(high DIV 2),1); + + + x:=x+free+s; + + + (* R *) + + + A.Line(x, y, x, h, 1); + + + A.Line(x, h, x+free, h,1); + + + A.Line(x+free, h, x+free, y+(high DIV 2), 1); + + + A.Line(x+free, y+(high DIV 2), x, y+(high DIV 2),1 ); + + + A.Line(x, y+(high DIV 2), x+free, y, 1); + + + x:=x+free+s+space; + + + (* G *) + + + A.Line(x, y, x, h,1); + + + A.Line(x, h, x+free, h,1); + + + A.Line(x,y, x+free, y,1); + + + A.Line(x+free, y, x+free, y+(high DIV 2),1 ); + + + A.Line(x+free, y+(high DIV 2), x+(free DIV 2), y+(high DIV 2),1 ); + + + x:=x+free+s; + + + (* E *) + + + A.Line(x,y, x,h,1); + + + A.Line(x,y, x+free, y,1); + + + A.Line(x, h, x+free, y+high, 1); + + + A.Line(x,y+(high DIV 2), x+free, y+(high DIV 2),1); + + + x:=x+free+s; + + + (* W *) + + + k:=(free+12) DIV 4; + + + A.Line(x, h, x+k, y,1); + + + A.Line(x+k, y, x+2*k, y+(high DIV 2),1 ); + + + A.Line(x+2*k, y+(high DIV 2), x+3*k, y, 1); + + + A.Line(x+3*k, y, x+4*k, h,1); + + + x:=x+4*k+s; + + + (* I *) + + + A.Line(x, y, x, h,1); + + + x:=x+(free DIV 2)+s; + + + (* N *) + + + A.Line(x, y, x, h,1); + + + A.Line(x, h, x+free, y,1); + + + A.Line(x+free, y, x+free, h,1); + + + x:= x+free+s; + + + (* N *) + + + A.Line(x, y, x, h,1); + + + A.Line(x, h, x+free, y,1); + + + A.Line(x+free, y, x+free, h,1); + + + x:= x+free+s; + + + (* T *) + + + A.Line(x+(free DIV 2), y , x+(free DIV 2), h,1); + + + A.Line(x, h, x+free,h,1); + + + + + +END Signature; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE ArrayInit; + + + + + +VAR + + + i, j:INTEGER; + + + + + +BEGIN + + + FOR i:=0 TO m-1 BY 1 DO + + + FOR j:=0 TO n-1 BY 1 DO + + + a[i,j]:=0; + + + END; + + + END; + + +END ArrayInit; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE Spielfeld; + + + + + +VAR + + + i, j, h, b:INTEGER; + + + + + +BEGIN + + + b := m*breite+beg; + + + h := n*breite+beg; + + + FOR i:= beg TO b BY breite DO + + + A.Line(i, beg, i, h, 1); + + + END; + + + FOR j := beg TO h BY breite DO + + + A.Line(beg, j, b, j, 1); + + + END; + + +END Spielfeld; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE Cross(x, y:INTEGER); + + + + + +BEGIN + + + A.Line(x, y, x+breite, y+breite, 1); + + + A.Line(x, y+breite, x+breite, y,1); + + +END Cross; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE Fill(x,y:INTEGER); + + + + + +VAR + + + i : INTEGER; + + + + + +BEGIN + + + FOR i:=x TO x+breite BY 1 DO + + + A.Line(i, y, i, y+breite,1); + + + END; + + +END Fill; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE SetSquare(x,y:INTEGER); + + + + + +VAR + + + i : INTEGER; + + + + + +BEGIN + + + FOR i:=x TO x+square BY 1 DO + + + A.Line(i, y, i, y+square,1); + + + END; + + +END SetSquare; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE RemoveSquare(x,y:INTEGER); + + + + + +VAR + + + i : INTEGER; + + +BEGIN + + + FOR i:=x TO x+square BY 1 DO + + + A.Line(i, y, i, y+square,0); + + + END; + + +END RemoveSquare; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE FindField(x:INTEGER):INTEGER; + + + + + +VAR + + + h, fault : INTEGER; + + + + + +BEGIN + + + fault:=8; + + + h:=5; + + + WHILE h>=0 DO + + + IF a[x,h]#0 THEN + + + DEC(h); + + + ELSE RETURN h; + + + END; + + + END; + + + RETURN fault; + + +END FindField; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE Mi(x,y:INTEGER):INTEGER; + + + + + +BEGIN + + + IF x>y THEN + + + RETURN y; + + + ELSE + + + RETURN x; + + + END; + + +END Mi; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE Ma(x,y:INTEGER):INTEGER; + + + + + +BEGIN + + + IF x>y THEN + + + RETURN x; + + + ELSE + + + RETURN y; + + + END; + + +END Ma; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE EndPointR(VAR k,l:INTEGER); + + + + + +BEGIN + + + WHILE (k0) DO + + + INC(k); DEC(l); + + + END; + + +END EndPointR; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE IsTerminated(x,y,p:INTEGER):BOOLEAN; + + + + + +VAR + + + i,j,k,l,min,max:INTEGER; + + + term : BOOLEAN; + + + + + +BEGIN + + + term := FALSE; + + + min:=Mi(x,y); + + + max:=Ma(x,y); + + + (* horizontal *) + + + FOR i := 0 TO m-4 DO + + + IF (a[i,y]=p) & (a[i+1,y]=p) & (a[i+2,y]=p) & (a[i+3,y]=p) THEN + + + term := TRUE; + + + END; + + + END; + + + (* vertikal *) + + + FOR j := 0 TO n-4 DO + + + IF (a[x,j]=p) & (a[x,j+1]=p) & (a[x,j+2]=p) & (a[x,j+3]=p) THEN + + + term := TRUE; + + + END; + + + END; + + + (* links oben ---> rechts unten *) + + + k:=x-min; l:=y-min; + + + WHILE (k+3 links unten *) + + + k:=x; l:=y; + + + EndPointR(k,l); + + + WHILE (k-3 >= 0) & (l+3 < n) & (l >= 0) & (k <=m-1 ) DO + + + IF (a[k,l]=p) & (a[k-1,l+1]=p) & (a[k-2,l+2]=p) & (a[k-3,l+3]=p) THEN + + + term := TRUE; + + + END; + + + DEC(k); INC(l); + + + END; + + + RETURN term; + + +END IsTerminated; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE ChangePlayer(VAR player1, player2:BOOLEAN); + + + + + +BEGIN + + + IF player1 THEN + + + player1 := FALSE; + + + player2 := TRUE; + + + ELSE player1:= TRUE; + + + player2:= FALSE; + + + END; + + +END ChangePlayer; + + + + + +(* ------------------------------------------------------- *) + + + + + +PROCEDURE HitMe*; + + + + + +VAR + + + abbruch ,spieler1, spieler2, cross, fill: BOOLEAN; + + + key:CHAR; + + + sl, st,lauf,w,v, point1, point2,outof:INTEGER; + + + + + +BEGIN + + + In.Open; + + + In.Int(outof); + + + O.String("Vier gewinnt for Oberon V1.0 by Michael Klein aka duke..."); O.Ln; O.Ln; + + + O.String("Punktestand:"); O.Ln; O.Ln; + + + point1 := 0; point2 := 0; + + + spieler1 := TRUE; spieler2 := FALSE; + + + WHILE (point1=0) & (w<=5) THEN + + + Cross(st-10, (5-w)*breite+beg); + + + a[lauf,w]:=1; + + + cross:= TRUE; + + + abbruch:=IsTerminated(lauf,w,1); + + + END; + + + IF abbruch THEN + + + INC(point1); + + + END; + + + END; + + + IF (spieler2 & (key="l")) THEN + + + v:=FindField(lauf); + + + IF (v>=0) & (v<=5) THEN + + + Fill(st-10, (5-v)*breite+beg); + + + a[lauf,v]:=2; + + + fill := TRUE; + + + abbruch:=IsTerminated(lauf,v,2); + + + END; + + + IF abbruch THEN + + + INC(point2); + + + END; + + + END; + + + IF key="h" THEN + + + HALT(35); + + + END; + + + IF cross OR fill THEN + + + ChangePlayer(spieler1, spieler2); + + + END; + + + cross := FALSE; fill := FALSE; + + + END; + + + RemoveSquare(st,sl); + + + O.String("Spieler1: "); O.Int(point1,3); O.Ln; + + + O.String("Spieler2: "); O.Int(point2,3); O.Ln; O.Ln; + + + REPEAT + + + UNTIL X.Key() = " "; + + + END; + + +END HitMe; + + + + + +(* ------------------------------------------------------- *) + + + + + +BEGIN + + + X.Open; + + + (*O.Open;*) + HitMe + +END Vier. + + + + + + + + + + + + diff --git a/src/test/X11/vier/makefile b/src/test/X11/vier/makefile new file mode 100644 index 00000000..4f6ab8a5 --- /dev/null +++ b/src/test/X11/vier/makefile @@ -0,0 +1,17 @@ +#for old systems like RHEL4 use +#CFLAGS=-L/usr/X11R6/lib -lX11 +CFLAGS=-lX11 +export CFLAGS + +VOC = $(SETPATH) /opt/voc/bin/voc + +all: + $(VOC) -s 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