[原创]文曲星GVB - 俄罗斯方块

好久没写GVB了,都快忘记了,
上一段时间抽空写了个俄罗斯方块的GVB程序,
发来给大家看看。

第一遍写完后,慢的无法忍受。
已经优化过两次算法,但还是很慢,权当一个样品吧。
使用了键盘映射,是NC1020的,NC系列应该差不多。

 

以下内容为程序代码:

1 : REM 作者:梁飞,网名:o_o,代码虫子
10 CLEAR:GRAPH:LOCATE 3,6:PRINT "loading...":DIM A(22,12),P(6,3,3),Q(6,3,3):RESTORE
20 FOR I=0 TO 6:FOR J=0 TO 3:FOR L=1 TO 3:READ P(I,J,L):READ Q(I,J,L):NEXT:NEXT:NEXT
30 FOR I=0 TO 10:A(21,I)=1:A(I,0)=1:A(I+11,0)=1:A(I,11)=1:A(I+11,11)=1:NEXT
40 V=0:U=1:D=21:LVL=0:SPD=9:SCR=0:CLS:LOCATE 3,1:PRINT "level:0","speed:9","score:0";
50 LINE 111,0,111,80:LINE 152,0,152,80:LINE 159,0,159,80:BOX 88,0,111,23
100 GOSUB 4400:GOSUB 4350:GOSUB 4100:S$="ready":GOSUB 4300:GOSUB 4600
500 B=0:S=NS:T=NT:GOSUB 4100:BOX 92,4,107,19,1,0
510 SWAP S,NS:SWAP T,NT:O=1:R=3:C=-3:GOSUB 4010:SWAP S,NS:SWAP T,NT
520 O=1:R=1:C=5:GOSUB 4010
1100 TT=T:RR=R:CC=C:K=PEEK(199):IF K=141 OR K=148 OR K=160 OR K=157 THEN POKE 199,0
1200 IF K<>141 THEN 1300 ELSE S$="pause":GOSUB 4300:GOSUB 4600
1300 IF K=157 THEN 10
2000 IF K=148 THEN TT=T+U:TT=TT+(TT<0)*4-(TT>3)*4:GOSUB 4200:IF Z>0 THEN 1100
2100 I=PEEK(188):I=(I=247)-(I=127)
2110 IF I<>0 THEN CC=C+I:GOSUB 4200:IF Z>0 THEN POKE 188,255:1100
2300 IF K=160 THEN Z=0:WHILE Z=0:RR=RR+1:GOSUB 4200:WEND:RR=RR-1:GOSUB 4000:GOTO 2500
2400 B=B+1:IF B>=9-SPD THEN B=0:RR=R+1 ELSE RR=R+(PEEK(192)=247)
2410 IF RR=R THEN 3000 ELSE GOSUB 4200:IF Z=0 THEN 3000
2420 TT=T:CC=C:GOSUB 4200:IF Z=0 THEN 3000 ELSE RR=R
2500 RL=0:FOR I=0 TO 3:A(R+P(S,T,I),C+Q(S,T,I))=1:NEXT
2505 IF D>R+P(S,T,3)THEN D=R+P(S,T,3):GOSUB 4450
2510 FOR I=R+P(S,T,1)TO R+P(S,T,3)STEP-1:IF I>20 THEN 2550
2520 J=1:WHILE J<11 AND A(I,J):J=J+1:WEND:IF J=11 THEN RL=RL+1:2550
2530 IF RL=0 THEN 2550
2540 FOR J=1 TO 10 :A(I+RL,J)=A(I,J):NEXT
2550 NEXT:IF RL=0 THEN 2590
2555 FOR I=R+P(S,T,3)-1 TO D STEP-1:FOR J=1 TO 10:A(I+RL,J)=A(I,J):NEXT:NEXT
2560 BOX 112,D*4-4,151,(D+RL)*4-5,1,0
2565 FOR I=D+RL TO R+P(S,T,1):FOR J=1 TO 10:O=A(I,J):NR=I:NC=J:GOSUB 4050:NEXT:NEXT
2570 FOR I=D TO D+RL-1:FOR J=1 TO 10:A(I,J)=0:NEXT:NEXT:D=D+RL:GOSUB 4450
2580 SCR=SCR+(RL=1)+(RL=2)*3+(RL=3)*7+(RL=4)*13:GOSUB 4330:V=+1:IF V=20 THEN V=0:GOSUB 4310
2590 IF D>1 THEN 500
2600 FOR I=1 TO 4:BOX 112,0,151,79,1,2:FOR J=1 TO 800:NEXT:NEXT
2610 POKE 199,0:S$="over!":GOSUB 4300:GOSUB 4500:GOTO 10
3000 IF TT<>T OR RR<>R OR CC<>C THEN GOSUB 4000
3100 GOTO 1100
4000 O=0:GOSUB 4010:T=TT:R=RR:C=CC:O=1:GOSUB 4010:RETURN
4010 FOR I=0 TO 3:NC=C+Q(S,T,I):NR=R+P(S,T,I):GOSUB 4050:NEXT:RETURN
4020 IF A(I+RL,J)<>A(I,J)THEN A(I+RL,J)=A(I,J):O=A(I,J):NR=I+RL:NC=J
4050 X=NC*4+108:Y=NR*4-4:IF Y>=0 AND Y<80 THEN BOX X,Y,X+3,Y+3,0,O:LINE X+1,Y+1,X+2,Y+2,O
4060 RETURN
4100 I=RND(1)*7:NS=(I>1)+(I>2)+(I>3)+(I>4)+(I>5)+(I>6):I=RND(1)*4:NT=(I>1)+(I>2)+(I>3)
4110 RETURN
4200 Z=0:FOR I=0 TO 3:NC=CC+Q(S,TT,I):NR=RR+P(S,TT,I):Z=Z+A(NR,NC):NEXT:RETURN
4300 GOSUB 4350 :LOCATE 1,2:PRINT S$:GOSUB 4350
4305 FOR I=1 TO 4:FOR J=1 TO 800:NEXT:GOSUB 4350 :NEXT:RETURN
4310 LVL=LVL+(LVL<9):SPD=SPD+(SPD>0):GOSUB 4350:LOCATE 3,7:PRINT LVL:GOSUB 4350
4320 GOSUB 4350:LOCATE 4,7:PRINT SPD:GOSUB 4350:RETURN
4330 GOSUB 4350:LOCATE 5,7:PRINT SCR;:GOSUB 4350:RETURN
4350 BOX 1,0,55,16:BOX 3,2,53,14,1,2:RETURN
4400 BOX 92,26,108,44,1,0:CIRCLE 100,38,8:BOX 100+U*2,30,100+U*8,40,1,0
4410 LINE 100-U*2,26,100+U*2,30:LINE 100-U*2,34,100+U*2,30:RETURN
4450 BOX 154,0,157,80,1,0:BOX 154,D*4-4*(D>0),157,80,1,1:RETURN
4500 POKE 199,0:Z=ASC(INKEY$):IF Z=27 THEN POKE 199,155 ELSE IF Z=29 THEN 10
4510 RETURN
4600 GOSUB 4500:IF Z=20 THEN U=-U:GOSUB 4400
4610 IF Z=22 OR Z=23 THEN SPD=SPD+(Z=22)*(SPD<9)-(Z=23)*(SPD>0):GOSUB 4320
4620 IF S$<>"ready" OR(Z=19)*(D>11)+(Z=14)*(D<21)=0 THEN 4640
4630 D=D-(Z=19):L=(INT(D/2)=D/2):J=L:FOR I=1 TO 10:J=(J=0)*(Z=19):A(D,I)=J:O=J
4635 NR=D:NC=I:GOSUB 4050:NEXT:D=D+(Z=14):GOSUB 4450
4640 IF Z<>13 THEN 4600
4650 S$="start":GOSUB 4300:RETURN
5000 DATA 0,2,0,1,0,-1,2,0,1,0,-1,0,0,2,0,1,0,-1,2,0,1,0,-1,0
5010 DATA 1,0,0,1,0,-1,1,0,0,-1,-1,0,0,1,0,-1,-1,0,1,0,0,1,-1,0
5020 DATA 1,1,1,0,-1,0,1,-1,0,1,0,-1,1,0,-1,0,-1,-1,0,1,0,-1,-1,1
5030 DATA 1,0,1,-1,-1,0,0,1,0,-1,-1,-1,1,0,-1,0,-1,1,1,1,0,1,0,-1
5040 DATA 1,1,1,0,0,-1,1,-1,0,-1,-1,0,1,1,1,0,0,-1,1,-1,0,-1,-1,0
5050 DATA 1,0,1,-1,0,1,1,1,0,1,-1,0,1,0,1,-1,0,1,1,1,0,1,-1,0
5060 DATA 1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 低通滤波器: 低通滤波器允许低频信号通过,而能够阻挡高频信号。常见的RC低通滤波器电路如下图所示: ![低通滤波器](https://i.imgur.com/4DdFzJv.png) 其中,R和C分别为电阻和电容,f_c为截止频率。当输入信号的频率小于截止频率时,由于电容对高频信号的阻抗较大,因此大部分信号通过电阻而流过,输出信号近似于输入信号;而当频率大于截止频率时,电容对高频信号的阻抗较小,因此大部分信号通过电容而流失,输出信号将减小到很小的值。 2. 高通滤波器: 高通滤波器允许高频信号通过,而能够阻挡低频信号。常见的RC高通滤波器电路如下图所示: ![高通滤波器](https://i.imgur.com/7rZ1GvB.png) 同样地,R和C分别为电阻和电容,f_c为截止频率。当输入信号的频率小于截止频率时,电容对高频信号的阻抗较小,因此大部分信号通过电容而流失,输出信号将减小到很小的值;而当频率大于截止频率时,由于电容对高频信号的阻抗较大,因此大部分信号通过电阻而流过,输出信号近似于输入信号。 3. 带通滤波器: 带通滤波器可以让一定范围内的频率信号通过,而阻挡其他频率信号。常见的RLC带通滤波器电路如下图所示: ![带通滤波器](https://i.imgur.com/kz1Xq0v.png) 其中,R、L、C分别为电阻、电感和电容,f_0为中心频率,Q为品质因数。当输入信号的频率接近中心频率时,由于电感和电容的共振作用,电阻对信号的阻抗较小,因此大部分信号通过,输出信号近似于输入信号;而当频率偏离中心频率时,电感和电容的阻抗都会变大,导致信号被阻挡。 4. 带阻滤波器: 带阻滤波器可以阻止一定范围内的频率信号通过,而允许其他频率信号通过。常见的RLC带阻滤波器电路如下图所示: ![带阻滤波器](https://i.imgur.com/5oHJ5Dm.png) 同样地,R、L、C分别为电阻、电感和电容,f_0为中心频率,Q为品质因数。当输入信号的频率接近中心频率时,由于电感和电容的共振作用,电阻对信号的阻抗较小,因此大部分信号被阻挡;而当频率偏离中心频率时,电感和电容的阻抗都会变大,导致信号通过。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值