📄 link4.bas
字号:
' Minor reformatting and modifications by Dave Navarro, Jr.
5 SCREEN 1:CLS
7 DIM TALY(7):DIM BOARD(6,7)
8 GOSUB 28000
10 GOSUB 4000
20 GOSUB 5000
22 GOSUB 6000
25 GOSUB 7000
26 GOSUB 8000:GOSUB 9000
30 H.OFFSET = 60
40 V.OFFSET = 50
50 H.SKIP = 30
60 V.SKIP = 25
70 P.WIN = 0
80 C.WIN = 0
90 GOTO 10010
4000 REM LOAD SHAPE c.chip
4010 DIM C.CHIP( 47 )
4020 S.WIDTH= 21 :S.HEIGHT= 17
4030 FOR I = 0 TO S.WIDTH-1
4040 FOR J = 0 TO S.HEIGHT-1
4050 READ S.COL
4060 PSET(I,J),S.COL
4070 NEXT J
4080 NEXT I
4090 GET(0,0)-(S.WIDTH-1,S.HEIGHT-1),C.CHIP
4100 RETURN
5000 REM LOAD SHAPE c.chip2
5010 DIM C.CHIP2( 58 )
5020 S.WIDTH= 23 :S.HEIGHT= 19
5030 FOR I = 0 TO S.WIDTH-1
5040 FOR J = 0 TO S.HEIGHT-1
5050 READ S.COL
5060 PSET(I,J),S.COL
5070 NEXT J
5080 NEXT I
5090 GET(0,0)-(S.WIDTH-1,S.HEIGHT-1),C.CHIP2
5100 RETURN
6000 REM LOAD SHAPE sq
6010 DIM SQ( 58 )
6020 S.WIDTH= 23 :S.HEIGHT= 19
6030 FOR I = 0 TO S.WIDTH-1
6040 FOR J = 0 TO S.HEIGHT-1
6050 READ S.COL
6060 PSET(I,J),S.COL
6070 NEXT J
6080 NEXT I
6090 GET(0,0)-(S.WIDTH-1,S.HEIGHT-1),SQ
6100 RETURN
7000 REM LOAD SHAPE back
7010 DIM BACK( 33 )
7020 S.WIDTH= 16 :S.HEIGHT= 16
7030 FOR I = 0 TO S.WIDTH-1
7040 FOR J = 0 TO S.HEIGHT-1
7050 READ S.COL
7060 PSET(I,J),S.COL
7070 NEXT J
7080 NEXT I
7090 GET(0,0)-(S.WIDTH-1,S.HEIGHT-1),BACK
7100 RETURN
8000 REM LOAD SHAPE p.chip
8010 DIM P.CHIP( 47 )
8020 S.WIDTH= 21 :S.HEIGHT= 17
8030 FOR I = 0 TO S.WIDTH-1
8040 FOR J = 0 TO S.HEIGHT-1
8050 READ S.COL
8060 PSET(I,J),S.COL
8070 NEXT J
8080 NEXT I
8090 GET(0,0)-(S.WIDTH-1,S.HEIGHT-1),P.CHIP
8100 RETURN
9000 REM LOAD SHAPE p.chip2
9010 DIM P.CHIP2( 58 )
9020 S.WIDTH= 23 :S.HEIGHT= 19
9030 FOR I = 0 TO S.WIDTH-1
9040 FOR J = 0 TO S.HEIGHT-1
9050 READ S.COL
9060 PSET(I,J),S.COL
9070 NEXT J
9080 NEXT I
9090 GET(0,0)-(S.WIDTH-1,S.HEIGHT-1),P.CHIP2
9100 RETURN
10000 REM main
10001 WIN=0
10002 FOR I = 1 TO 6
10003 FOR J = 1 TO 7
10004 BOARD(I,J)=0
10005 NEXT J
10006 NEXT I
10010 GOSUB 11000:FIRST=1
10015 LINE (H.OFFSET-10,V.OFFSET-30)-(H.OFFSET+7*H.SKIP+3,199),0,BF
10020 FOR I = V.OFFSET TO V.OFFSET+5*V.SKIP STEP V.SKIP
10030 FOR J = H.OFFSET TO H.OFFSET+6*H.SKIP STEP H.SKIP
10040 PUT (J,I),SQ,PSET
10050 NEXT J
10060 NEXT I
10070 LINE (H.OFFSET-7,V.OFFSET-7)-(H.OFFSET+7*H.SKIP,199),3,B
10080 PAINT (H.OFFSET-6,198),1,3
10090 T.POS = V.OFFSET-27
10100 T.H.POS=4
10110 PUT((T.H.POS+1)*H.SKIP+1,T.POS),P.CHIP,XOR
10120 GOSUB 12000
10125 IF A$="r" OR A$="R" THEN P.WIN=0:C.WIN=0
10130 IF A$="q" OR A$="Q" THEN END ELSE GOTO 10000
11000 REM fill screen
11005 GOSUB 29000
11010 FOR I = 0 TO 320-16 STEP 16
11020 FOR J = 0 TO 200-16 STEP 8
11030 PUT (I,J),BACK,PSET
11040 NEXT J
11050 NEXT I
11060 LINE(0,150)-(H.OFFSET-11,199),0,BF
11070 LINE(0,150)-(H.OFFSET-11,199),,B
11080 LOCATE 20,2:PRINT "SCORE"
11090 LOCATE 22,2:PRINT "P ";P.WIN
11100 LOCATE 23,2:PRINT "C ";C.WIN
11110 RETURN
12000 REM get player entry
12005 IF PLAYER = 1 THEN T.H.POS=4:PUT((T.H.POS+1)*H.SKIP+1,T.POS),C.CHIP,PSET:GOSUB 15000:GOSUB 14000:IF WIN<>2 THEN PUT((T.H.POS+1)*H.SKIP+1,T.POS),P.CHIP,PSET
12007 IF PLAYER = 1 THEN PLAYER = 0 ELSE PLAYER = 1
12010 A$=INKEY$
12020 IF A$="q" OR A$="Q" THEN RETURN
12025 IF A$="r" OR A$="R" THEN RETURN
12030 IF A$=CHR$(13) THEN GOSUB 13000:OLD.POS=T.H.POS:T.H.POS=4:GOSUB 14000:GOSUB 21000
12035 IF A$=CHR$(13) THEN IF WIN =0 AND ER = 0 THEN PUT((T.H.POS+1)*H.SKIP+1,T.POS),C.CHIP,XOR:GOSUB 15000:GOSUB 14000:IF WIN<>2 THEN PUT((T.H.POS+1)*H.SKIP+1,T.POS),P.CHIP,PSET:GOSUB 21000
12036 IF ER=1 THEN T.H.POS=4:PUT((T.H.POS+1)*H.SKIP+1,T.POS),P.CHIP,PSET:ER=0
12037 IF WIN = 1 THEN P.WIN=P.WIN+1:GOTO 10000
12038 IF WIN = 2 THEN C.WIN=C.WIN+1:GOTO 10000
12040 IF A$="4" THEN GOSUB 12200
12045 IF A$=CHR$(0,75) THEN GOSUB 12200
12050 IF A$="6" THEN GOSUB 12400
12055 IF A$=CHR$(0,77) THEN GOSUB 12400
12060 GOTO 12010
12200 PUT((T.H.POS+1)*H.SKIP+1,T.POS),P.CHIP,XOR
12210 T.H.POS=T.H.POS-1
12220 IF T.H.POS = 0 THEN T.H.POS = 7
12230 PUT((T.H.POS+1)*H.SKIP+1,T.POS),P.CHIP,XOR
12240 PLAY "L40O2C"
12250 RETURN
12400 PUT((T.H.POS+1)*H.SKIP+1,T.POS),P.CHIP,XOR
12410 T.H.POS=T.H.POS+1
12420 IF T.H.POS = 8 THEN T.H.POS = 1
12430 PUT((T.H.POS+1)*H.SKIP+1,T.POS),P.CHIP,XOR
12440 PLAY "L40O2C"
12450 RETURN
13000 REM drop piece
13010 IF BOARD(1,T.H.POS)<>0 THEN ER=1:PUT((T.H.POS+1)*H.SKIP+1,T.POS),P.CHIP,XOR:PLAY "L20O1C":RETURN
13020 PUT((T.H.POS+1)*H.SKIP+1,T.POS),P.CHIP,XOR
13030 PUT((T.H.POS+1)*H.SKIP,V.OFFSET),P.CHIP2,PSET
13040 PLAY "L10O3C"
13050 IF BOARD(2,T.H.POS)<>0 THEN RW=1:BOARD(1,T.H.POS)=1:PLAY "L40O2C":RETURN
13060 PUT((T.H.POS+1)*H.SKIP,V.OFFSET),SQ,PSET
13070 PUT((T.H.POS+1)*H.SKIP,V.OFFSET+V.SKIP),P.CHIP2,PSET
13080 PLAY "L10O3D"
13090 IF BOARD(3,T.H.POS)<>0 THEN RW=2:BOARD(2,T.H.POS)=1:PLAY "L40O2C":RETURN
13100 PUT((T.H.POS+1)*H.SKIP,V.OFFSET+V.SKIP),SQ,PSET
13110 PUT((T.H.POS+1)*H.SKIP,V.OFFSET+V.SKIP*2),P.CHIP2,PSET
13120 PLAY "L10O3E"
13130 IF BOARD(4,T.H.POS)<>0 THEN RW=3:BOARD(3,T.H.POS)=1:PLAY "L40O2C":RETURN
13140 PUT((T.H.POS+1)*H.SKIP,V.OFFSET+V.SKIP*2),SQ,PSET
13150 PUT((T.H.POS+1)*H.SKIP,V.OFFSET+V.SKIP*3),P.CHIP2,PSET
13160 PLAY "L10O3F"
13170 IF BOARD(5,T.H.POS)<>0 THEN RW=4:BOARD(4,T.H.POS)=1:PLAY "L40O2C":RETURN
13180 PUT((T.H.POS+1)*H.SKIP,V.OFFSET+V.SKIP*3),SQ,PSET
13190 PUT((T.H.POS+1)*H.SKIP,V.OFFSET+V.SKIP*4),P.CHIP2,PSET
13200 PLAY "L10O3G"
13210 IF BOARD(6,T.H.POS)<>0 THEN RW=5:BOARD(5,T.H.POS)=1:PLAY "L40O2C":RETURN
13220 PUT((T.H.POS+1)*H.SKIP,V.OFFSET+V.SKIP*4),SQ,PSET
13230 PUT((T.H.POS+1)*H.SKIP,V.OFFSET+V.SKIP*5),P.CHIP2,PSET
13240 PLAY "L10O3A"
13250 BOARD(6,T.H.POS)=1:RW=6:PLAY "L40O2C":RETURN
14000 REM CHECK FOR A WIN
14010 TOT=0
14020 COL=BOARD(RW,OLD.POS)
14030 NEW.COL=COL:X=RW
14040 WHILE NEW.COL=COL AND X<=6
14050 TOT=TOT+1
14055 X=X+1
14057 IF X<=6 THEN NEW.COL=BOARD(X,OLD.POS)
14060 WEND
14070 IF TOT>=4 THEN PL=1:GOSUB 19000:WIN=COL:RETURN
14080 TOT=1
14085 FOR I = 1 TO 3
14090 IF OLD.POS-I=0 THEN GOTO 14110 ELSE IF BOARD(RW,OLD.POS-I)=COL THEN TOT=TOT+1 ELSE GOTO 14110
14100 NEXT I
14110 FOR I = 1 TO 3
14120 IF OLD.POS+I=8 THEN GOTO 14140 ELSE IF BOARD(RW,OLD.POS+I)=COL THEN TOT=TOT+1 ELSE GOTO 14140
14130 NEXT I
14140 IF TOT>=4 THEN PL=2:GOSUB 19000:WIN=COL:RETURN
14150 TOT=1
14165 FOR I = 1 TO 3
14170 IF OLD.POS-I=0 OR RW+I=7 THEN GOTO 14190 ELSE IF BOARD(RW+I,OLD.POS-I)=COL THEN TOT=TOT+1 ELSE GOTO 14190
14180 NEXT I
14190 FOR I = 1 TO 3
14200 IF OLD.POS+I=8 OR RW-I=0 THEN GOTO 14220 ELSE IF BOARD(RW-I,OLD.POS+I)=COL THEN TOT=TOT+1 ELSE GOTO 14220
14210 NEXT I
14220 IF TOT>=4 THEN PL=3:GOSUB 19000:WIN=COL:RETURN
14230 TOT=1
14245 FOR I = 1 TO 3
14250 IF OLD.POS-I=0 OR RW-I=0 THEN GOTO 14270 ELSE IF BOARD(RW-I,OLD.POS-I)=COL THEN TOT=TOT+1 ELSE GOTO 14270
14260 NEXT I
14270 FOR I = 1 TO 3
14280 IF OLD.POS+I=8 OR RW+I=7 THEN GOTO 14300 ELSE IF BOARD(RW+I,OLD.POS+I)=COL THEN TOT=TOT+1 ELSE GOTO 14300
14290 NEXT I
14300 IF TOT>=4 THEN PL=4:GOSUB 19000:WIN=COL:RETURN
14310 RETURN
15000 REM COMPUTER MOVES!!!!!
15010 REM CLEAR TALY ARRAY
15020 FOR K = 1 TO 7
15030 TALY(K)=0
15040 FOR L = 1 TO 6
15050 IF BOARD(L,K)<> 0 THEN L=L-1:GOTO 15070
15060 NEXT L
15065 L=L-1
15070 IF L = 0 THEN GOTO 15690
15080 TALY(K)=1
15083 REM IRST=1 THEN TALY(K)=TALY(K)+L^3:REM ELE TALY(K)=TALY(K)+3.75*L
15084 FLASH=0
15085 RW=L:OLD.POS=K
15090 BOARD(L,K)=1:GOSUB 14000:GOSUB 16000:TALY(K)=TALY(K)+TOT:BOARD(L,K)=0:IF WIN=1 THEN TALY(K)=TALY(K)+10000
15100 WIN=0
15110 BOARD(L,K)=2:GOSUB 14000:GOSUB 16000:TALY(K)=TALY(K)+TOT:BOARD(L,K)=0:IF WIN=2 THEN TALY(K)=TALY(K)+100000!
15120 WIN=0
15180 RW=L
15190 BOARD(L,K)=1:GOSUB 20000:BOARD(L,K)=0:IF WIN=1 THEN TALY(K)=TALY(K)+400
15200 BOARD(L,K)=2:GOSUB 20000:BOARD(L,K)=0:IF WIN=1 THEN TALY(K)=TALY(K)+300
15210 WIN=0
15630 IF L=1 THEN GOTO 15660
15640 RW=L-1
15650 BOARD(L-1,K)=1:GOSUB 14000:BOARD(L-1,K)=0:IF WIN=1 THEN IF TALY(K)<1000 THEN TALY(K)=1
15655 WIN=0
15660 REM END BRANCH
15670 FLASH=1
15680 RW=L
15690 NEXT K
15695 FIRST = 0
15700 REM FIND HIGHEST TALY
15710 HIGHEST=0
15720 FOR K=1 TO 7
15730 IF TALY(K)>HIGHEST THEN HIGHEST=TALY(K)
15740 NEXT K
15745 IF HIGHEST=0 THEN WIN=3:RETURN
15750 HIGHEST.COUNT=0
15760 FOR K=1 TO 7
15770 IF TALY(K)=HIGHEST THEN HIGHEST.COUNT=HIGHEST.COUNT+1
15780 NEXT K
15790 REM RANDOMIZE CHOICE
15800 CHOICE=INT(RND(1)*HIGHEST.COUNT)+1
15810 I=1
15820 FOR K = 1 TO CHOICE
15830 WHILE TALY(I)<>HIGHEST
15840 I=I+1
15850 WEND
15855 I=I+1
15860 NEXT K
15870 OLD.POS=I-1
15880 FOR K = 1 TO 6
15890 IF BOARD(K,OLD.POS)<>0 THEN K=K-1:GOTO 15910
15900 NEXT K
15905 K=K-1
15910 RW=K:BOARD(RW,OLD.POS)=2
15920 GOSUB 17000:GOSUB 18000
15930 PUT((OLD.POS+1)*H.SKIP,V.OFFSET+V.SKIP*(RW-1)),C.CHIP2,PSET
15940 REM PUT WIN ROUTINE HERE
15950 RETURN
16000 REM CHECK FOR A CLOSE POSITION
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -