REM TWENTY CCLX33 V1.3 REM ADD BOMB RANDOMIZE TIMER DIM GLOBAL BOARD(7,7) TOUCHSCREEN BOMB=21 RESTART: CLS GOSUB MENU REM PIC SIZE 2X2 DISPLAY (0,1,1,0,1) BG 1 HOLD=0 TOP=10 GOAL=20 TICK=0 GAMEOVER=0 PTICK=0 SCORE=0 TIMEOUT=900-200*LEVEL MINTIMEOUT=300 PRELINE=2+LEVEL*2 GOSUB CLEARBOARD FOR IL=1 TO PRELINE GOSUB ADDLINE NEXT IL REM MAINLOOP DO TICK=TICK+1 IF TICK>=TIMEOUT AND HOLD=0 THEN GOSUB ADDLINE IF GAMEOVER THEN GOTO GAMEOVER IF TOUCH THEN GOSUB GETXY IF HOLD=0 THEN GOSUB HOLD ELSE IF HOLD>0 THEN GOSUB MOVEHOLD END IF ELSE IF NOT TOUCH AND HOLD<>0 THEN HOLD=0 GOSUB FALL END IF WAIT VBL LOOP MENU: TEXT 6,2,"[ EASY ]" TEXT 6,5,"[NORMAL]" TEXT 6,8,"[ HARD ]" REPEAT UNTIL TOUCH.Y>0 AND TOUCH.Y<112 LEVEL=MIN(INT(TOUCH.Y-8)\24,2) CLS RETURN GAMEOVER: CLS TEXT 5,6,"GAME OVER" TEXT 5,8,"TWENTY="+STR$(SCORE) TEXT 4,14,"[PLAY AGAIN]" REPEAT UNTIL TOUCH.Y>112 GOTO RESTART GETXY: X=TOUCH.X\16 IF X<1 THEN X=1 IF X>7 THEN X=7 Y=TOUCH.Y\16 RETURN HOLD: XO=X YO=Y HOLD=BOARD(X,Y) RETURN MOVEHOLD: IF X=XO AND Y=YO THEN PTICK=PTICK+1 IF PTICK>50 THEN GOSUB ADDLINE PTICK=0 END IF RETURN END IF PTICK=0 DIST=ABS(X-XO)+ABS(Y-YO) IF DIST>2 THEN HOLD=-1 IF DIST=2 THEN IF X=XO THEN IF BOARD(X,(Y+YO)\2)>0 THEN HOLD=-1 ELSE IF Y=YO THEN IF BOARD((X+XO)/2,Y)>0 THEN HOLD=-1 ELSE IF BOARD(X,YO)>0 AND BOARD(XO,Y)>0 THEN HOLD=-1 END IF END IF IF HOLD=-1 THEN RETURN NEWC=BOARD(X,Y) IF NEWC=0 THEN REM MOVE CALL DRAW(XO,YO,0) CALL DRAW(X,Y,HOLD) XO=X YO=Y ELSE IF HOLD=BOMB THEN IF NEWC=BOMB THEN HOLD=-1 IF NEWC>0 AND NEWC<>BOMB THEN CALL DRAW(XO,YO,0) CALL KILL(NEWC) GOSUB FALL HOLD=-1 END IF ELSE IF NEWC=HOLD THEN REM MERGE HOLD=HOLD+1 CALL DRAW(X,Y,HOLD) CALL DRAW(XO,YO,0) IF HOLD=GOAL THEN GOSUB SCOREUP CALL DRAW(X,Y,0) END IF IF HOLD>TOP THEN TOP=HOLD IF TOP>19 THEN TOP=19 HOLD=-1 END IF RETURN SCOREUP: SCORE=SCORE+1 LOCATE 0,0 PRINT"TWENTY=";SCORE TIMEOUT=MAX(TIMEOUT-5,MINTIMEOUT) RETURN ADDLINE: TICK=0 GOSUB CHECKHEIGHT IF GAMEOVER THEN RETURN REM MOVE LINE UP FOR Y=0 TO 6 FOR X=1 TO 7 CALL DRAW(X,Y,BOARD(X,Y+1)) NEXT X NEXT Y REM ADD BOTTOM LINE FOR X=1 TO 7 REPEAT R=INT(RND*(TOP-1)+1) UNTIL R<>BOARD(X,6) IF INT(RND*(10+LEVEL*20))=0 THEN R=BOMB CALL DRAW(X,7,R) NEXT X RETURN CHECKHEIGHT: GAMEOVER=0 FOR X=1 TO 7 IF BOARD(X,0)>0 THEN GAMEOVER=1 X=7 END IF NEXT X RETURN FALL: FOR X=1 TO 7 FOR Y=6 TO 0 STEP -1 OBJ=BOARD(X,Y) IF OBJ>0 THEN GOSUB FALLCOLUMN NEXT Y NEXT X RETURN FALLCOLUMN: OBJPOS=Y FOR IY=Y+1 TO 7 BELOW=BOARD(X,IY) IF BELOW=0 THEN CALL DRAW(X,OBJPOS,0) OBJPOS=IY CALL DRAW(X,IY,OBJ) ELSE IF BELOW=OBJ THEN IF OBJ<>BOMB THEN REM MERGE CALL DRAW(X,OBJPOS,0) OBJ=OBJ+1 CALL DRAW(X,IY,OBJ) OBJPOS=IY IF OBJ=GOAL THEN GOSUB SCOREUP OBJ=0 CALL DRAW(X,IY,OBJ) IY=7 END IF IF OBJ>TOP THEN TOP=OBJ END IF ELSE REM STOPFALL IY=7 END IF NEXT IY RETURN CLEARBOARD: FOR Y=0 TO 7 FOR X=1 TO 7 CALL DRAW(X,Y,0) NEXT X NEXT Y RETURN SUB DRAW(X,Y,OBJ) PICNO=VAL(MID$("00/02/04/06/08/10/12/14/32/34/36/38/40/42/44/46/64/66/68/70/72/74",OBJ*3+1,2)) REM PALETTE ATTR ((OBJ-1)\4,0,0,0,0) CELL X,Y,PICNO BOARD(X,Y)=OBJ END SUB SUB KILL(C) FOR Y=0 TO 7 FOR X=1 TO 7 IF BOARD(X,Y)=C THEN CALL DRAW(X,Y,0) NEXT X NEXT Y END SUB #1:MAIN PALETTES 0030372200172B19003C0C25003E3D16 003F2A15003B29140038281300362011 #2:MAIN CHARACTERS 00000000000000000000000000000000 00000000000000000000000000000000 003F7F7F7E7F7F7F7FC0808080808080 00FCFEFE7E7E7E7EFE03010101010101 7FC0808080808080003F7F7F7C7B7F7F FE0301010101010100FCFEFE3EDEDEDE 00000000030000007FC0808080808080 00000000C0202020FE03010101010101 003F7F7F7F7F7F7F7FFFFFFFFFFEFDFB 00FCFEFEFEFEFEFEFEFFFFFF7F7F7F7F 7FFFFFFFFCFDFDFC0000000000000000 FEFFFFFF1FFFFF3F0000000000000000 7FC08080808182820000000000000000 FE030101C10101010000000000000000 7FFFFFFFF8FFFFFF003F7F7F787F7F7F FEFFFFFF1FDFDFBF00FCFEFE1EDEDEBE 00000000000000000000000000000000 00000000000000000000000000000000 7F7F7F7E7F7F3F00808080808080C07F 7E7E7E3EFEFEFC0001010101010103FE 808080808080C07F7F7F7E7D787F3F00 01010101010103FEBE7EFEFE1EFEFC00 0300000003000000808080808080C07F C0202020C000000001010101010103FE 7F7F7F7F7F7F3F00F7F0FFFFFFFFFF7F FEFEFEFEFEFEFC007F1F7F7FFFFFFFFE FFFFFFFCFFFFFF7F0000000000000000 DFDFDF3FFFFFFFFE0000000000000000 838282828180C07F0000000000000000 C1212121C10103FE0000000000000000 FFFFFEFEFEFFFF7F7F7F7E7E7E7F3F00 7F7FFFFFFFFFFFFE7E7EFEFEFEFEFC00 7FFFE0C0C3C4C4C400001F3F3C3B3B3B FEFF0703834343430000F8FC7CBCBCBC 7FFFFFFFFFFFFFFF0000000304040403 FEFFFFFFFFFFFFFF000000C0202020E0 7FFFFFFFFFFFFFFF7FFFFFFFF7F6F6F6 FEFFFFFFFFFFFFFFFEFFFFFF3FDFDFDF 7FC08080828682827FC0808080808080 FE03010121612121FE03010101010101 002A7F2A7F2E7F2E7FEAFFAAFBAAFBAA 00A8FEAAEEBAFEEAFEABFFAB0FABEF8B 7FFFE0C0C4C4C4C40000000000000000 FEFF0703C32323C30000000000000000 7FFFFFFFF6F6F6F60000000000000000 FCFFFFFFDFDFDF1F0001010101010101 00000000000000007FFFFFFFF6F6F6F6 0001010101010101FCFFFFFF1FFFFF1F C3C4C4C4C3E0FF7F3C3B3B3B3C1F0000 834343438307FFFE7CBCBCBC7CF80000 FFFFFFFFFFFFFF7F0000000300000000 FFFFFFFFFFFFFFFE202020C000000000 FFFFFFFFFFFFFF7FF6F6F6F7FFFFFF7F FFFFFFFFFFFFFFFEDFDFDF3FFFFFFFFE 828282808080C07F808080808080C07F 21212101010103FE01010101010103FE 7F2E7F2A7F2A3F00FBAAFBAAFFAAFF7F FEAAFEAAFEAAFC007F2B0FABFFABFFFE C4C4C4C0C0E0FF7F0000000000000000 2323C3030307FFFE0000000000000000 F7F7F7FFFFFF7F7F000000000000007F DFDFDFFFFFFFFFFE01010101010103FE 000000000000007FF7F7F6FFFFFF7F7F 01010101010103FEDFDF1FFFFFFFFFFE 7FFFFFFFFFF7F7F77FFFFFFFFFFFFFFF FEFFFFFFFF0F7F7FFEFFFFFFFFFFFFFF 00000000000000007FFFFFFFFFF7F7F7 0000000000000000FEFFFFFFFF0FEFEF 7FFFFFFFFFFFFFFF0000000000040404 FEFFFFFFFFFFFFFF0000000000609090 7FFFE0C0C0C0C0C00000000000040404 FEFF0703030303030000000000609090 7FFFFFFFFFFFFFFF7FC09FBFBFB3BDBD FEFFFFFFFFFFFFFFFE03F9FDFD9D6D6D 0000000000000000FFFFFEFEF8E0C0C0 0000000000000000BF7FFFFF3F0F0707 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 F7F7F7F7FFFFFF7FFFFFFFFFFFFFFF7F 0F6F6F0FFFFFFFFEFFFFFFFFFFFFFFFE 0000000000000000F7F7F7F7FFFFFF7F 0000000000000000DFBFBFBFFFFFFFFE FFFFFFFFFFFFFF7F0404040400000000 FFFFFFFFFFFFFFFE6090906000000000 C0C0C0C0C0E0FF7F0404040400000000 030303030307FFFE7010106000000000 FFFFFFFFFFFFFF7FBBB7B7B1BF9FC07F FFFFFFFFFFFFFFFE6D6D6D9DFDF903FE 000000000000000080808080C0C0E0F8 00000000000000000303030307070F3F