DEFINT a-z:DEFSNG r,g,b SCREEN 1,320,200,3,1:WINDOW 3,"",(0,0)-(311,186),16,1:WINDOW OUTPUT 3:COLOR 3,0 DIM s(42,1),u(4,5),p(4,5),j(4,5),bx(4,5),by(4,5),n(1,5),er(528),w1(255),w2(255),rt(30),tr(30),tx(30),ty(30) FOR i=0 TO 255:w1(i)=RND*255-128:w2(i)=RND*255-128:NEXT RESTORE palettedata:FOR i=0 TO 7:READ r,g,b:PALETTE i,r,g,b:NEXT palettedata: DATA 0,0,.7,0,0,0,.8,.8,0,.7,.7,.7,.33,.87,0,.9,.9,.9,.6,0,0,0,.6,0 WIDTH 40:CLS:RANDOMIZE TIMER GOSUB InitShapes:e=0 FOR i=1 TO 3:FOR j=1 TO 4:j(i,j)=4:NEXT:j(i,0)=3:j(i,5)=3:NEXT RESTORE Corners:FOR j=1 TO 4:j(0,j)=3:j(4,j)=3:READ a,b:j(a,b)=2:NEXT Corners: DATA 0,0,0,5,4,0,4,5 RESTORE BombPos:FOR i=1 TO 4:FOR j=1 TO i:READ bx(i,j),by(i,j):NEXT j,i bx(4,5)=bx(4,4):by(4,5)=by(4,4) BombPos:DATA 13,9,6,9,20,9,13,5,4,15,22,15,13,3,13,17,4,9,22,9 LOCATE 8,14:PRINT "CHAIN REACTION" LOCATE 12,9:PRINT "Number of players (1/2)"; WHILE np<>1 AND np<>2:np=VAL(INKEY$):WEND IF np<>2 THEN LOCATE 16,10:PRINT "Computer first (Y/N)?"; WHILE k$<>"Y" AND k$<>"N":k$=UCASE$(INKEY$):WEND tu=ABS(k$="Y") END IF CLS:COLOR 3,1:LOCATE 1,13:PRINT "CHAIN REACTION "; GOSUB DrawGrid MainLoop: WHILE e=0:tu=-tu+1:co=tu+6 IF np=1 AND tu=0 THEN GOSUB Computer ELSE GOSUB Human WHILE p(y,x)<>tu+1 AND p(y,x):GOSUB Human:WEND END IF u(y,x)=u(y,x)+1:FS(tu)=FS(tu)+1:IF p(y,x)=0 THEN p(y,x)=tu+1 GOSUB PlaceBomb IF u(y,x)=j(y,x) THEN CheckGrid: e=0:fg=0:FOR p=0 TO 4:FOR q=0 TO 5:y=p:x=q IF u(y,x)>=j(y,x) AND e=0 THEN fg=1:GOSUB FullSquare NEXT q,p:IF fg=1 AND e=0 THEN CheckGrid END IF WEND EndGame: COLOR 3,1:LOCATE 24,15:PRINT " GAME OVER ";:FOR i=1 TO 10000:NEXT LOCATE 24,5:PRINT " Press Salad Bar to play again. "; k$="":WHILE k$<>" ":k$=INKEY$:WEND SCREEN CLOSE 3:WINDOW CLOSE 3:RUN Human: WHILE INKEY$<>"":WEND:x=hx(tu):y=hy(tu):dx=0:dy=0:GOSUB DrawCursor:k$="" WHILE k$<>" ":k$=INKEY$ IF k$=CHR$(28) THEN IF y>0 THEN dy=-1 IF k$=CHR$(29) THEN IF y<4 THEN dy=1 IF k$=CHR$(31) THEN IF x>0 THEN dx=-1 IF k$=CHR$(30) THEN IF x<5 THEN dx=1 IF dx<>0 OR dy<>0 THEN co=0:GOSUB DrawCursor x=x+dx:y=y+dy:co=tu+6:GOSUB DrawCursor dx=0:dy=0 END IF WEND:hx(tu)=x:hy(tu)=y co=0:GOSUB DrawCursor:co=tu+6:RETURN FullSquare: r=0:yy=32*y+15:xx=36*x+50:WAVE 0,w1:WAVE 1,w2 FOR i=1 TO 4:PUT(xx+2,yy+2),er,PSET FOR j=1 TO 4:n(1,j)=INT(RND*3)-1:NEXT r=-r+1:k=u(y,x)+1:bn=co-6:IF k=6 THEN k=5 ON k GOSUB b0,b1,b2,b3,b4,b4 FOR m=255 TO 10 STEP-20:SOUND 100,0.1,m,0 SOUND 100,0.1,m,3:FOR n=1 TO RND*20:NEXT n,m:NEXT tx=x:ty=y:J1=0:K1=k-1:y1=32*y+15+by(1,1):x1=36*x+50+bx(1,1) IF tx>0 THEN x=tx-1:dx=-1:dy=0:GOSUB ExplodeBombs:GOSUB AddBomb IF tx<5 THEN x=tx+1:dx=1:dy=0:GOSUB ExplodeBombs:GOSUB AddBomb x=tx:IF ty>0 THEN y=ty-1:dy=-1:dx=0:GOSUB ExplodeBombs:GOSUB AddBomb IF ty<4 THEN y=ty+1:dy=1:dx=0:GOSUB ExplodeBombs:GOSUB AddBomb IF FS(0)<1 OR FS(1)<1 THEN e=1 y=ty:u(y,x)=u(y,x)-j(y,x):GOSUB PlaceBomb:IF u(y,x)=0 THEN p(y,x)=0 RETURN AddBomb: IF p(y,x)<>tu+1 THEN FS(tu)=FS(tu)+u(y,x):FS(-tu+1)=FS(-tu+1)-u(y,x) p(y,x)=tu+1:u(y,x)=u(y,x)+1:GOSUB PlaceBomb:RETURN DrawGrid: FOR y=0 TO 4:yy=32*y+16:FOR x=0 TO 5:xx=36*x+51 LINE(xx,yy)-(xx+34,yy+30),2,b NEXT x,y GET(xx+1,yy+1)-(xx+33,yy+29),er:RETURN DrawCursor: yy=32*y+15:xx=36*x+50 LINE(xx,yy)-(xx+36,yy+32),co,b LINE(xx+2,yy+2)-(xx+34,yy+30),co,b RETURN PlaceBomb: yy=32*y+15:xx=36*x+50:r=0:bn=co-6 PUT(xx+2,yy+2),er,PSET:k=u(y,x)+1:IF k=6 THEN k=5 ON k GOTO b0,b1,b2,b3,b4,b4 b0: RETURN b1: PUT(xx+bx(1,k-1),yy+by(1,k-1)),s(0,bn):RETURN b2: FOR j=1 TO k-1:PUT(xx+bx(2,j)+n(r,j),yy+by(2,j)+n(r,j)),s(0,bn):NEXT:RETURN b3: FOR j=1 TO k-1:PUT(xx+bx(3,j)+n(r,j),yy+by(3,j)+n(r,j)),s(0,bn):NEXT:RETURN b4: FOR j=1 TO k-1:PUT(xx+bx(4,j)+n(r,j),yy+by(4,j)+n(r,j)),s(0,bn):NEXT:RETURN CheckNeighbor: fp=1:IF y>0 THEN IF p(y-1,x)=2 THEN ay=y-1:RETURN IF x>0 THEN IF p(y,x-1)=2 THEN ax=x-1:RETURN IF x<5 THEN IF p(y,x+1)=2 THEN ax=x+1:RETURN IF y<4 THEN IF p(y+1,x)=2 THEN ay=y+1:RETURN fp=0:RETURN Computer: xt=0:FOR y=0 TO 4:FOR x=0 TO 5 IF p(y,x)<>2 THEN xt=xt+1:ty(xt)=y:tx(xt)=x NEXT x,y LOCATE 24,15:COLOR 3,0:PRINT "Thinking..."; FOR i=1 TO xt:rt(i)=0:tr(i)=0:y=ty(i):x=tx(i):GOSUB CheckNeighbor IF fg=1 AND fp AND u(y,x)>0 THEN EndComputer IF u(y,x)+1=j(y,x) THEN IF fp=1 AND u(ay,ax)+1=j(ay,ax) THEN rt(i)=6:GOTO CheckNext IF fp=1 THEN rt(i)=2:GOTO CheckNext IF fp=0 THEN rt(i)=1:GOTO CheckNext END IF IF j(y,x)=2 THEN IF fp=0 AND u(y,x)=1 THEN rt(i)=1:GOTO CheckNext IF fp=0 AND u(y,x)=0 THEN rt(i)=4:GOTO CheckNext IF fp=1 AND u(y,x)=1 THEN rt(i)=4:GOTO CheckNext END IF IF u(ay,ax)+1=j(ay,ax) THEN rt(i)=1:GOTO CheckNext IF u(y,x)+2>=j(y,x) THEN IF fp=1 AND u(ay,ax)+1