今天摸了一天的鱼,在计算器上写了一个小游戏.
EXPORT ZM0;
Flush() BEGIN
BLIT_P(G0,G9);
END;
ClrG() BEGIN
RECT_P(G9,130,5,246,121,0,3);
LINE_P(G9,159,5,159,121,0);
LINE_P(G9,188,5,188,121,0);
LINE_P(G9,217,5,217,121,0);
LINE_P(G9,130,34,246,34,0);
LINE_P(G9,130,63,246,63,0);
LINE_P(G9,130,92,246,92,0);
RECT_P(G9,31,51,89,64,3,3);
RECT_P(G9,31,81,89,94,3,3);
END;
DMain() BEGIN
DIMGROB_P(G9,256,127);
ClrG();
RECT_P(G9,30,35,90,95,0,3);
RECT_P(G9,30,35,90,50,0,0);
RECT_P(G9,30,65,90,80,0,0);
RECT_P(G9,19,105,38,115,1,1);
TEXTOUT_P("F6",G9,24,105,1,3);
TEXTOUT_P("Save & Exit",
G9,43,105,1
);
TEXTOUT_P("2048",G9,43,18,2,0);
TEXTOUT_P("SCORE",G9,43,37,1,3);
TEXTOUT_P("STEP",G9,48,67,1,3);
END;
DBlk(X,Y,N) BEGIN
LOCAL Bc,Fc,Fx;
IFTE(N<64,0,IFTE(N<1024,1,2))►Bc;
IFTE(N<1024,3,0)►Fc;
101+29X►X;
-24+29Y►Y;
IFTE(N<10,11,
IFTE(N<100,7,
IFTE(N<1000,6,
IFTE(N<10000,3,1)
)
)
)►Fx; RECT_P(G9,X+1,Y+1,X+28,Y+28,3,Bc);
TEXTOUT_P(N,G9,X+Fx,
Y+IFTE(N<100,7,9),
IFTE(N<100,2,1),Fc,26);
END;
PrB() BEGIN
LOCAL E,P,L,X,Y;
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4}►L;
0►P;
0►E;
REPEAT
FOR X FROM 1 TO 4 DO
FOR Y FROM 1 TO 4 DO
IF ZM0(X,Y)==0 THEN
E+1►E;
IF RANDOM(0,13)≤E THEN
L(CEILING(
RANDOM(1,SIZE(L))
))►ZM0(X,Y);
1►P;
BREAK;
END;
END;
END;
IF P THEN BREAK; END;
END;
UNTIL P OR E==0;
END;
MInit() BEGIN
IFERR ZM0(5,4) THEN
MAKEMAT(0,5,4)►ZM0;
PrB(); PrB();
ELSE
IF ZM0(5,3)==0 THEN
MAKEMAT(0,5,4)►ZM0;
PrB(); PrB();
END;
END;
0►ZM0(5,3);
END;
CheckM() BEGIN
LOCAL X,Y,M;
IF ZM0(4,4)==0 THEN
RETURN 1;
END;
FOR X FROM 1 TO 4 DO
FOR Y FROM 1 TO 3 DO
IF ZM0(X,Y)==0
OR ZM0(X,Y)==ZM0(X,Y+1)
THEN
1►M;
BREAK 2;
END;
END;
END;
IF M THEN
RETURN M;
END;
FOR Y FROM 1 TO 4 DO
FOR X FROM 1 TO 3 DO
IF ZM0(X,Y)==0
OR ZM0(X,Y)==ZM0(X+1,Y)
THEN
1►M;
BREAK 2;
END;
END;
END;
RETURN M;
END;
ShowDie() BEGIN
INVERT_P(G9);
RECT_P(G9,82,47,172,77,2,2);
RECT_P(G9,80,45,170,75,0,3);
TEXTOUT_P("GAME OVER",
G9,86,53,2
);
END;
DrawM() BEGIN
ClrG();
LOCAL X,Y;
FOR X FROM 1 TO 4 DO
FOR Y FROM 1 TO 4 DO
ABS(ZM0(X,Y))►ZM0(X,Y);
IF ZM0(X,Y)≠0 THEN
DBlk(X,Y,ZM0(X,Y));
END;
END;
END;
TEXTOUT_P(ZM0(5,1),G9,34,52,1,0);
TEXTOUT_P(ZM0(5,2),G9,34,82,1,0);
END;
AdU() BEGIN
LOCAL M,X,Y,T;
1►Y;
REPEAT Y+1►Y;
FOR X FROM 1 TO 4 DO
IF ZM0(X,Y)==0 THEN
CONTINUE;
END;
FOR T FROM 0 TO Y-2 DO
IF ZM0(X,Y-T-1)==0 THEN
ZM0(X,Y-T)►ZM0(X,Y-T-1);
0►ZM0(X,Y-T);
M+1►M;
CONTINUE;
END;
IF ZM0(X,Y-T-1)>0
AND ZM0(X,Y-T)==ZM0(X,Y-T-1)
THEN
-2*ZM0(X,Y-T)►ZM0(X,Y-T-1);
0►ZM0(X,Y-T);
-ZM0(X,Y-T-1)
+ZM0(5,1)►ZM0(5,1);
M+1►M;
END;
END;
END;
UNTIL Y==4;
RETURN M;
END;
AdD() BEGIN
LOCAL M,X,Y,T;
4►Y;
REPEAT Y-1►Y;
FOR X FROM 1 TO 4 DO
IF ZM0(X,Y)==0 THEN
CONTINUE;
END;
FOR T FROM Y TO 3 DO
IF ZM0(X,T+1)==0 THEN
ZM0(X,T)►ZM0(X,T+1);
0►ZM0(X,T);
M+1►M;
CONTINUE;
END;
IF ZM0(X,T+1)>0
AND ZM0(X,T)==ZM0(X,T+1)
THEN
-2*ZM0(X,T)►ZM0(X,T+1);
0►ZM0(X,T);
-ZM0(X,T+1)
+ZM0(5,1)►ZM0(5,1);
M+1►M;
END;
END;
END;
UNTIL Y==1;
RETURN M;
END;
AdL() BEGIN
LOCAL M,X,Y,T;
1►X;
REPEAT X+1►X;
FOR Y FROM 1 TO 4 DO
IF ZM0(X,Y)==0 THEN
CONTINUE;
END;
FOR T FROM 0 TO X-2 DO
IF ZM0(X-T-1,Y)==0 THEN
ZM0(X-T,Y)►ZM0(X-T-1,Y);
0►ZM0(X-T,Y);
M+1►M;
CONTINUE;
END;
IF ZM0(X-T-1,Y)>0
AND ZM0(X-T,Y)==ZM0(X-T-1,Y)
THEN
-2*ZM0(X-T,Y)►ZM0(X-T-1,Y);
0►ZM0(X-T,Y);
-ZM0(X-T-1,Y)
+ZM0(5,1)►ZM0(5,1);
M+1►M;
END;
END;
END;
UNTIL X==4;
RETURN M;
END;
AdR() BEGIN
LOCAL M,X,Y,T;
4►X;
REPEAT X-1►X;
FOR Y FROM 1 TO 4 DO
IF ZM0(X,Y)==0 THEN
CONTINUE;
END;
FOR T FROM X TO 3 DO
IF ZM0(T+1,Y)==0 THEN
ZM0(T,Y)►ZM0(T+1,Y);
0►ZM0(T,Y);
M+1►M;
CONTINUE;
END;
IF ZM0(T+1,Y)>0
AND ZM0(T,Y)==ZM0(T+1,Y)
THEN
-2*ZM0(T,Y)►ZM0(T+1,Y);
0►ZM0(T,Y);
-ZM0(T+1,Y)
+ZM0(5,1)►ZM0(5,1);
M+1►M;
END;
END;
END;
UNTIL X==1;
RETURN M;
END;
WaitK() BEGIN
LOCAL R,P,Ap;
{9,10,14,15,5}►Ap;
REPEAT
POS(Ap,GETKEY())►P;
IF NOT P THEN
CONTINUE;
ELSE IF P==1 THEN
AdU()►R;
ELSE IF P==2 THEN
AdR()►R;
ELSE IF P==3 THEN
AdL()►R;
ELSE IF P==4 THEN
AdD()►R;
ELSE IF P==5 THEN
1►ZM0(5,3);
BREAK;
END;END;END;END;END;END;
IF R>0 THEN
ZM0(5,2)+1►ZM0(5,2);
DrawM();
Flush();
WAIT(0.1);
PrB();
DrawM();
Flush();
IF NOT CheckM() THEN
ShowDie();
Flush();
WAIT(3);
BREAK;
END;
ELSE
INVERT();
WAIT(0.3);
INVERT();
REPEAT UNTIL GETKEY()==-1;
END;
0►R;
UNTIL 0;
END;
EXPORT Z2048() BEGIN
DMain();
MInit();
DrawM();
Flush();
WaitK();
KILL;
END;
就这样.
好神! :orz2: