スルーカ by petacorn

再生

 スピーディーなシューティングタイプのアクションゲームだ。
 自機「スルーカ」を十字ボタンで操って、スターを逃さず取っていこう。スルーカの通ったあとは不毛の大地が緑に変わるオマケ付き。
 壁や赤い敵機に当たれば1ミス。Aボタンで敵機を倒すボムが発射できるので、ここぞという場面で使っていこう。ボムの残量は画面上部のゲージで確認できるぞ。スターを取り続ければゲージは回復する。
 STARTボタンはポーズに使う。ゲーム終了はR+STARTボタンだ。
 キミはスターを連続で取るCHAINカウントをどこまで稼げるかな?

私が作りました

petacorn

BASICで書くのは二十数年ぶりじゃわい。


 CHECK POiNT 

博士
爆撃機スツーカ + 敵をすり抜けるスルー力(りょく)で「スルーカ(するーか)」ということかの。なかなか凝った言葉遊びじゃわい。

ワンパク
ヘンなとこで感心してねえで、プログラムを見ろや、ファック! コレけっこう本格的なんじゃねえのか?

神崎
ゲームのシステム上いわゆるショットはないけど、縦スクロールシューティングのヒナ型としてもよさそうだね。

インテリ
通過した後のグラフィックが変わるのは、シューティング以外にも応用できそうな面白い工夫だね。BG面の手前側が透過されて、奥側のBG面が見えるしくみだよ。

プログラムリスト

  1. ’************
  2. ’スル-カ
  3. CLEAR:CLS
  4. VISIBLE 1,1,0,0,0,0
  5. ’
  6. GW=256:GH=192
  7. CW=32:CH=24
  8. BGW=64:BGH=64
  9. FOR I=0 TO 31:SP$=SP$+” ”:NEXT
  10. ’
  11. FPS=0:CNTL=0:CNTF=0
  12. REQ=0:FLW=-1
  13. BTN=0:BTNO=0:BTND=0
  14. TMR=0:PAUSE=0
  15. SCORE=0:HISCORE=10000:SCMAX=500000
  16. LIFE=0:LIFEMAX=3
  17. LEVEL=0:LEVELMAX=99
  18. CHAIN=0:CHAINMAX=0:CHAINMUL=10
  19. CHG=0:CHGMAX=16
  20. SCRX=0:SCRY=0:BGPY=0
  21. SSPD=0:SSPDMIN=2:SSPDMAX=6
  22. STMR=0:STMRMIN=60*20:STMRMAX=0
  23. RX=0:RW=0:RWMIN=13:RWMAX=18
  24. BTMR=-1:BTMRMAX=30
  25. CTMR=0:CTMRMAX=48
  26. ETMR=0:ETMRMIN=32:ETMRMAX=0
  27. PW=8:PH=8:PWH=PW/2:PHH=PH/2
  28. PX=0:PY=0:PSPD=2
  29. OX=8:OY=8
  30. BCSH=5:BSH=(BCSH*2+1)*8/2
  31. ’
  32. DIM RANK(10)
  33. FOR I=0 TO 10-1
  34.  RANK(I)=HISCORE-I*1000
  35. NEXT
  36. DIM BC(4),BP(4)
  37. BC(0)=&H020:BP(0)=1
  38. BC(1)=&H30F:BP(1)=2
  39. BC(2)=&H025:BP(2)=9
  40. BC(3)=&H065:BP(3)=9
  41. ESN=8:EN=4
  42. CSN=ESN+EN:CN=6
  43. BSN=CSN+CN:BN=10
  44. DIM EX(EN),EY(EN),EF(EN)
  45. DIM CX(CN),CY(CN),CF(CN)
  46. DIM BX(BN),BY(BN),BS(BN,2)
  47. ’
  48. ’************
  49. @LOOP
  50. CNTL=MAINCNTL:FPS=0
  51. BTNO=BTN:BTN=BUTTON()
  52. BTND=BTNO XOR BTN AND BTN
  53. IF BTN==512+1024 THEN @EXIT
  54. GOSUB @PAUSECHK
  55. IF PAUSE GOTO @JPPAUSE
  56. IF FLW==REQ GOTO @JPFLOW
  57. FLW=REQ
  58. ON FLW GOSUB @TTLI,@GNEWI,@GSTI,@GAMEI,@GMSI,@GCLRI,@GOVI,@RNKI
  59. @JPFLOW
  60. ON FLW GOSUB @TTLL,@GNEWL,@GSTL,@GAMEL,@GMSL,@GCLRL,@GOVL,@RNKL
  61. @JPPAUSE
  62. VSYNC 1
  63. CNTF=(CNTF+1) AND &H7FFFF
  64. GOSUB @FPSPRT
  65. GOTO @LOOP
  66. @EXIT
  67. PNLTYPE”KYA”
  68. VISIBLE 1,1,0,0,0,0
  69. BGMSTOP
  70. GOSUB @GALLCLR
  71. END
  72. ’************
  73. ’SUB
  74. @FPSPRT
  75. CNTL=MAINCNTL-CNTL
  76. IF CNTL THEN FPS=60/CNTL
  77. COLOR 3:LOCATE 0,23
  78. PRINT FLOOR(FPS);” ”;
  79. RETURN
  80. ’PAUSE CHECK START BUTTON PAUSE
  81. @PAUSECHK
  82. IF FLW!=3 THEN RETURN
  83. IF (BTND AND 1024)==0 THEN RETURN
  84. PAUSE=(PAUSE==0)
  85. BEEP 3
  86. S$=”PAUSE”
  87. IF PAUSE==0 THEN S$=MID$(SP$,0,LEN(S$))
  88. COLOR 3:LOCATE 13,11
  89. PRINT S$
  90. RETURN
  91. ’ALL CLEAR
  92. @GALLCLR
  93. CLS:COLOR 0
  94. SPPAGE 1:SPCLR:SPPAGE 0:SPCLR
  95. FOR I=0 TO 1
  96.  BGPAGE I
  97.  BGOFS 0,0,0:BGOFS 1,0,0
  98.  BGCLIP 0,0,31,23
  99.  FOR Y=0 TO BGH-1
  100.   FOR X=0 TO BGW-1
  101.    BGPUT 0,X,Y,0,0,0,0
  102.    BGPUT 1,X,Y,0,0,0,0
  103.   NEXT
  104.  NEXT
  105. NEXT
  106. BGPAGE 0
  107. GPAGE 1:GCOLOR 0:GCLS
  108. GPAGE 0:GCOLOR 0:GCLS
  109. RETURN
  110. ’************
  111. ’FLOW
  112. ’TITLE
  113. @TTLI
  114. BGMSTOP
  115. VISIBLE 1,1,0,0,0,0
  116. GOSUB @GALLCLR
  117. RESTORE @TITLED
  118. YY=CH
  119. FOR Y=0 TO 5
  120.  XX=2
  121.  FOR X=0 TO 1
  122.   READ C
  123.   B=&H8000
  124.   FOR I=0 TO 15
  125.    IF C AND B THEN BGPUT 1,XX,YY,BC(1),BP(1),0,0
  126.    XX=XX+1:B=B/2
  127.   NEXT
  128.  NEXT
  129.  YY=YY+1
  130. NEXT
  131. VISIBLE 1,1,1,1,1,1
  132. BGOFS 1,0,GH-2*8,60
  133. TMR=60*10
  134. RETURN
  135. @TTLL
  136. TMR=TMR-1
  137. IF TMR<=0 THEN REQ=7
  138. COLOR 0:LOCATE 9,16
  139. S$=”PUSH A BUTTON”
  140. IF CNTF AND &H20 THEN S$=MID$(SP$,0,LEN(S$))
  141. PRINT S$
  142. IF BTND AND 16 THEN REQ=1
  143. LOCATE 11,20
  144. PRINT CHR$(&H13);”:MOVE”
  145. LOCATE 11,21
  146. PRINT CHR$(&H01);”:BOMBER”
  147. RETURN
  148. ’NEW GAME
  149. @GNEWI
  150. SCORE=0:LEVEL=0
  151. SSPD=SSPDMIN
  152. RW=RWMAX
  153. LIFE=LIFEMAX
  154. CHG=0
  155. REQ=2
  156. RETURN
  157. @GNEWL
  158. RETURN
  159. ’GAME START
  160. @GSTI
  161. CLS
  162. TMR=60*2
  163. L=LEVEL%10
  164. STMR=0
  165. STMRMAX=LEVEL*60*2+STMRMIN
  166. RW=RWMAX-L
  167. IF RW<RWMIN THEN RW=RWMIN
  168. RX=(CW-RW)/2
  169. SSPD=SSPDMIN+(L*0.5)
  170. IF SSPD>SSPDMAX THEN SSPD=SSPDMAX
  171. ETMRMAX=100-(L*5)
  172. IF ETMRMAX<ETMRMIN THEN ETMRMAX=ETMRMIN
  173. PX=GW/2:PY=GH-PH-16
  174. SCRX=0:SCRY=0:BGPY=9999
  175. CHAIN=0:CHAINMAX=0
  176. CHG=CHGMAX
  177. BTMR=-1
  178. GOSUB @GBGI
  179. GOSUB @PLAYERI
  180. GOSUB @ENEMYI
  181. GOSUB @COINI
  182. GOSUB @BOMBEFFI
  183. GOSUB @SCOREI
  184. BGOFS 1,SCRX,SCRY
  185. SPOFS 0,PX-OX,PY-OY
  186. VISIBLE 1,1,1,1,1,1
  187. BGMPLAY 4
  188. COLOR 0:LOCATE 12,10
  189. PRINT”LEVEL ”;LEVEL+1
  190. LOCATE 12,12
  191. PRINT”LEFT  ”;LIFE-1
  192. LOCATE 12,14
  193. PRINT FLOOR(STMRMAX/60);”SEC THROUGH”
  194. RETURN
  195. @GSTL
  196. TMR=TMR-1
  197. IF TMR<=0 THEN REQ=3
  198. IF REQ!=FLW THEN CLS:GOSUB @SCOREI
  199. RETURN
  200. ’GAME
  201. @GAMEI
  202. BGMPLAY 3
  203. RETURN
  204. @GAMEL
  205. GOSUB @GBG
  206. GOSUB @PLAYER
  207. GOSUB @ENEMY
  208. GOSUB @COIN
  209. GOSUB @BOMBEFF
  210. GOSUB @SCORE
  211. RETURN
  212. ’GAME MISS
  213. @GMSI
  214. LIFE=LIFE-1
  215. TMR=60*2
  216. SPSET 1,&HF8,0,0,0,1
  217. SPOFS 1,PX-OX,PY-OY
  218. SPANIM 1,3,4,0
  219. BEEP 13:BGMSTOP
  220. RETURN
  221. @GMSL
  222. TMR=TMR-1
  223. IF TMR<=0 THEN REQ=2
  224. IF REQ==2 AND LIFE<=0 THEN REQ=6
  225. IF REQ!=FLW THEN SPCLR 1
  226. RETURN
  227. ’GAME STAGE CLEAR
  228. @GCLRI
  229. LEVEL=LEVEL+1
  230. IF LEVEL>LEVELMAX THEN LEVEL=LEVELMAX
  231. TMR=60*3
  232. SCORE=SCORE+CHAINMAX*CHAINMUL
  233. GOSUB @SCORE
  234. BGMPLAY 5
  235. SPOFS 0,PX-OX,PY-OY-GH-16,TMR/3
  236. COLOR 0
  237. LOCATE 13,10
  238. PRINT”CLEAR”
  239. LOCATE 10,12
  240. PRINT”MAX CHAIN ”;CHAINMAX
  241. LOCATE 10,14
  242. PRINT”BONUS ”;CHAINMAX*CHAINMUL;”0”
  243. RETURN
  244. @GCLRL
  245. TMR=TMR-1
  246. IF TMR<=0 THEN REQ=2
  247. GOSUB @BOMBEFF
  248. RETURN
  249. ’GAME OVER
  250. @GOVI
  251. TMR=60*6
  252. BGMPLAY 6
  253. COLOR 13
  254. LOCATE 11,11:PRINT”GAME OVER”
  255. COLOR 0
  256. RETURN
  257. @GOVL
  258. IF BTND AND 16 THEN REQ=7
  259. TMR=TMR-1
  260. IF TMR<=0 THEN REQ=7
  261. RETURN
  262. ’RANKING
  263. @RNKI
  264. BGMSTOP
  265. GOSUB @GALLCLR
  266. TMR=60*10
  267. IF SCORE>HISCORE THEN HISCORE=SCORE
  268. RANKIN=-1
  269. FOR I=0 TO 9
  270.  IF SCORE>=RANK(I) THEN RANKIN=I:I=9999
  271. NEXT
  272. IF RANKIN<0 THEN @JPRANKIN
  273. FOR I=8 TO RANKIN STEP -1
  274.  RANK(I+1)=RANK(I)
  275. NEXT
  276. RANK(RANKIN)=SCORE
  277. @JPRANKIN
  278. COLOR 0:LOCATE 8,5
  279. PRINT”TODAY’S RANKING”
  280. FOR I=0 TO 10-1
  281.  COLOR 0
  282.  IF I==RANKIN THEN COLOR 3
  283.  S$=STR$(I+1)
  284.  LOCATE 8+(6-LEN(S$)),7+I
  285.  PRINT S$
  286.  S$=STR$(RANK(I))
  287.  LOCATE 15+(6-LEN(S$)),7+I
  288.  PRINT S$;”0”
  289. NEXT
  290. SCORE=0
  291. RETURN
  292. @RNKL
  293. TMR=TMR-1
  294. IF TMR<=0 THEN REQ=0
  295. IF BTND AND 16 THEN REQ=0
  296. RETURN
  297. ’************
  298. ’GAME SUB
  299. ’PLAYER
  300. @PLAYERI
  301. SPSET 0,&H8B,11,0,0,2
  302. RETURN
  303. @PLAYER
  304. IF BTN AND 1 THEN PY=PY-PSPD
  305. IF BTN AND 2 THEN PY=PY+PSPD
  306. IF BTN AND 4 THEN PX=PX-PSPD
  307. IF BTN AND 8 THEN PX=PX+PSPD
  308. IF PX<OX THEN PX=OX
  309. IF PX>GW-OX THEN PX=GW-OX
  310. IF PY<OY THEN PY=OY
  311. IF PY>GH-OY THEN PY=GH-OY
  312. SPOFS 0,PX-OX,PY-OY
  313. GOSUB @BOMBER
  314. HF=0
  315. FOR Y=-PHH TO PHH STEP PHH
  316.  YY=(Y+PY+SCRY)/PH
  317.  FOR X=-PWH TO PWH STEP PWH
  318.   XX=(X+PX+SCRX)/PW
  319.   BGREAD(1,XX,YY),C,P,H,V
  320.   IF C==BC(1) THEN HF=1
  321.   IF C==BC(3) THEN REQ=5
  322.   IF C!=BC(0) THEN @JPHIT
  323.   BGPUT 1,XX,YY,BC(2),BP(2),0,0
  324.   SCORE=SCORE+1
  325. @JPHIT
  326.  NEXT
  327. NEXT
  328. IF HF THEN REQ=4
  329. RETURN
  330. ’BOMBER
  331. @BOMBER
  332. IF (BTND AND 16)==0 THEN RETURN
  333. IF CHG<CHGMAX THEN RETURN
  334. CHG=0
  335. BEEP 10:BEEP 13
  336. YY=(PY+SCRY)/8
  337. FOR Y=-BCSH TO BCSH
  338.  XX=(PX+SCRX)/8
  339.  FOR X=-BCSH TO BCSH
  340.   BGPUT 1,XX+X,YY+Y,BC(2),BP(2),0,0
  341.  NEXT
  342. NEXT
  343. FOR I=0 TO EN-1
  344.  IF EF(I)<=0 THEN @JPBOMB
  345.  IF PY-BSH>EY(I)+OY THEN @JPBOMB
  346.  IF PY+BSH<EY(I)-OY THEN @JPBOMB
  347.  IF PX-BSH>EX(I)+OX THEN @JPBOMB
  348.  IF PX+BSH<EX(I)-OX THEN @JPBOMB
  349.  EF(I)=0
  350.  SPCLR ESN+I
  351. @JPBOMB
  352. NEXT
  353. BTMR=BTMRMAX
  354. S=BSH/BTMR
  355. FOR I=0 TO BN-1
  356.  BX(I)=PX:BY(I)=PY
  357.  R=RAD(I*360/BN)
  358.  BS(I,0)=COS(R)*S
  359.  BS(I,1)=SIN(R)*S
  360.  SPSET BSN+I,&H34,3,0,0,1
  361.  SPOFS BSN+I,BX(I)-OX,BY(I)-OY
  362.  SPANIM BSN+I,4,4,0
  363. NEXT
  364. RETURN
  365. ’BOMBER EFFECT
  366. @BOMBEFFI
  367. FOR I=0 TO BN-1
  368.  SPCLR BSN+I
  369. NEXT
  370. RETURN
  371. @BOMBEFF
  372. IF BTMR<0 THEN RETURN
  373. BTMR=BTMR-1
  374. IF BTMR<0 THEN @BOMBEFFI
  375. FOR I=0 TO BN-1
  376.  BX(I)=BX(I)+BS(I,0)
  377.  BY(I)=BY(I)+BS(I,1)+SSPD
  378.  SPOFS BSN+I,BX(I)-OX,BY(I)-OY
  379. NEXT
  380. RETURN
  381. ’ENEMY
  382. @ENEMYI
  383. FOR I=0 TO EN-1
  384.  EF(I)=0
  385.  SPCLR ESN+I
  386. NEXT
  387. RETURN
  388. @ENEMYGEN
  389. IF STMR>=STMRMAX THEN RETURN
  390. ETMR=ETMR+SSPD
  391. IF ETMR<ETMRMAX THEN RETURN
  392. EI=-1:ETMR=0
  393. FOR I=0 TO EN-1
  394.  IF EF(I)<=0 THEN EI=I:I=9999
  395. NEXT
  396. IF EI<0 THEN RETURN
  397. EX(EI)=(RX+RND(RW))*8
  398. EY(EI)=-OY
  399. EF(EI)=1
  400. SPSET ESN+EI,&HB2,11,0,0,2
  401. SPOFS ESN+EI,EX(EI)-OX,EY(EI)-OY
  402. SPANIM ESN+EI,3,8,0
  403. RETURN
  404. @ENEMY
  405. GOSUB @ENEMYGEN
  406. FOR I=0 TO EN-1
  407.  IF EF(I)<=0 THEN @JPENE
  408.  EY(I)=EY(I)+SSPD
  409.  IF EY(I)>=GH+OY THEN @ENECLR
  410.  SPOFS ESN+I,EX(I)-OX,EY(I)-OY
  411.  IF PY-PHH>EY(I)+OY THEN @JPENE
  412.  IF PY+PHH<EY(I)-OY THEN @JPENE
  413.  IF PX-PWH>EX(I)+OX THEN @JPENE
  414.  IF PX+PWH<EX(I)-OX THEN @JPENE
  415.  REQ=4
  416. @ENECLR
  417.  EF(I)=0
  418.  SPCLR ESN+I
  419. @JPENE
  420. NEXT
  421. RETURN
  422. ’COINトイウカSTAR
  423. @COINI
  424. CTMR=0
  425. FOR I=0 TO CN-1
  426.  CF(I)=0
  427.  SPCLR CSN+I
  428. NEXT
  429. RETURN
  430. @COINGEN
  431. IF STMR>=STMRMAX THEN RETURN
  432. CTMR=CTMR+SSPD
  433. IF CTMR<CTMRMAX THEN RETURN
  434. CTMR=0:CI=-1
  435. FOR I=0 TO CN-1
  436.  IF CF(I)<=0 THEN CI=I:I=9999
  437. NEXT
  438. IF CI<0 THEN RETURN
  439. CX(CI)=(RX+RW/2)*8+RND(32)-16
  440. CY(CI)=-OY
  441. CF(CI)=1
  442. SPSET CSN+CI,&H9C,3,0,0,2
  443. SPOFS CSN+CI,CX(CI)-OX,CY(CI)-OY
  444. SPANIM CSN+CI,4,4,0
  445. RETURN
  446. @COIN
  447. GOSUB @COINGEN
  448. FOR I=0 TO CN-1
  449.  IF CF(I)<=0 THEN @JPCOIN
  450.  CY(I)=CY(I)+SSPD
  451.  IF CY(I)>=GH+OY THEN CHAIN=0:GOTO @COINCLR
  452.  SPOFS CSN+I,CX(I)-OX,CY(I)-OY
  453.  IF PY-PHH>CY(I)+OY THEN @JPCOIN
  454.  IF PY+PHH<CY(I)-OY THEN @JPCOIN
  455.  IF PX-PWH>CX(I)+OX THEN @JPCOIN
  456.  IF PX+PWH<CX(I)-OX THEN @JPCOIN
  457.  BEEP 7
  458.  SCORE=SCORE+1
  459.  CHAIN=CHAIN+1
  460.  IF CHAIN>CHAINMAX THEN CHAINMAX=CHAIN
  461.  CHGO=CHG:CHG=CHG+1
  462.  IF CHG>CHGMAX THEN CHG=CHGMAX
  463.  IF CHGO!=CHG AND CHG==CHGMAX THEN BEEP 37
  464. @COINCLR
  465.  CF(I)=0
  466.  SPCLR CSN+I
  467. @JPCOIN
  468. NEXT
  469. RETURN
  470. ’BG
  471. @GBGI
  472. BGPAGE 0
  473. FOR Y=0 TO CH-1
  474.  FOR X=0 TO CW-1
  475.   BGPUT 1,X,Y,BC(1),BP(1),0,0
  476.  NEXT
  477.  FOR X=RX TO RX+RW-1
  478.   BGPUT 1,X,Y,BC(0),BP(0),0,0
  479.  NEXT
  480. NEXT
  481. RETURN
  482. @GBG
  483. STMR=STMR+1
  484. BGPYO=BGPY
  485. BGPY=((SCRY-7)/8) AND 63
  486. IF BGPYO==BGPY THEN @JPGBG
  487. IF STMR>=STMRMAX THEN @BGGOAL
  488. FOR X=0 TO RX-1
  489.  BGPUT 1,X,BGPY,BC(1),BP(1),0,0
  490. NEXT
  491. FOR X=RX TO RX+RW-1
  492.  BGPUT 1,X,BGPY,BC(0),BP(0),0,0
  493. NEXT
  494. FOR X=RX+RW TO CW-1
  495.  BGPUT 1,X,BGPY,BC(1),BP(1),0,0
  496. NEXT
  497. GOTO @JPBGGOAL
  498. @BGGOAL
  499. FOR X=0 TO CW-1
  500.  BGPUT 1,X,BGPY,BC(3),BP(3),0,0
  501. NEXT
  502. @JPBGGOAL
  503. RX=RX+RND(3)-1
  504. IF RX<1 THEN RX=1
  505. IF RX>CW-RW-1 THEN RX=CW-RW-1
  506. @JPGBG
  507. SCRY=SCRY-SSPD
  508. IF SCRY<0 THEN SCRY=SCRY AND 511
  509. BGOFS 1,SCRX,SCRY
  510. RETURN
  511. ’SCORE ETC.
  512. @SCOREI
  513. COLOR 3:LOCATE 0,0
  514. ’0123456789012345678901234567890123456789
  515. PRINT”SCORE:      0   HI-SCORE:      0”;
  516. LOCATE 0,1
  517. FOR I=0 TO LIFE-2
  518.  PRINT CHR$(5);
  519. NEXT
  520. S$=STR$(HISCORE)
  521. LOCATE 25+(6-LEN(S$)),0
  522. PRINT S$
  523. @SCORE
  524. IF SCORE>SCMAX THEN SCORE=SCMAX
  525. COLOR 3
  526. S$=STR$(SCORE)
  527. LOCATE 6+(6-LEN(S$)),0
  528. PRINT S$
  529. P=0
  530. IF (CHG>=CHGMAX) AND (CNTF AND 2)!=0 THEN P=2
  531. SPSET 2,&HDB,P,0,0,1
  532. SPOFS 2,112,12-16*CHG/CHGMAX
  533. SPSCALE 2,CHG/CHGMAX*200
  534. RETURN
  535. ’************
  536. ’DATA
  537. ’TITLE DATA
  538. @TITLED
  539. DATA &H7C04,&H0080
  540. DATA &H0824,&H03F0
  541. DATA &H1024,&HF890
  542. DATA &H2048,&H0120
  543. DATA &H5092,&H0220
  544. DATA &H8D1C,&H0440