ctb.wb 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. 10 goto 10000
  2. 1000 ' 駒表示
  3. 1001 ' X,Y : センター座標, A : 駒データ位置, B : 0x20 で消去, 0x81A1 で '■'
  4. 1002 y = Y : if y >= 0 then locate X,y : print chr(B);
  5. 1003 for i=A to A+4 step 2
  6. 1004 y = Y + @(i+1) : if y >= 0 then locate X + @(i),y : print chr(B);
  7. 1005 next
  8. 1006 return
  9. 1100 ' 移動できるかチェック
  10. 1101 ' U,V : センター座標, W : 駒データ位置, F : 0 OK / 1 NG
  11. 1110 F = 1 : @(P) = 1 'ぶず
  12. 1111 if @(1+U+V*12) then goto 1116
  13. 1112 if @(1+U+@(W )+(V+@(W+1))*12) then goto 1116
  14. 1113 if @(1+U+@(W+2)+(V+@(W+3))*12) then goto 1116
  15. 1114 if @(1+U+@(W+4)+(V+@(W+5))*12) then goto 1116
  16. 1115 F = 0
  17. 1116 @(P)=0 : return
  18. 1200 ' スコア表示
  19. 1210 locate 21,11
  20. 1220 if S < 10000 then print " ";
  21. 1230 if S < 1000 then print " ";
  22. 1240 if S < 100 then print " ";
  23. 1250 if S < 10 then print " ";
  24. 1260 print S;
  25. 1270 return
  26. 1300 ' ブズ回転
  27. 1310 O = rnd(4)+0x81A8 : locate Q+8,R-4 : print chr(O);
  28. 1320 T = tick + 66
  29. 1330 return
  30. 1400 ' データと画面をスクロールダウン
  31. 1401 ' Y : 消えるライン xy座標系
  32. 1410 for i=Y*12+10 to 13 step -1 : @(i)=@(i-12) : next
  33. 1420 for i=1 to 10 : @(i)=0 : next
  34. 1430 for i=Y to 4 step -1 : for j=1 to 10
  35. 1440 locate j+8,i-4 : k=@(i*12+j)
  36. 1450 if k=1 then print "■"; : goto 1460
  37. 1451 if k=2 then print chr(2); : goto 1460
  38. 1452 print " ";
  39. 1460 next : next
  40. 1470 return
  41. 3000 ' メインループ
  42. 3010 if T < tick then gosub 1300 ' ブズ回転
  43. 3020 if t < tick then goto 3500 ' 落とす
  44. 3100 ' キースキャン
  45. 3110 U = x : V = y : W = a
  46. 3120 k = scan : if k and l then goto 3150 ' 一度手を離せ。
  47. 3130 if k and scan_a then W = @(W+6) : l = scan_a : goto 3200
  48. 3131 if k and scan_x2 then U = U + 1 : l = scan_x2 : goto 3200
  49. 3132 if k and scan_x3 then V = V + 1 : l = scan_x3 : goto 3200
  50. 3133 if k and scan_x4 then U = U - 1 : l = scan_x4 : goto 3200
  51. 3140 l = 0 ' 何も押されていない
  52. 3150 waitvb 1
  53. 3160 goto 3000
  54. 3200 ' キーによる駒移動
  55. 3210 gosub 1100 ' 移動できるかチェック
  56. 3220 if F then if l = scan_x3 then goto 3600 ' 押し込み
  57. 3230 if F then goto 3000 ' 動かせない。おしまい。
  58. 3240 ' 動かせる。実行。
  59. 3250 if l = scan_x3 then l = 0 ' : t = tick + w ' 下向きだけはリピート可能
  60. 3260 X = x+9 : Y = y-4 : A = a : B = 32 : gosub 1000 ' 今のを消す
  61. 3270 x = U : y = V : a = W
  62. 3280 X = x+9 : Y = y-4 : A = a : B = 0x81A1 : gosub 1000 ' 移動後を表示
  63. 3290 goto 3000
  64. 3299 ' メインループ終わり
  65. 3500 ' 時間切れ。一つ下がる
  66. 3510 U = x : V = y + 1 : W = a : gosub 1100
  67. 3520 if F then goto 3600 ' 下がれない。
  68. 3530 X = x+9 : Y = y-4 : A = a : B = 32 : gosub 1000 ' 今のを消す
  69. 3540 y = V : Y = y-4 : B = 0x81A1 : gosub 1000 ' 移動後を表示
  70. 3550 t = tick + w
  71. 3560 play "o1a16" ' 落下音
  72. 3570 goto 3000
  73. 3600 ' 着底
  74. 3610 ' 埋まったラインを消す
  75. 3615 play "o1g8"
  76. 3620 @(P)=1
  77. 3621 @(1+x+y*12)=1
  78. 3622 @(1+x+@(a )+(y+@(a+1))*12)=1
  79. 3623 @(1+x+@(a+2)+(y+@(a+3))*12)=1
  80. 3624 @(1+x+@(a+4)+(y+@(a+5))*12)=1
  81. 3630 for i=y+@(a+1) to y+@(a+5)
  82. 3640 f=0 : @(P)=1
  83. 3650 for j=1+i*12 to 10+i*12
  84. 3660 if @(j)=0 then f=1
  85. 3670 next
  86. 3680 @(P)=0
  87. 3690 if f then goto 3920 ' このラインは消せない。次。
  88. 3710 if i <> R then goto 3780
  89. 3720 ' ブズ抹消!
  90. 3730 locate Q+8,R-4 : print chr(2);
  91. 3740 S=S+50 : gosub 1200 : play "o4e8~c0"
  92. 3760 P=1 : R=22 ' ブズ死亡状態
  93. 3770 goto 3800
  94. 3780 ' ラインだけ消去
  95. 3790 S=S+1 : gosub 1200 : play "g16"
  96. 3800 ' データと画面をスクロールダウン
  97. 3810 Y=i : gosub 1400
  98. 3870 ' ブズ復元
  99. 3880 if P=1 then goto 3920
  100. 3890 ' ブズが落ちてきたブロックに殴られたか?
  101. 3900 if @(P) then P=P+12 : R=R+1 : S=S+75 : gosub 1200 : play "g16c16"
  102. 3910 locate Q+8,R-4 : print chr(O);
  103. 3920 next ' MAX4ブロック分ループ終了。
  104. 4000 ' ブズの移動フェーズ
  105. 4010 if P=1 then goto 4300
  106. 4020 locate Q+8,R-4 : print " "; : c = 4
  107. 4030 goto 4040 + (O and 1) * 4 + (O and 2) '時計回りの苦肉の策
  108. 4040 if @(P+1)=0 then P=P+1 : Q=Q+1 : goto 4050 ' 0x81A8 右 00
  109. 4041 c=c-1 : if c=0 then goto 4080
  110. 4042 if @(P-12)=0 and R>1 then P=P-12 : R=R-1 : goto 4050 ' 0x81AA 上 10
  111. 4043 c=c-1 : if c=0 then goto 4080
  112. 4044 if @(P-1)=0 then P=P-1 : Q=Q-1 : goto 4050 ' 0x81A9 左 01
  113. 4045 c=c-1 : if c=0 then goto 4080
  114. 4046 if @(P+12)=0 then P=P+12 : R=R+1 : goto 4050 ' 0x81AB 下 11
  115. 4047 c=c-1 : if c=0 then goto 4080
  116. 4048 goto 4040
  117. 4050 ' 動けた! 「ぷふぁ」
  118. 4051 ' ぶずが画面上に抜けたらゲームオーバー
  119. 4052 if R < 4 then locate Q+8,R-3 : print chr(1);: goto 4400
  120. 4060 gosub 1300
  121. 4070 goto 4300
  122. 4080 ' ぶずは囲まれた! 「ぎゃう」
  123. 4090 S = S + 100 : gosub 1200 : play "e8~>c0" ': play "o6#0c8#1e8#2g8"
  124. 4100 locate Q+8,R-4 : print chr(2);
  125. 4110 @(P) = 2 : P=1 : Y=R : R=22
  126. 4120 ' この死体でこのラインが埋まるか?
  127. 4130 f=0
  128. 4140 for i=Y*12+1 to Y*12+10
  129. 4150 if @(i)=0 then f=1
  130. 4160 next
  131. 4170 if f then goto 4300
  132. 4180 waitvb 7 : play "g16" : gosub 1400
  133. 4190 S=S+1 : gosub 1200
  134. 4300 ' 絶対不可侵領域を塗りつぶしてないか→ゲームオーバー
  135. 4310 f=1
  136. 4320 for i=1+3*12 to 10+3*12
  137. 4330 if @(i) then f=0
  138. 4340 next
  139. 4350 if f then goto 5000 ' 詰まってはいない。
  140. 4400 ' GAME OVER
  141. 4410 play "o3edc"
  142. 4420 locate 10, 9 : print "G A M E";
  143. 4430 locate 10,11 : print "O V E R";
  144. 4440 k=wait
  145. 4450 if scan then goto 4450 ' 手を離せ。
  146. 4455 for i=0 to 17: locate 9,i : print " ";:next
  147. 4460 goto 10050 ' スタート画面へ。
  148. 5000 ' ブズ生成 *スタート時突入ポイント*
  149. 5010 if P<>1 then goto 5100
  150. 5020 Q=rnd(10)+1
  151. 5030 R=16+rnd(7)-rnd(7) : if R = 22 then R=20
  152. 5040 P=Q+R*12 : if @(P) then goto 5020
  153. 5050 gosub 1300
  154. 5100 ' 次の駒生成
  155. 5110 for j=4 to 7: locate 22,j : print " "; : next
  156. 5120 a = b : b = rnd(19)*7+K
  157. 5130 X = 24 : Y = 6 : B = 0x8E9F : A = b : gosub 1000
  158. 5140 x = 5 : y = 2 ' 駒の初期位置
  159. 5150 t = tick + w ' 次のタイムアウト
  160. 5160 l = scan_x3 ' 下が続けて入ってしまうのを避けるため
  161. 5170 goto 3000
  162. 9999 end
  163. 10000 ' いろいろ準備ちゅう...
  164. 10010 randomize tick
  165. 10020 gosub 20000 ' 表示初期化
  166. 10030 play "cego6c2rco5gec2" ' テーマ音楽、でもない。
  167. 10040 gosub 30000 '駒データ準備
  168. 10049 ' ここから再開
  169. 10050 locate 10, 9 : print "P U S H";
  170. 10051 locate 10,11 : print " K E Y ";
  171. 10060 k = wait
  172. 10070 play "#0c#1e#2g"
  173. 10080 for i=0 to 17: locate 9,i : print " ";:next
  174. 11000 ' ゲーム準備
  175. 11010 b = rnd(19)*7+K ' 最初に落とす駒を準備
  176. 11020 w = 90
  177. 11030 for i=0 to K-1: @(i) = 0 : next
  178. 11040 for i=0 to K-1 step 12 : @(i) = 1 : @(i+11) = 1 : next ' ばんぺいくん
  179. 11050 for i=12*22+1 to K-1 : @(i) = 1 : next ' これもばんぺいくん(昇圧回路不要)
  180. 11060 l = 0
  181. 11070 P = 1 ' ぶず
  182. 11080 S = 0 : gosub 1200 ' score
  183. 11090 goto 5000 ' メインループ
  184. 20000 ' 画面初期化
  185. 20010 cls
  186. 20020 for i=0 to 17: locate 8,i: print "左";: locate 19,i:print "右";: next
  187. 20030 locate 2,3 : print "きゃっち";
  188. 20040 locate 4,4 : print "ざ";
  189. 20050 locate 2,5 : print "Buzz";
  190. 20060 locate 2,7 : print "by";
  191. 20070 locate 2,8 : print "流れ星の";
  192. 20080 locate 3,9 : print "ジョヲ";
  193. 20090 locate 22,2 : print "NEXT";
  194. 20100 locate 21,3 : print "┏━━━━┓";
  195. 20110 locate 21,4 : print "┃    ┃";
  196. 20111 locate 21,5 : print "┃    ┃";
  197. 20112 locate 21,6 : print "┃    ┃";
  198. 20113 locate 21,7 : print "┃    ┃";
  199. 20120 locate 21,8 : print "┗━━━━┛";
  200. 20130 locate 21,10 : print "SCORE";
  201. 29999 return
  202. 30000 ' 駒の形
  203. 30001 ' read - data 文も欲しくなる...
  204. 30002 ' データ形式 (7 words/駒)
  205. 30003 ' (センター座標からの x offset, y offset) × 3, 回転先駒データ位置
  206. 30004 K = 23 * 12 : ' フィールド記憶領域の次に駒データを入れるベース位置
  207. 30005 k = K
  208. 30006 ' 縦棒 ID = 0
  209. 30007 @(k ) = 0 : @(k+1) = -2 : @(k+2) = 0 : @(k+3) = -1
  210. 30008 @(k+4) = 0 : @(k+5) = 1 : @(k+6) = k+7: k = k + 7
  211. 30009 ' 横棒 ID = 1
  212. 30010 @(k ) = -1 : @(k+1) = 0 : @(k+2) = -2 : @(k+3) = 0
  213. 30011 @(k+4) = 1 : @(k+5) = 0 : @(k+6) = k-7: k = k + 7
  214. 30012 ' 佐渡島 ID = 2
  215. 30013 @(k ) = 1 : @(k+1) = 0 : @(k+2) = 0 : @(k+3) = 1
  216. 30014 @(k+4) = -1 : @(k+5) = 1 : @(k+6) = k+7: k = k + 7
  217. 30015 ' 立ち佐渡島 ID = 3
  218. 30016 @(k ) = -1 : @(k+1) = -1 : @(k+2) = -1 : @(k+3) = 0
  219. 30017 @(k+4) = 0 : @(k+5) = 1 : @(k+6) = k-7: k = k + 7
  220. 30018 ' 逆佐渡島 ID = 4
  221. 30019 @(k ) = -1 : @(k+1) = 0 : @(k+2) = 0 : @(k+3) = 1
  222. 30020 @(k+4) = 1 : @(k+5) = 1 : @(k+6) = k+7: k = k + 7
  223. 30021 ' 立ち逆佐渡島 ID = 5
  224. 30022 @(k ) = 1 : @(k+1) = -1 : @(k+2) = 1 : @(k+3) = 0
  225. 30023 @(k+4) = 0 : @(k+5) = 1 : @(k+6) = k-7: k = k + 7
  226. 30024 ' L ID=6
  227. 30025 @(k ) = 0 : @(k+1) = -1 : @(k+2) = 0 : @(k+3) = 1
  228. 30026 @(k+4) = 1 : @(k+5) = 1 : @(k+6) = k+7: k = k + 7
  229. 30027 ' L+1 ID=7
  230. 30028 @(k ) = 1 : @(k+1) = -1 : @(k+2) = 1 : @(k+3) = 0
  231. 30029 @(k+4) = -1 : @(k+5) = 0 : @(k+6) = k+7: k = k + 7
  232. 30030 ' L+2 ID=8
  233. 30031 @(k ) = -1 : @(k+1) = -1 : @(k+2) = 0 : @(k+3) = -1
  234. 30032 @(k+4) = 0 : @(k+5) = 1 : @(k+6) = k+7: k = k + 7
  235. 30033 ' L+3 ID=9
  236. 30034 @(k ) = 1 : @(k+1) = 0 : @(k+2) = -1 : @(k+3) = 0
  237. 30035 @(k+4) = -1 : @(k+5) = 1 : @(k+6) = k-21: k = k + 7
  238. 30036 ' 逆L ID=10
  239. 30037 @(k ) = 0 : @(k+1) = -1 : @(k+2) = 0 : @(k+3) = 1
  240. 30038 @(k+4) = -1 : @(k+5) = 1 : @(k+6) = k+7: k = k + 7
  241. 30039 ' 逆L+1 ID=11
  242. 30040 @(k ) = -1 : @(k+1) = 0 : @(k+2) = 1 : @(k+3) = 0
  243. 30041 @(k+4) = 1 : @(k+5) = 1 : @(k+6) = k+7: k = k + 7
  244. 30042 ' 逆L+2 ID=12
  245. 30043 @(k ) = 1 : @(k+1) = -1 : @(k+2) = 0 : @(k+3) = -1
  246. 30044 @(k+4) = 0 : @(k+5) = 1 : @(k+6) = k+7: k = k + 7
  247. 30045 ' 逆L+3 ID=13
  248. 30046 @(k ) = -1 : @(k+1) = -1 : @(k+2) = -1 : @(k+3) = 0
  249. 30047 @(k+4) = 1 : @(k+5) = 0 : @(k+6) = k-21: k = k + 7
  250. 30048 ' 凸 ID=14
  251. 30049 @(k ) = 0 : @(k+1) = -1 : @(k+2) = -1 : @(k+3) = 0
  252. 30050 @(k+4) = 1 : @(k+5) = 0 : @(k+6) = k+7: k = k + 7
  253. 30051 ' 左凸 ID=15
  254. 30052 @(k ) = 0 : @(k+1) = -1 : @(k+2) = -1 : @(k+3) = 0
  255. 30053 @(k+4) = 0 : @(k+5) = 1 : @(k+6) = k+7: k = k + 7
  256. 30054 ' T ID=16
  257. 30055 @(k ) = 1 : @(k+1) = 0 : @(k+2) = -1 : @(k+3) = 0
  258. 30056 @(k+4) = 0 : @(k+5) = 1 : @(k+6) = k+7: k = k + 7
  259. 30057 ' ト ID=17
  260. 30058 @(k ) = 1 : @(k+1) = 0 : @(k+2) = 0 : @(k+3) = -1
  261. 30059 @(k+4) = 0 : @(k+5) = 1 : @(k+6) = k-21: k = k + 7
  262. 30060 ' 田 ID=18
  263. 30061 @(k ) = 0 : @(k+1) = -1 : @(k+2) = -1 : @(k+3) = -1
  264. 30062 @(k+4) = -1 : @(k+5) = 0 : @(k+6) = k : k = k + 7
  265. 31000 return
  266. 32764 ' 結局仕様書をまとめないとコーディングはできないね。
  267. 32765 ' そう単純じゃなかった。
  268. 32766 ' Catch the Buzz - original on Macintosh
  269. 32767 ' reproduced with WONBE by Hirotaka JOE Ohkubo, 2000/12/07