Исходные тексты апплетов на языке Oberon-2

 

Написаны Лыбой Алексеем   (Alex Lyba   2:5014/5.5@FidoNet)

Откомпилированы при помощи компилятора

JOB Compiler

   Ниже представлены исходные тексты некоторых апплетов на языке Oberon-2, откомпилированные при помощи компилятора JOB, написанного Свердловым С. З. 

    Автор будет признателен всем, кто пришлет свои пожелания или замечания по поводу работы программ. Замечания по поводу их текстов не принимаются.  : )

Апплеты:


 

Filler

(* Filler
   <applet code="filler_Game" width=420 height=420>
   </applet> *)
(* Copyright (C) Lyba Alexey 1998 *)
MODULE filler;
IMPORT
   awt:=javaawt,
   awc:=javaawtColor,
   app:=javaapplet,
   util:=javautil,
   lang:=javalang,
   SYSTEM;
CONST
   N1=41;
   N2=40;
   M1=26;
   M2=25;
TYPE
   ExtArray = ARRAY M1+2,N1+2 OF INTEGER;
   IntArray = ARRAY M2+2,N2+2 OF INTEGER;
   PGame*=POINTER TO Game;
   Game*=RECORD (app.Applet)
      g:awt.PGraphics;
      Ext,UserExt,CompExt:ExtArray;
      Int,UserInt,CompInt:IntArray;
      MouseX,MouseY:INTEGER;
      UserColor,OldUserColor:INTEGER;
      CompColor,OldCompColor:INTEGER;
      UsersPoints,CompsPoints:INTEGER;
      rand:util.PRandom;
      NewGame:awt.PButton;
      xpoints,ypoints:ARRAY 5 OF INTEGER;
   END;
PROCEDURE Rnd(r:util.PRandom; n:INTEGER):INTEGER;
BEGIN
   RETURN SHORT(ENTIER(n*r.nextFloat()));
END Rnd;
PROCEDURE CountUsersPoints(a:PGame);
VAR
   i,j:INTEGER;
   Cur:INTEGER;
BEGIN
   Cur:=0;
   FOR i:=1 TO M1-1 DO
      FOR j:=1 TO N1-1 DO
         IF a.UserExt[i][j]#0 THEN
            INC(Cur);
         END;
      END;
   END;
   FOR i:=1 TO M2-1 DO
      FOR j:=1 TO N2-1 DO
         IF a.UserInt[i][j]#0 THEN
            INC(Cur);
         END;
      END;
   END;
   a.UsersPoints:=Cur;
END CountUsersPoints;
PROCEDURE CountCompsPoints(a:PGame);
VAR
   i,j:INTEGER;
   Cur:INTEGER;
BEGIN
   Cur:=0;
   FOR i:=1 TO M1-1 DO
      FOR j:=1 TO N1-1 DO
         IF a.CompExt[i][j]#0 THEN
            INC(Cur);
         END;
      END;
   END;
   FOR i:=1 TO M2-1 DO
      FOR j:=1 TO N2-1 DO
         IF a.CompInt[i][j]#0 THEN
            INC(Cur);
         END;
      END;
   END;
   a.CompsPoints:=Cur;
END CountCompsPoints;
PROCEDURE Str( c : ARRAY OF CHAR ) : J.PString;
VAR
   s:J.PString;
   len:INTEGER;
BEGIN
   SYSTEM.NEW( s, c );
   len := s.length();
   IF (len>0) & (s.charAt(len-1)=0X) THEN
      RETURN s.substring(0,len-1);
   END;
   RETURN s;
END Str;
PROCEDURE Romb(a:PGame; g:awt.PGraphics; x,y,RombColor:INTEGER);
VAR
   RombCol,num:INTEGER;
BEGIN
   a.xpoints[1]:=x+5;
   a.xpoints[2]:=x+10;
   a.xpoints[3]:=x+5;
   a.xpoints[4]:=x;
   a.xpoints[0]:=x+5;
   a.ypoints[1]:=y;
   a.ypoints[2]:=y+6;
   a.ypoints[3]:=y+12;
   a.ypoints[4]:=y+6;
   a.ypoints[0]:=y;
   num:=5;
   CASE RombColor OF
      | 1: a.g.setColor(awc.blue);
      | 2: a.g.setColor(awc.green);
      | 3: a.g.setColor(awc.red);
      | 4: a.g.setColor(awc.yellow);
      | 5: a.g.setColor(awc.white);
      | 6: a.g.setColor(awc.magenta);
   ELSE
   END;
   a.g.fillPolygon(a.xpoints,a.ypoints,num);
   a.g.setColor(awc.darkGray);
   a.g.drawLine(x+5,y,x+10,y+6);
   a.g.drawLine(x+10,y+6,x+5,y+12);
   a.g.drawLine(x+5,y+12,x,y+6);
   a.g.drawLine(x,y+6,x+5,y);
END Romb;
PROCEDURE MouseButton(a:PGame; PosX:INTEGER);
BEGIN
   a.g.fillRect(PosX,335,20,25);
END MouseButton;
PROCEDURE (a:PGame) paint*(g:awt.PGraphics);
VAR
   i,j:INTEGER;
   I,J,K,L:lang.PInteger;
BEGIN
   FOR i:=1 TO M1-1 DO
      FOR j:=1 TO N1-1 DO
         Romb(a,g,10*j,12*i,a.Ext[i][j]);
      END;
      IF i#M1-1 THEN
         FOR j:=1 TO N2-1 DO
	    Romb(a,g,10*j+5,i*12+6,a.Int[i][j]);
         END;
      END;
   END;
   a.g.setColor(awc.black);
   a.g.fillRect(90,325,240,40);
   a.g.setColor(awc.gray);
   FOR i:=1 TO 6 DO
      a.g.drawRect(57+i*40,332,25,30);
   END;
   IF (a.UserColor#1) & (a.CompColor#1) THEN
      a.g.setColor(awc.blue);
      MouseButton(a,100);
   END;
   IF (a.UserColor#2) & (a.CompColor#2) THEN
      a.g.setColor(awc.green);
      MouseButton(a,140);
   END;
   IF (a.UserColor#3) & (a.CompColor#3) THEN
      a.g.setColor(awc.red);
      MouseButton(a,180);
   END;
   IF (a.UserColor#4) & (a.CompColor#4) THEN
      a.g.setColor(awc.yellow);
      MouseButton(a,220);
   END;
   IF (a.UserColor#5) & (a.CompColor#5) THEN
      a.g.setColor(awc.white);
      MouseButton(a,260);
   END;
   IF (a.UserColor#6) & (a.CompColor#6) THEN
      a.g.setColor(awc.magenta);
      MouseButton(a,300);
   END;
   CountCompsPoints(a);
   CountUsersPoints(a);
   SYSTEM.NEW(I,a.CompsPoints);
   SYSTEM.NEW(J,a.UsersPoints);
   IF (((a.CompsPoints/1936)*100 MOD 1)>0.5) THEN
      SYSTEM.NEW(K,SHORT(ENTIER((a.CompsPoints/1936)*100))+1);
   ELSE
      SYSTEM.NEW(K,SHORT(ENTIER((a.CompsPoints/1936)*100)));
   END;
   IF (((a.UsersPoints/1936)*100 MOD 1)>0.5) THEN
      SYSTEM.NEW(L,SHORT(ENTIER((a.UsersPoints/1936)*100))+1);
   ELSE
      SYSTEM.NEW(L,SHORT(ENTIER((a.UsersPoints/1936)*100)));
   END;
   a.g.setColor(awc.black);
   a.g.fillRect(35,345,45,40);
   a.g.fillRect(365,345,45,40);
   a.g.setColor(awc.white);
   a.g.drawString(Str("Computer"),22,340);
   a.g.drawString(I.toString(),38,360);
   a.g.drawString(K.toString(),38,380);
   a.g.drawString(Str("%"),54,380);
   a.g.drawString(Str("Player"),363,340);
   a.g.drawString(J.toString(),370,360);
   a.g.drawString(L.toString(),370,380);
   a.g.drawString(Str("%"),386,380);
END paint;
PROCEDURE UserMove(a:PGame);
VAR
   i,j,k:INTEGER;
BEGIN
   FOR k:=1 TO 20 DO
      FOR i:=1 TO M1 DO
         FOR j:=1 TO N1 DO
            IF (a.UserExt[i][j]#0) & (a.CompExt[i][j]=0) THEN
               a.Ext[i][j]:=a.UserColor;
            END;
         END;
      END;
      FOR i:=1 TO M2 DO
         FOR j:=1 TO N2 DO
            IF (a.UserInt[i][j]#0) & (a.CompInt[i][j]=0) THEN
               a.Int[i][j]:=a.UserColor;
            END;
         END;
      END;
      FOR i:=1 TO M1 DO
         FOR j:=1 TO N1 DO
            IF (a.UserExt[i][j]#0) & (a.CompExt[i][j]=0) THEN
               IF (a.Int[i][j-1]=a.UserColor) & (a.CompInt[i][j-1]=0) THEN
                  a.UserInt[i][j-1]:=a.UserColor;
               END;
               IF (a.Int[i][j]=a.UserColor) & (a.CompInt[i][j]=0) THEN
                  a.UserInt[i][j]:=a.UserColor;
               END;
               IF (a.Int[i-1][j-1]=a.UserColor) & (a.CompInt[i-1][j-1]=0) THEN
                  a.UserInt[i-1][j-1]:=a.UserColor;
               END;
               IF (a.Int[i-1][j]=a.UserColor) & (a.CompInt[i-1][j]=0) THEN
                  a.UserInt[i-1][j]:=a.UserColor;
               END;
            END;
         END;
      END;
      FOR i:=1 TO M2 DO
         FOR j:=1 TO N2 DO
            IF (a.UserInt[i][j]#0) & (a.CompInt[i][j]=0) THEN
               IF (a.Ext[i][j+1]=a.UserColor) & (a.CompExt[i][j+1]=0) THEN
                  a.UserExt[i][j+1]:=a.UserColor;
               END;
               IF (a.Ext[i][j]=a.UserColor) & (a.CompExt[i][j]=0) THEN
                  a.UserExt[i][j]:=a.UserColor;
               END;
               IF (a.Ext[i+1][j+1]=a.UserColor) & (a.CompExt[i+1][j+1]=0) THEN
                  a.UserExt[i+1][j+1]:=a.UserColor;
               END;
               IF (a.Ext[i+1][j]=a.UserColor) & (a.CompExt[i+1][j]=0) THEN
                  a.UserExt[i+1][j]:=a.UserColor;
               END;
            END;
         END;
      END;
   END;
END UserMove;
PROCEDURE GetCompColor(a:PGame);
TYPE
   PLocalGame = POINTER TO LocalGame;
   LocalGame = RECORD (app.Applet)
      Ext1,UserExt1,CompExt1:ExtArray;
      Int1,UserInt1,CompInt1:IntArray;
   END;
VAR
   a1:PLocalGame;
   i,j,k,L,Col,Max,Cur:INTEGER;
BEGIN
   NEW(a1);
   Max:=0;
   FOR L:=1 TO 6 DO
      FOR i:=0 TO M1+1 DO
         FOR j:=0 TO N1+1 DO
            a1.Ext1[i][j]:=a.Ext[i][j];
            a1.UserExt1[i][j]:=a.UserExt[i][j];
            a1.CompExt1[i][j]:=a.CompExt[i][j];
         END;
      END;
      FOR i:=0 TO M2+1 DO
         FOR j:=0 TO N2+1 DO
            a1.Int1[i][j]:=a.Int[i][j];
            a1.UserInt1[i][j]:=a.UserInt[i][j];
            a1.CompInt1[i][j]:=a.CompInt[i][j];
         END;
      END;
      Col:=L;
      Cur:=0;
      FOR k:=1 TO 20 DO
         FOR i:=0 TO M1+1 DO
            FOR j:=0 TO N1+1 DO
               IF (a1.CompExt1[i][j]#0) & (a1.UserExt1[i][j]=0) THEN
                  a1.Ext1[i][j]:=Col;
               END;
            END;
         END;
         FOR i:=0 TO M2+1 DO
            FOR j:=0 TO N2+1 DO
               IF (a1.CompInt1[i][j]#0) & (a1.UserInt1[i][j]=0) THEN
                  a1.Int1[i][j]:=Col;
               END;
            END;
         END;
         FOR i:=1 TO M1 DO
            FOR j:=1 TO N1 DO
               IF (a1.CompExt1[i][j]#0) & (a1.UserExt1[i][j]=0) THEN
                  IF (a1.Int1[i][j-1]=Col) & (a1.UserInt1[i][j-1]=0) THEN
                     a1.CompInt1[i][j-1]:=Col;
                     INC(Cur);
                  END;
                  IF (a1.Int1[i][j]=Col) & (a1.UserInt1[i][j]=0) THEN
                     a1.CompInt1[i][j]:=Col;
                     INC(Cur);
                  END;
                  IF (a1.Int1[i-1][j-1]=Col) & (a1.UserInt1[i-1][j-1]=0) THEN
                     a1.CompInt1[i-1][j-1]:=Col;
                     INC(Cur);
                  END;
                  IF (a1.Int1[i-1][j]=Col) & (a1.UserInt1[i-1][j]=0) THEN
                     a1.CompInt1[i-1][j]:=Col;
                     INC(Cur);
                  END;
               END;
            END;
         END;
         FOR i:=1 TO M2 DO
            FOR j:=1 TO N2 DO
               IF (a1.CompInt1[i][j]#0) & (a1.UserInt1[i][j]=0) THEN
                  IF (a1.Ext1[i][j+1]=Col) & (a1.UserExt1[i][j+1]=0) THEN
                     a1.CompExt1[i][j+1]:=Col;
                     INC(Cur);
                  END;
                  IF (a1.Ext1[i][j]=Col) & (a1.UserExt1[i][j]=0) THEN
                     a1.CompExt1[i][j]:=Col;
                     INC(Cur);
                  END;
                  IF (a1.Ext1[i+1][j+1]=Col) & (a1.UserExt1[i+1][j+1]=0) THEN
                     a1.CompExt1[i+1][j+1]:=Col;
                     INC(Cur);
                  END;
                  IF (a1.Ext1[i+1][j]=Col) & (a1.UserExt1[i+1][j]=0) THEN
                     a1.CompExt1[i+1][j]:=Col;
                     INC(Cur);
                  END;
               END;
            END;
         END;
      END;
      IF (Cur>Max) & (Col#a.OldCompColor) & (Col#a.UserColor) THEN
         Max:=Cur;
         a.CompColor:=Col;
      END;
   END;
END GetCompColor;
PROCEDURE CompMove(a:PGame);
VAR
   i,j,k:INTEGER;
BEGIN
   a.OldCompColor:=a.CompColor;
   GetCompColor(a);
   FOR k:=1 TO 20 DO
      FOR i:=1 TO M1 DO
         FOR j:=1 TO N1 DO
            IF (a.CompExt[i][j]#0) & (a.UserExt[i][j]=0) THEN
               a.Ext[i][j]:=a.CompColor;
            END;
         END;
      END;
      FOR i:=1 TO M2 DO
         FOR j:=1 TO N2 DO
            IF (a.CompInt[i][j]#0) & (a.UserInt[i][j]=0) THEN
               a.Int[i][j]:=a.CompColor;
            END;
         END;
      END;
      FOR i:=1 TO M1 DO
         FOR j:=1 TO N1 DO
            IF (a.CompExt[i][j]#0) & (a.UserExt[i][j]=0) THEN
               IF (a.Int[i][j-1]=a.CompColor) & (a.UserInt[i][j-1]=0) THEN
                  a.CompInt[i][j-1]:=a.CompColor;
               END;
               IF (a.Int[i][j]=a.CompColor) & (a.UserInt[i][j]=0) THEN
                  a.CompInt[i][j]:=a.CompColor;
               END;
               IF (a.Int[i-1][j-1]=a.CompColor) & (a.UserInt[i-1][j-1]=0) THEN
                  a.CompInt[i-1][j-1]:=a.CompColor;
               END;
               IF (a.Int[i-1][j]=a.CompColor) & (a.UserInt[i-1][j]=0) THEN
                  a.CompInt[i-1][j]:=a.CompColor;
               END;
            END;
         END;
      END;
      FOR i:=1 TO M2 DO
         FOR j:=1 TO N2 DO
            IF (a.CompInt[i][j]#0) & (a.UserInt[i][j]=0) THEN
               IF (a.Ext[i][j+1]=a.CompColor) & (a.UserExt[i][j+1]=0) THEN
                  a.CompExt[i][j+1]:=a.CompColor;
               END;
               IF (a.Ext[i][j]=a.CompColor) & (a.UserExt[i][j]=0) THEN
                  a.CompExt[i][j]:=a.CompColor;
               END;
               IF (a.Ext[i+1][j+1]=a.CompColor) & (a.UserExt[i+1][j+1]=0) THEN
                  a.CompExt[i+1][j+1]:=a.CompColor;
               END;
               IF (a.Ext[i+1][j]=a.CompColor) & (a.UserExt[i+1][j]=0) THEN
                  a.CompExt[i+1][j]:=a.CompColor;
               END;
            END;
         END;
      END;
   END;
END CompMove;
PROCEDURE (a:PGame) mouseDown*(evt:awt.PEvent; x,y:INTEGER):BOOLEAN;
BEGIN
   a.MouseX:=x;
   a.MouseY:=y;
   IF ((x>=100) & (x<=120)) OR ((x>=140) & (x<=160)) OR ((x>=180) & (x<=200)) OR
      ((x>=220) & (x<=240)) OR ((x>=260) & (x<=280)) OR ((x>=300) & (x<=320))
        & (y>=335) & (y<=360) THEN
      a.OldUserColor:=a.UserColor;
      IF (x>=100) & (x<=120) THEN
         a.UserColor:=1;
      END;
      IF (x>=140) & (x<=160) THEN
         a.UserColor:=2;
      END;
      IF (x>=180) & (x<=200) THEN
         a.UserColor:=3;
      END;
      IF (x>=220) & (x<=240) THEN
         a.UserColor:=4;
      END;
      IF (x>=260) & (x<=280) THEN
         a.UserColor:=5;
      END;
      IF (x>=300) & (x<=320) THEN
         a.UserColor:=6;
      END;
      IF (a.UserColor#a.CompColor) & (a.OldUserColor#a.UserColor) THEN
         UserMove(a);
         a.paint(a.g);
         CompMove(a);
         a.paint(a.g);
      END;
   END;
   RETURN TRUE;
END mouseDown;
PROCEDURE NewGame(a:PGame);
VAR
   i,j:INTEGER;
BEGIN
   FOR i:=1 TO M1 DO
      FOR j:=1 TO N1 DO
	 a.Ext[i][j]:=Rnd(a.rand,6)+1;
	 a.UserExt[i][j]:=0;
	 a.CompExt[i][j]:=0;
      END;
   END;
   FOR i:=1 TO M2 DO
      FOR j:=1 TO N2 DO
	 a.Int[i][j]:=Rnd(a.rand,6)+1;
	 a.UserInt[i][j]:=0;
	 a.CompInt[i][j]:=0;
      END;
   END;
   a.CompsPoints:=0;
   a.UsersPoints:=0;
   a.UserExt[1][N1-1]:=a.Ext[1][N1-1];
   a.CompExt[M1-1][1]:=a.Ext[M1-1][1];
   a.UserColor:=a.UserExt[1][N1-1];
   UserMove(a);
   a.CompColor:=a.CompExt[M1-1][1];
   CompMove(a);
   CountUsersPoints(a);
   CountCompsPoints(a);
   a.g:=a.getGraphics();
   a.paint(a.g);
END NewGame;
PROCEDURE (a:PGame) init*();
VAR
   I:awt.PComponent;
BEGIN
   NEW(a.rand);
   a.setLayout(NIL);
   SYSTEM.NEW(a.NewGame, Str("New Game"));
   a.NewGame.reshape(170,375,80,30);
   I:=a.add(a.NewGame);
   a.setBackground(awc.black);
   NewGame(a);
END init;
PROCEDURE (a:PGame) action*(Evt:awt.PEvent; obj:lang.PObject):BOOLEAN;
BEGIN
   IF (Evt.target IS awt.PButton) THEN
      IF (obj.equals(Str("New Game"))) THEN
	 NewGame(a);
      END;
      RETURN TRUE;
   END;
   RETURN FALSE;
END action;
END filler.

 

Voracity

(* Voracity
   <applet code="voracity_Game" width=328 height=380>
   </applet>
*)
(* Copyright (C) Lyba Alexey 1998 *)
MODULE voracity;
IMPORT
   awt:=javaawt,
   awc:=javaawtColor,
   app:=javaapplet,
   util:=javautil,
   lang:=javalang,
   SYSTEM;
CONST
   N=19;
TYPE
   tArray = ARRAY N+2,N+2 OF INTEGER;
     PGame*=POINTER TO Game;
   Game*=RECORD (app.Applet)
      g:awt.PGraphics;
      T:tArray;
      XPos,YPos:INTEGER;
      MouseX,MouseY:INTEGER;
      UsersPoints:INTEGER;
      rand:util.PRandom;
      NewGame:awt.PButton;
   END;
PROCEDURE Rnd(r:util.PRandom; n:INTEGER):INTEGER;
BEGIN
   RETURN SHORT(ENTIER(n*r.nextFloat()));
END Rnd;
PROCEDURE Str( c : ARRAY OF CHAR ) : J.PString;
VAR
   s:J.PString;
   len:INTEGER;
BEGIN
   SYSTEM.NEW( s, c );
   len := s.length();
   IF (len>0) & (s.charAt(len-1)=0X) THEN
      RETURN s.substring(0,len-1);
   END;
   RETURN s;
END Str;
PROCEDURE Item(a:PGame);
VAR
   X,Y:INTEGER;
BEGIN
   X:=8+15*a.XPos;
   Y:=8+15*a.YPos;
   a.g.setColor(awc.yellow);
   a.g.fillOval(X,Y,9,9);
   a.g.setColor(awc.red);
   a.g.drawOval(X,Y,9,9);
   a.g.fillOval(X+3,Y+3,3,3);
END Item;
PROCEDURE NullSquare(a:PGame; X1,Y1:INTEGER);
VAR
   X,Y:INTEGER;
BEGIN
   X:=6+15*X1;
   Y:=6+15*Y1;
   a.g.setColor(awc.lightGray);
   a.g.fillRect(X,Y,14,14);
END NullSquare;
PROCEDURE (a:PGame) paint*(g:awt.PGraphics);
VAR
   i,j:INTEGER;
   I:lang.PInteger;
BEGIN
   a.g.setColor(awc.gray);
   a.g.drawRect(20,20,285,285);
   FOR i:=1 TO N DO
      a.g.drawLine(5+i*15,20,5+i*15,305);
   END;
   FOR i:=1 TO N DO
      a.g.drawLine(20,5+i*15,305,5+i*15);
   END;
   FOR i:=1 TO N DO
      FOR j:=1 TO N DO
         NullSquare(a,i,j);
         IF (a.T[i][j]#0) THEN
            a.g.setColor(awc.black);
            SYSTEM.NEW(I,a.T[i][j]);
            a.g.drawString(I.toString(),10+15*i,17+15*j);
         END;
      END;
   END;
   a.g.setColor(awc.black);
   a.g.fillRect(275,345,40,30);
   a.g.fillRect(105,325,160,35);
   a.g.setColor(awc.yellow);
   a.g.drawString(Str("Score"),275,340);
   a.g.setColor(awc.white);
   a.g.drawString(Str("0"),281,357);
   Item(a);
END paint;
PROCEDURE CanMove(a:PGame; X,Y:INTEGER):BOOLEAN;
VAR
   i:INTEGER;
BEGIN
   IF (a.T[X][Y]=0) THEN
      RETURN FALSE;
   ELSE
      FOR i:=1 TO a.T[X][Y] DO
         IF (a.T[a.XPos-(a.XPos-X)*i][a.YPos-(a.YPos-Y)*i]=0) THEN
            RETURN FALSE;
         END;
      END;
   END;
   RETURN TRUE;
END CanMove;
PROCEDURE CheckToEnd(a:PGame);
VAR
   X,Y:INTEGER;
BEGIN
   X:=a.XPos;
   Y:=a.YPos;
   IF ~((CanMove(a,X-1,Y-1)) OR (CanMove(a,X,Y-1)) OR
        (CanMove(a,X+1,Y-1)) OR (CanMove(a,X-1,Y)) OR
        (CanMove(a,X+1,Y)) OR (CanMove(a,X-1,Y+1)) OR
        (CanMove(a,X,Y+1)) OR (CanMove(a,X+1,Y+1))) THEN
      a.g.setColor(awc.red);
      a.g.drawString(Str("GAME OVER"),155,340);
      a.g.setColor(awc.green);
      a.g.drawString(Str("YOU HAVE NO MORE MOVES"),113,357);
   END;
END CheckToEnd;
PROCEDURE (a:PGame) mouseDown*(evt:awt.PEvent; x,y:INTEGER):BOOLEAN;
VAR
   i,X1,Y1:INTEGER;
   I:lang.PInteger;
BEGIN
   a.MouseX:=(x-5) DIV 15;
   a.MouseY:=(y-5) DIV 15;
   IF (x>=20) & (x<=305) & (y>=20) & (y<=305) &
      (x>=a.XPos*15-10) & (x<=a.XPos*15+35) &
      (y>=a.YPos*15-10) & (y<=a.YPos*15+35) &
      ((a.MouseX#a.XPos) OR (a.MouseY#a.YPos)) &
      (CanMove(a,a.MouseX,a.MouseY)) THEN
      X1:=a.XPos;
      Y1:=a.YPos;
      FOR i:=1 TO a.T[a.MouseX][a.MouseY]  DO
         a.T[X1-(X1-a.MouseX)*i][Y1-(Y1-a.MouseY)*i]:=0;
         NullSquare(a,a.XPos,a.YPos);
         a.XPos:=X1-(X1-a.MouseX)*i;
         a.YPos:=Y1-(Y1-a.MouseY)*i;
      END;
      Item(a);
      a.UsersPoints:=a.UsersPoints+i-1;
      a.g.setColor(awc.black);
      a.g.fillRect(275,347,35,20);
      a.g.setColor(awc.white);
      SYSTEM.NEW(I,a.UsersPoints);
      a.g.drawString(I.toString(),281,357);
      CheckToEnd(a);
   END;
   RETURN TRUE;
END mouseDown;
PROCEDURE NewGame(a:PGame);
VAR
   i,j:INTEGER;
BEGIN
   FOR i:=0 TO N+1 DO
      FOR j:=0 TO N+1 DO
         a.T[i][j]:=0;
      END;
   END;
   FOR i:=1 TO N DO
      FOR j:=1 TO N DO
         a.T[i][j]:=Rnd(a.rand,9)+1;
      END;
   END;
   a.XPos:=Rnd(a.rand,19)+1;
   a.YPos:=Rnd(a.rand,19)+1;
   a.T[a.XPos][a.YPos]:=0;
   a.UsersPoints:=0;
   a.paint(a.g);
END NewGame;
PROCEDURE (a:PGame) init*();
VAR
   I:awt.PComponent;
BEGIN
   NEW(a.rand);
   a.setLayout(NIL);
   SYSTEM.NEW(a.NewGame, Str("New Game"));
   a.NewGame.reshape(20,330,80,30);
   I:=a.add(a.NewGame);
   a.setBackground(awc.black);
   a.g:=a.getGraphics();
   NewGame(a);
END init;
PROCEDURE (a:PGame) action*(Evt:awt.PEvent; obj:lang.PObject):BOOLEAN;
BEGIN
   IF (Evt.target IS awt.PButton) THEN
      IF (obj.equals(Str("New Game"))) THEN
          NewGame(a);
      END;
      RETURN TRUE;
   END;
   RETURN FALSE;
END action;
END voracity.

 

Сеть

(* Net
   <applet code="net_Game" width=351 height=400>
   </applet>
*)
(* Copyright (C) Lyba Alexey 1998 *)
MODULE net;
IMPORT
   awt:=javaawt,
   awc:=javaawtColor,
   app:=javaapplet,
   util:=javautil,
   lang:=javalang,
   SYSTEM;
CONST
   On=1;
   Off=2;
TYPE
   TArray = ARRAY 13,13 OF INTEGER;
   PGame*=POINTER TO Game;
   Game*=RECORD (app.Applet)
      g:awt.PGraphics;
      t,p:TArray;
      MouseX,MouseY:INTEGER;
      Level:INTEGER;
      SPos:INTEGER;
      rand:util.PRandom;
      NewGame,Plus,Minus:awt.PButton;
      Col,Back,Blink:awt.PColor;
      n,m,w:INTEGER;
   END;
PROCEDURE Rnd(r:util.PRandom; n:INTEGER):INTEGER;
BEGIN
   RETURN SHORT(ENTIER(n*r.nextFloat()));
END Rnd;
PROCEDURE Str( c : ARRAY OF CHAR ) : J.PString;
VAR
   s:J.PString;
   len:INTEGER;
BEGIN
   SYSTEM.NEW( s, c );
   len := s.length();
   IF (len>0) & (s.charAt(len-1)=0X) THEN
      RETURN s.substring(0,len-1);
   END;
   RETURN s;
END Str;
PROCEDURE CountTerm(a:PGame):INTEGER;
VAR
   i,j:INTEGER;
   Counter:INTEGER;
BEGIN
   Counter:=0;
   FOR i:=1 TO a.n DO
      FOR j:=1 TO a.n DO
         IF ((a.t[i,j]=11) OR (a.t[i,j]=12) OR
             (a.t[i,j]=13) OR (a.t[i,j]=14)) THEN
            INC(Counter);
         END;
      END;
   END;
   RETURN Counter;
END CountTerm;
PROCEDURE MakeNet(a:PGame);
VAR
   i,j,k:INTEGER;
   Elem:INTEGER;
   Seted:BOOLEAN;
BEGIN
   FOR i:=0 TO a.n+1 DO
      FOR j:=0 TO a.n+1 DO
         a.t[i,j]:=200;
      END;
   END;
   FOR i:=1 TO a.n DO
      FOR j:=1 TO a.n DO
         a.t[i,j]:=0;
      END;
   END;
   i:=Rnd(a.rand,10)+1;
   CASE i OF
      | 1: a.t[a.SPos+1,a.SPos]:=70;
      | 2: a.t[a.SPos,a.SPos+1]:=80;
      | 3: a.t[a.SPos-1,a.SPos]:=90;
      | 4: a.t[a.SPos,a.SPos-2]:=100;
      | 5: a.t[a.SPos,a.SPos+1]:=80;
           a.t[a.SPos,a.SPos-2]:=100;
      | 6: a.t[a.SPos+1,a.SPos]:=70;
           a.t[a.SPos-1,a.SPos]:=90;
      | 7: a.t[a.SPos+1,a.SPos]:=70;
           a.t[a.SPos,a.SPos+1]:=80;
           a.t[a.SPos-1,a.SPos]:=90;
      | 8: a.t[a.SPos,a.SPos+1]:=80;
           a.t[a.SPos-1,a.SPos]:=90;
           a.t[a.SPos,a.SPos-2]:=100;
      | 9: a.t[a.SPos-1,a.SPos]:=90;
           a.t[a.SPos,a.SPos-2]:=100;
           a.t[a.SPos+1,a.SPos]:=70;
     | 10: a.t[a.SPos,a.SPos-2]:=100;
           a.t[a.SPos+1,a.SPos]:=70;
           a.t[a.SPos,a.SPos+1]:=80;
   ELSE
   END;
   a.t[a.SPos,a.SPos]:=200+i;
   a.t[a.SPos,a.SPos-1]:=200+i;
   FOR k:=1 TO 3*a.n DO
   FOR i:=1 TO a.n DO
      FOR j:=1 TO a.n DO
         IF ((a.t[i,j]=70) OR (a.t[i,j]=80) OR
             (a.t[i,j]=90) OR (a.t[i,j]=100)) THEN
            CASE a.t[i,j] OF
            | 70:
                 Seted:=FALSE;
                 WHILE ~Seted DO
                    Elem:=Rnd(a.rand,7)+1;
                    CASE Elem OF
                    | 1: IF (a.t[i+1,j]=0) & (a.t[i,j+1]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=2;
                            a.t[i+1,j]:=70;
                            a.t[i,j+1]:=80;
                         END;
                    | 2: IF (a.t[i,j-1]=0) & (a.t[i,j+1]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=3;
                            a.t[i,j-1]:=100;
                            a.t[i,j+1]:=80;
                         END;
                    | 3: IF (a.t[i,j-1]=0) & (a.t[i+1,j]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=4;
                            a.t[i,j-1]:=100;
                            a.t[i+1,j]:=70;
                         END;
                    | 4: IF (a.t[i+1,j]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=6;
                            a.t[i+1,j]:=70;
                         END;
                    | 5: IF (a.t[i,j+1]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=8;
                            a.t[i,j+1]:=80;
                         END;
                    | 6: IF (a.t[i,j-1]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=9;
                            a.t[i,j-1]:=100;
                         END;
                    | 7:    Seted:=TRUE;
                            a.t[i,j]:=13;
                   END;
                END;
           | 80:
                   Seted:=FALSE;
                   WHILE ~Seted DO
                      Elem:=Rnd(a.rand,7)+1;
                      CASE Elem OF
                    | 1: IF (a.t[i+1,j]=0) & (a.t[i,j+1]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=1;
                            a.t[i+1,j]:=70;
                            a.t[i,j+1]:=80;
                         END;
                    | 2: IF (a.t[i,j+1]=0) & (a.t[i-1,j]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=3;
                            a.t[i-1,j]:=90;
                            a.t[i,j+1]:=80;
                         END;
                    | 3: IF (a.t[i-1,j]=0) & (a.t[i+1,j]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=4;
                            a.t[i-1,j]:=90;
                            a.t[i+1,j]:=70;
                         END;
                    | 4: IF (a.t[i,j+1]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=5;
                            a.t[i,j+1]:=80;
                         END;
                    | 5: IF (a.t[i-1,j]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=9;
                            a.t[i-1,j]:=90;
                         END;
                    | 6: IF (a.t[i+1,j]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=10;
                            a.t[i+1,j]:=70;
                         END;
                    | 7:    Seted:=TRUE;
                            a.t[i,j]:=14;
                      END;
                   END;
           | 90:   Seted:=FALSE;
                   WHILE ~Seted DO
                      Elem:=Rnd(a.rand,7)+1;
                      CASE Elem OF
                    | 1: IF (a.t[i,j-1]=0) & (a.t[i,j+1]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=1;
                            a.t[i,j-1]:=100;
                            a.t[i,j+1]:=80;
                         END;
                    | 2: IF (a.t[i-1,j]=0) & (a.t[i,j+1]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=2;
                            a.t[i-1,j]:=90;
                            a.t[i,j+1]:=80;
                         END;
                    | 3: IF (a.t[i,j-1]=0) & (a.t[i-1,j]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=4;
                            a.t[i,j-1]:=100;
                            a.t[i-1,j]:=90;
                         END;
                    | 4: IF (a.t[i-1,j]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=6;
                            a.t[i-1,j]:=90;
                         END;
                    | 5: IF (a.t[i,j+1]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=7;
                            a.t[i,j+1]:=80;
                         END;
                    | 6: IF (a.t[i,j-1]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=10;
                            a.t[i,j-1]:=100;
                         END;
                    | 7:    Seted:=TRUE;
                            a.t[i,j]:=11;
                      END;
                   END;
           | 100:  Seted:=FALSE;
                   WHILE ~Seted DO
                      Elem:=Rnd(a.rand,7)+1;
                      CASE Elem OF
                    | 1: IF (a.t[i+1,j]=0) & (a.t[i,j-1]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=1;
                            a.t[i+1,j]:=70;
                            a.t[i,j-1]:=100;
                         END;
                    | 2: IF (a.t[i+1,j]=0) & (a.t[i-1,j]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=2;
                            a.t[i+1,j]:=70;
                            a.t[i-1,j]:=90;
                         END;
                    | 3: IF (a.t[i,j-1]=0) & (a.t[i-1,j]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=3;
                            a.t[i,j-1]:=100;
                            a.t[i-1,j]:=90;
                         END;
                    | 4: IF (a.t[i,j-1]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=5;
                            a.t[i,j-1]:=100;
                         END;
                    | 5: IF (a.t[i+1,j]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=7;
                            a.t[i+1,j]:=70;
                         END;
                    | 6: IF (a.t[i-1,j]=0) THEN
                            Seted:=TRUE;
                            a.t[i,j]:=8;
                            a.t[i-1,j]:=90;
                         END;
                    | 7:    Seted:=TRUE;
                            a.t[i,j]:=12;
                      END;
                   END;
            END;
         END;
      END;
   END;
   END;
END MakeNet;
PROCEDURE RightBegin(a:PGame);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(186,174,5,5);
   a.g.setColor(a.Blink);
   a.g.drawLine(186,175,191,175);
END RightBegin;
PROCEDURE DownBegin(a:PGame);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(174,186,4,5);
   a.g.setColor(a.Blink);
   a.g.drawLine(175,186,175,190);
END DownBegin;
PROCEDURE LeftBegin(a:PGame);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(161,174,4,5);
   a.g.setColor(a.Blink);
   a.g.drawLine(161,175,164,175);
END LeftBegin;
PROCEDURE UpBegin(a:PGame);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(174,130,4,6);
   a.g.setColor(a.Blink);
   a.g.drawLine(175,130,175,136);
END UpBegin;
PROCEDURE Server(a:PGame; S:INTEGER);
BEGIN
   a.g.setColor(awc.lightGray);
   a.g.fillRect(169,136,16,49);
   a.g.setColor(awc.gray);
   a.g.drawLine(165,139,165,181);
   a.g.drawLine(166,138,166,182);
   a.g.drawLine(167,137,167,183);
   a.g.drawLine(168,136,168,184);
   a.g.drawRect(170,139,15,46);
   a.g.drawLine(172,159,183,159);
   a.g.drawLine(172,163,183,163);
   a.g.drawLine(175,169,180,169);
   a.g.drawLine(175,174,180,174);
   a.g.drawLine(175,179,180,179);
   a.g.drawLine(174,151,181,151);
   a.g.drawLine(180,152,180,152);
   a.g.drawLine(175,146,176,146);
   a.g.drawLine(182,146,182,146);
   a.g.drawRect(172,142,11,2);
   a.g.fillRect(175,166,6,2);
   a.g.fillRect(175,171,6,2);
   a.g.fillRect(175,176,6,2);
   a.g.setColor(awc.black);
   a.g.drawLine(173,146,173,146);
   IF (S=On) THEN
      a.g.setColor(awc.red);
      a.g.fillRect(172,166,2,2);
      a.g.setColor(awc.green);
      a.g.drawLine(179,146,179,146);
      a.g.fillRect(172,170,2,2);
   END;
   CASE a.t[a.SPos,a.SPos] OF
      | 201: RightBegin(a);
      | 202: DownBegin(a);;
      | 203: LeftBegin(a);
      | 204: UpBegin(a);
      | 205: UpBegin(a);
             DownBegin(a);
      | 206: RightBegin(a);
             LeftBegin(a);
      | 207: RightBegin(a);
             DownBegin(a);
             LeftBegin(a);
      | 208: DownBegin(a);
             LeftBegin(a);
             UpBegin(a);
      | 209: LeftBegin(a);
             UpBegin(a);
             RightBegin(a);
      | 210: UpBegin(a);
             RightBegin(a);
             DownBegin(a);
   ELSE
   END;
END Server;
PROCEDURE Comp(a:PGame; x,y,Switch:INTEGER);
VAR
   i,j:INTEGER;
BEGIN
   a.g.setColor(awc.black);
   a.g.drawRect(x+6,y+4,18,15);
   a.g.setColor(awc.white);
   a.g.drawRect(x+7,y+5,16,13);
   a.g.drawRect(x+8,y+6,14,11);
   a.g.setColor(awc.gray);
   a.g.drawRect(x+9,y+7,12,9);
   a.g.setColor(awc.white);
   a.g.drawLine(x+10,y+20,x+21,y+20);
   IF (Switch=Off) THEN
      a.g.setColor(awc.black);
      a.g.fillRect(x+10,y+8,11,8);
   ELSE
      a.g.setColor(awc.cyan);
      a.g.fillRect(x+10,y+8,11,8);
      a.g.setColor(awc.black);
      a.g.fillRect(x+16,y+8,3,7);
      a.g.drawLine(x+19,y+9,x+19,y+15);
      a.g.drawLine(x+15,y+9,x+15,y+15);
      a.g.drawLine(x+13,y+9,x+14,y+9);
      a.g.drawLine(x+13,y+15,x+13,y+15);
      a.g.drawLine(x+11,y+8,x+11,y+8);
      a.g.drawLine(x+11,y+14,x+11,y+14);
      a.g.setColor(awc.red);
      a.g.drawLine(x+11,y+10,x+11,y+10);
      a.g.drawLine(x+13,y+11,x+14,y+11);
      a.g.drawLine(x+16,y+9,x+16,y+10);
      a.g.setColor(awc.blue);
      a.g.drawLine(x+11,y+12,x+11,y+12);
      a.g.drawLine(x+13,y+13,x+14,y+13);
      a.g.drawLine(x+16,y+12,x+16,y+13);
      a.g.setColor(awc.green);
      a.g.drawLine(x+18,y+9,x+18,y+10);
      a.g.setColor(awc.yellow);
      a.g.drawLine(x+18,y+12,x+18,y+13);
   END;
   a.g.setColor(awc.black);
   a.g.drawLine(x+3,y+26,x+28,y+26);
   a.g.drawLine(x+3,y+26,x+3,y+23);
   a.g.drawLine(x+4,y+22,x+4,y+21);
   a.g.drawLine(x+4,y+21,x+27,y+21);
   a.g.drawLine(x+27,y+21,x+27,y+22);
   a.g.drawLine(x+28,y+23,x+28,y+26);
   a.g.setColor(awc.white);
   a.g.fillRect(x+5,y+22,22,4);
   a.g.setColor(awc.lightGray);
   FOR i:=1 TO 5 DO
      a.g.drawLine(x+4+4*i,y+22,x+4+4*i,y+22);
      a.g.drawLine(x+6+4*i,y+23,x+6+4*i,y+23);
      a.g.drawLine(x+4+4*i,y+24,x+4+4*i,y+24);
      a.g.drawLine(x+6+4*i,y+25,x+6+4*i,y+25);
   END;
   a.g.setColor(awc.gray);
   a.g.drawLine(x+27,y+25,x+27,y+23);
   a.g.drawLine(x+26,y+22,x+25,y+22);
   a.g.drawLine(x+23,y+22,x+21,y+22);
   a.g.drawLine(x+16,y+22,x+14,y+22);
   a.g.drawLine(x+9,y+22,x+7,y+22);
   a.g.drawLine(x+5,y+22,x+5,y+22);
   a.g.drawLine(x+4,y+23,x+4,y+25);
   a.g.drawLine(x+5,y+24,x+5,y+24);
   a.g.drawLine(x+6,y+25,x+6,y+25);
   a.g.drawLine(x+15,y+25,x+15,y+25);
   a.g.drawLine(x+17,y+25,x+17,y+25);
   a.g.drawLine(x+19,y+25,x+19,y+25);
   a.g.drawLine(x+16,y+24,x+19,y+24);
   a.g.drawLine(x+18,y+23,x+19,y+23);
   a.g.drawLine(x+21,y+25,x+23,y+25);
   a.g.drawLine(x+22,y+24,x+22,y+24);
END Comp;
PROCEDURE LeftComp(a:PGame; x,y,Switch:INTEGER);
BEGIN
   Comp(a,x,y,Switch);
   a.g.setColor(a.Col);
   a.g.fillRect(x+25,y+14,5,5);
   a.g.setColor(a.Blink);
   a.g.drawLine(x+25,y+15,x+30,y+15);
END LeftComp;
PROCEDURE UpComp(a:PGame; x,y,Switch:INTEGER);
BEGIN
   Comp(a,x,y,Switch);
   a.g.setColor(a.Col);
   a.g.fillRect(x+14,y+26,4,5);
   a.g.setColor(a.Blink);
   a.g.drawLine(x+15,y+26,x+15,y+30);
END UpComp;
PROCEDURE RightComp(a:PGame; x,y,Switch:INTEGER);
BEGIN
   Comp(a,x,y,Switch);
   a.g.setColor(a.Col);
   a.g.fillRect(x+1,y+14,5,5);
   a.g.setColor(a.Blink);
   a.g.drawLine(x+1,y+15,x+5,y+15);
END RightComp;
PROCEDURE DownComp(a:PGame; x,y,Switch:INTEGER);
BEGIN
   Comp(a,x,y,Switch);
   a.g.setColor(a.Col);
   a.g.fillRect(x+14,y,4,4);
   a.g.setColor(a.Blink);
   a.g.drawLine(x+15,y,x+15,y+4);
END DownComp;
PROCEDURE TLeft(a:PGame; x,y:INTEGER);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(a.w+x*30-6,a.w+y*30-19,4,30);
   a.g.fillRect(a.w+x*30-5,a.w+y*30-6,16,5);
   a.g.setColor(a.Blink);
   a.g.drawLine(a.w+x*30-5,a.w+y*30-19,a.w+x*30-5,a.w+y*30+10);
   a.g.drawLine(a.w+x*30-2,a.w+y*30-5,a.w+x*30+10,a.w+y*30-5);
END TLeft;
PROCEDURE TUp(a:PGame; x,y:INTEGER);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(a.w+x*30-19,a.w+y*30-6,30,5);
   a.g.fillRect(a.w+x*30-6,a.w+y*30-5,4,16);
   a.g.setColor(a.Blink);
   a.g.drawLine(a.w+x*30-19,a.w+y*30-5,a.w+x*30+10,a.w+y*30-5);
   a.g.drawLine(a.w+x*30-5,a.w+y*30-1,a.w+x*30-5,a.w+y*30+10);
END TUp;
PROCEDURE TRight(a:PGame; x,y:INTEGER);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(a.w+x*30-6,a.w+y*30-19,4,30);
   a.g.fillRect(a.w+x*30-19,a.w+y*30-6,15,5);
   a.g.setColor(a.Blink);
   a.g.drawLine(a.w+x*30-5,a.w+y*30-19,a.w+x*30-5,a.w+y*30+10);
   a.g.drawLine(a.w+x*30-19,a.w+y*30-5,a.w+x*30-8,a.w+y*30-5);
END TRight;
PROCEDURE TDown(a:PGame; x,y:INTEGER);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(a.w+x*30-19,a.w+y*30-6,30,5);
   a.g.fillRect(a.w+x*30-6,a.w+y*30-19,4,16);
   a.g.setColor(a.Blink);
   a.g.drawLine(a.w+x*30-19,a.w+y*30-5,a.w+x*30+10,a.w+y*30-5);
   a.g.drawLine(a.w+x*30-5,a.w+y*30-19,a.w+x*30-5,a.w+y*30-7);
END TDown;
PROCEDURE IUp(a:PGame; x,y:INTEGER);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(a.w+x*30-6,a.w+y*30-19,4,30);
   a.g.setColor(a.Blink);
   a.g.drawLine(a.w+x*30-5,a.w+y*30-19,a.w+x*30-5,a.w+y*30+10);
END IUp;
PROCEDURE IDown(a:PGame; x,y:INTEGER);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(a.w+x*30-19,a.w+y*30-6,30,5);
   a.g.setColor(a.Blink);
   a.g.drawLine(a.w+x*30-19,a.w+y*30-5,a.w+x*30+10,a.w+y*30-5);
END IDown;
PROCEDURE LLeft(a:PGame; x,y:INTEGER);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(a.w+x*30-6,a.w+y*30-5,4,16);
   a.g.fillRect(a.w+x*30-5,a.w+y*30-6,16,5);
   a.g.setColor(a.Blink);
   a.g.drawLine(a.w+x*30-5,a.w+y*30-4,a.w+x*30-5,a.w+y*30+10);
   a.g.drawLine(a.w+x*30-4,a.w+y*30-5,a.w+x*30+10,a.w+y*30-5);
END LLeft;
PROCEDURE LUp(a:PGame; x,y:INTEGER);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(a.w+x*30-19,a.w+y*30-6,16,5);
   a.g.fillRect(a.w+x*30-6,a.w+y*30-5,4,16);
   a.g.setColor(a.Blink);
   a.g.drawLine(a.w+x*30-19,a.w+y*30-5,a.w+x*30-6,a.w+y*30-5);
   a.g.drawLine(a.w+x*30-5,a.w+y*30-4,a.w+x*30-5,a.w+y*30+10);
END LUp;
PROCEDURE LRight(a:PGame; x,y:INTEGER);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(a.w+x*30-6,a.w+y*30-19,4,17);
   a.g.fillRect(a.w+x*30-19,a.w+y*30-6,16,5);
   a.g.setColor(a.Blink);
   a.g.drawLine(a.w+x*30-5,a.w+y*30-19,a.w+x*30-5,a.w+y*30-6);
   a.g.drawLine(a.w+x*30-19,a.w+y*30-5,a.w+x*30-6,a.w+y*30-5);
END LRight;
PROCEDURE LDown(a:PGame; x,y:INTEGER);
BEGIN
   a.g.setColor(a.Col);
   a.g.fillRect(a.w+x*30-5,a.w+y*30-6,16,5);
   a.g.fillRect(a.w+x*30-6,a.w+y*30-19,4,17);
   a.g.setColor(a.Blink);
   a.g.drawLine(a.w+x*30-4,a.w+y*30-5,a.w+x*30+10,a.w+y*30-5);
   a.g.drawLine(a.w+x*30-5,a.w+y*30-19,a.w+x*30-5,a.w+y*30-6);
END LDown;
PROCEDURE Field(a:PGame; x,y:INTEGER);
CONST
   k=19;
   l=9;
BEGIN
   a.g.setColor(a.Back);
   a.g.fillRect(a.w+x*30-k,a.w+y*30-k,30,30);
   a.g.setColor(awc.white);
   a.g.drawLine(a.w+x*30-k,a.w+y*30-k,a.w+x*30-k,a.w+y*30+l);
   a.g.drawLine(a.w+x*30-k,a.w+y*30-k,a.w+x*30+l,a.w+y*30-k);
   a.g.setColor(awc.black);
   a.g.drawLine(a.w+x*30+l+1,a.w+y*30-k+1,a.w+x*30+l+1,a.w+y*30+l);
   a.g.drawLine(a.w+x*30-k+1,a.w+y*30+l+1,a.w+x*30+l,a.w+y*30+l+1);
END Field;
PROCEDURE ShowElement(a:PGame; i,j,S:INTEGER);
BEGIN
   Field(a,i,j);
   IF (i=a.SPos) & (j=a.SPos) THEN
      Field(a,a.SPos,a.SPos-1);
      Server(a,S);
   ELSIF (i=a.SPos) & (j=a.SPos-1) THEN
      Field(a,a.SPos,a.SPos);
      Server(a,S);
   END;
   CASE a.t[i,j] OF
      | 1: TLeft(a,i,j);
      | 2: TUp(a,i,j);
      | 3: TRight(a,i,j);
      | 4: TDown(a,i,j);
      | 5: IUp(a,i,j);
      | 6: IDown(a,i,j);
      | 7: LLeft(a,i,j);
      | 8: LUp(a,i,j);
      | 9: LRight(a,i,j);
     | 10: LDown(a,i,j);
     | 11: LeftComp(a,a.w+i*30-20,a.w+j*30-20,S);
     | 12: UpComp(a,a.w+i*30-20,a.w+j*30-20,S);
     | 13: RightComp(a,a.w+i*30-20,a.w+j*30-20,S);
     | 14: DownComp(a,a.w+i*30-20,a.w+j*30-20,S);
   ELSE
   END;
END ShowElement;
PROCEDURE ShowNet(a:PGame; S:INTEGER);
VAR
   i,j:INTEGER;
BEGIN
   FOR i:=1 TO a.n DO
      FOR j:=1 TO a.n DO
         ShowElement(a,i,j,S);
      END;
   END;
END ShowNet;
PROCEDURE Empty(a:PGame):BOOLEAN;
VAR
   i,j:INTEGER;
   Emp:BOOLEAN;
BEGIN
   Emp:=FALSE;
   FOR i:=1 TO a.n DO
      FOR j:=1 TO a.n DO
         IF ((a.t[i,j]=70) OR (a.t[i,j]=80) OR
             (a.t[i,j]=90) OR (a.t[i,j]=100)) THEN
            RETURN TRUE;
         END;
      END;
   END;
   RETURN Emp;
END Empty;
PROCEDURE Rotate(a:PGame; x,y:INTEGER);
BEGIN
   IF (x=a.SPos) & (y=a.SPos-1) THEN
      y:=a.SPos;
   END;
   IF (a.t[x,y]#0) & (a.t[x,y]#20) THEN
      a.t[x,y]:=a.t[x,y]+1;
      CASE a.t[x,y] OF
         | 5: a.t[x,y]:=1;
         | 7: a.t[x,y]:=5;
         | 11: a.t[x,y]:=7;
         | 15: a.t[x,y]:=11;
         | 205: a.t[a.SPos,a.SPos]:=201;
         | 207: a.t[a.SPos,a.SPos]:=205;
         | 211: a.t[a.SPos,a.SPos]:=207;
      ELSE
      END;
   END;
END Rotate;
PROCEDURE Change(a:PGame);
VAR
   i,j,Move,k:INTEGER;
BEGIN
   FOR i:=1 TO a.n DO
      FOR j:=1 TO a.n DO
         IF (a.t[i,j]#20) THEN
            Move:=Rnd(a.rand,4)+1;
            FOR k:=1 TO Move DO
               Rotate(a,i,j);
            END;
         END;
      END;
   END;
END Change;
PROCEDURE ArrayEqu(a:PGame):BOOLEAN;
VAR
   i,j:INTEGER;
BEGIN
   FOR i:=1 TO a.n DO
      FOR j:=1 TO a.n DO
         IF (a.t[i,j]#a.p[i,j]) THEN
            RETURN FALSE;
         END;
      END;
   END;
   RETURN TRUE;
END ArrayEqu;
PROCEDURE (a:PGame) paint*(g:awt.PGraphics);
VAR
   I:lang.PInteger;
BEGIN
   IF (ArrayEqu(a)) THEN
         ShowNet(a,On);
   ELSE
      ShowNet(a,Off);
   END;
   a.g.setColor(awc.yellow);
   a.g.drawString(Str("LEVEL"),239,366);
   a.g.setColor(awc.black);
   a.g.fillRect(245,375,20,15);
   a.g.setColor(awc.white);
   SYSTEM.NEW(I,a.Level);
   a.g.drawString(I.toString(),252,385);
END paint;
PROCEDURE BeginGame(a:PGame);
BEGIN
   a.w:=15*(11-a.n);
   CASE a.n OF
      | 5: a.SPos:=3;
           a.m:=6;
      | 7: a.SPos:=4;
           a.m:=12;
      | 9: a.SPos:=5;
           a.m:=21;
     | 11: a.SPos:=6;
           a.m:=30;
   ELSE
   END;
   REPEAT
      MakeNet(a);
   UNTIL (~Empty(a) & (CountTerm(a)>=a.m));
   a.p:=a.t;
   Change(a);
   a.paint(a.g);
END BeginGame;
PROCEDURE (a:PGame) init*();
VAR
   i,j:INTEGER;
   I:awt.PComponent;
BEGIN
   NEW(a.rand);
   a.n:=11;
   a.Level:=4;
   a.setLayout(NIL);
   SYSTEM.NEW(a.NewGame, Str("New Game"));
   a.NewGame.reshape(30,357,80,30);
   I:=a.add(a.NewGame);
   SYSTEM.NEW(a.Plus, Str("+"));
   a.Plus.reshape(190,357,30,30);
   I:=a.add(a.Plus);
   SYSTEM.NEW(a.Minus, Str("--"));
   a.Minus.reshape(290,357,30,30);
   I:=a.add(a.Minus);
   a.setBackground(awc.black);
   SYSTEM.NEW(a.Back,LONG(120),LONG(180),LONG(30));
   a.Col:=awc.black;
   a.Blink:=awc.lightGray;
   a.g:=a.getGraphics();
   BeginGame(a);
END init;
PROCEDURE (a:PGame) mouseDown*(evt:awt.PEvent; x,y:INTEGER):BOOLEAN;
BEGIN
   IF (x>10+a.w) & (x<340-a.w) & (y>10+a.w) & (y<340-a.w) & ~(ArrayEqu(a)) THEN
      a.MouseX:=((x-a.w)+19) DIV 30;
      a.MouseY:=((y-a.w)+19) DIV 30;
      Rotate(a,a.MouseX,a.MouseY);
      ShowElement(a,a.MouseX,a.MouseY,Off);
      IF (ArrayEqu(a)) THEN
         ShowNet(a,On);
      END;
   END;
   RETURN TRUE;
END mouseDown;
PROCEDURE (a:PGame) action*(Evt:awt.PEvent; obj:lang.PObject):BOOLEAN;
VAR
   I:lang.PInteger;
BEGIN
   IF (Evt.target IS awt.PButton) THEN
      IF (obj.equals(Str("New Game"))) THEN
          BeginGame(a);
      ELSIF (obj.equals(Str("+"))) THEN
          IF (a.n#11) THEN
             a.n:=a.n+2;
             a.Level:=a.Level+1;
             a.g.setColor(awc.black);
             a.g.fillRect(245,375,20,15);
             a.g.setColor(awc.white);
             SYSTEM.NEW(I,a.Level);
             a.g.drawString(I.toString(),252,385);
             BeginGame(a);
          END;
      ELSIF (obj.equals(Str("--"))) THEN
          IF (a.n#5) THEN
             a.g.setColor(awc.black);
             a.g.fillRect(a.w+9,a.w+9,30*a.n+3,30*a.n+3);
             a.Level:=a.Level-1;
             a.g.setColor(awc.black);
             a.g.fillRect(245,375,20,15);
             a.g.setColor(awc.white);
             SYSTEM.NEW(I,a.Level);
             a.g.drawString(I.toString(),252,385);
             a.n:=a.n-2;
             BeginGame(a);
          END;
      END;
      RETURN TRUE;
   END;
   RETURN FALSE;
END action;
END net.