SHOOT! by 武部健一

再生

 あの『日経ソフトウエア』からの投稿! 近日発売の6月号(2011年4月23日発売予定)ではプチコンがちょっとだけ記事になるぞ。
 プログラムは本格派のシューティング。十字ボタンで自機を操作して、Aボタンのショットで敵機を破壊しよう。
 弾は微妙に角度をつけて発射される。Aボタン押しっぱなしで連射になるぞ。
 キミは敵の猛攻をくぐり抜けてボスキャラクターを倒せるかな?

私が作りました

武部健一

本業は日経ソフトウエアの編集者です。FM-NEW7のユーザーでした。
BASICは超久しぶり!
プチコンをまだよくわかっていないときに作ったのでちょっと無意味なコード(CHRINITの呼び出し)が混じってますがカンベン!


 CHECK POiNT 

博士
ほほう、紙媒体の雑誌記事にも登場か。これでまた一歩『年刊 A● Sk●!』に近づいたわい。

神崎
そこ?

博士
ともあれ、非常にシンプルなリストでこれだけ本格的に作ってあるのはサスガじゃな。
作者コメントにはCHRINITが無意味とあるが、他のプログラムの後に実行することも考えればこれも必要じゃろう。

インテリ
読みやすいプログラムリストだから参考にするにはとても良さそうだね。

ワンパク
テメエら大企業相手だからって逃げ腰になってんじゃねえぞ! ゲット・ピス! ハードすぎてなかなか勝てねえぜ、シット!

博士
せっかく分かりやすいプログラムなのじゃから、敵の出現率を低めたり、敵弾の角度を限定したりと改造してもいいかもしれんな。
敵弾はATAN関数に引数を2つ渡して自機の方向を求めているのがポイントじゃ。ワシの青春時代は敵弾は16方向限定とかよくあったものじゃよ。

ワンパク
(ん? ……博士の青春時代……? ジジイ、本当はいくつなんだ?)

プログラムリスト

  1. @START
  2. CLEAR:CLS:GCLS:SPCLR:COLOR 0
  3. VISIBLE 0,0,0,0,0,0
  4. SCORE=0:TIME=0
  5. ’シ゛キ ショキカ SP=0
  6. CHRINIT ”SPU4”
  7. SPSET 0,288,3,0,0,0
  8. SHIPX=120:SHIPY=130
  9. ’シ゛タ゛ン ショキカ SP=1―9
  10. DIM SHOTX(9),SHOTY(9)
  11. DIM SHOTL(9)
  12. CHRINIT ”SPU3”
  13. FOR I=0 TO 8
  14.  SPSET I+1,202,0,0,0,0
  15.  SPOFS I+1,-100,0
  16.  SHOTX(I)=-100:SHOTY(I)=0
  17.  SHOTL(I)=0
  18. NEXT I
  19. SHOTI=0:SHOTSK=0
  20. ’テキ ショキカ SP=10―15
  21. CHRINIT ”SPU2”
  22. DIM EX(6),EY(6),EL(6),ED(6)
  23. DIM EVX(6),EVY(6)
  24. FOR I=0 TO 5
  25.  SPSET I+10,180,3,0,0,0
  26.  SPANIM I+10,3,3
  27.  SPOFS I+10,0,-16
  28.  EX(I)=0:EY(I)=0:EL(I)=0
  29.  ED(I)=1:EVX(I)=0:EVY(I)=2
  30. NEXT I
  31. ’テキタ゛ン ショキカ SP=16―21
  32. CHRINIT ”SPU3”
  33. DIM ESX(6),ESY(6),ESL(6)
  34. DIM ESVX(6),ESVY(6)
  35. FOR I=0 TO 5
  36.  SPSET I+16,203,0,0,0,0
  37.  SPOFS I+16,0,-16
  38.  ESX(I)=0:ESY(I)=0:ESL(I)=0
  39.  ESVX(I)=0:ESVY(I)=0
  40. NEXT I
  41. ’シ゛キ ハ゛クハツハ゜タ-ン ショキカ SP=22
  42. SPSET 22,249,0,0,0,0
  43. SPANIM 22,5,5
  44. SPOFS 22,0,-16
  45. ’テキ ハ゛クハツハ゜タ-ン ショキカ SP=23
  46. SPSET 23,251,0,0,0,0
  47. SPANIM 23,3,3
  48. SPOFS 23,0,-16
  49. EEX=0:EEY=0:EEC=0
  50. ’ホ゛ス ショキカ
  51. CHRINIT ”SPU7”
  52. FOR I=0 TO 15
  53.  SPSET I+24,496+I,2,0,0,0
  54.  SPOFS I+24,0,-16
  55. NEXT I
  56. GAMEOVER=0
  57. ’ハイケイ ショキカ
  58. DIM BGX(15),BGY(15),BGC(15)
  59. FOR I=0 TO 14
  60.  BGX(I)=RND(256)
  61.  BGY(I)=RND(192)
  62.  BGC(I)=RND(255)
  63. NEXT I
  64. VISIBLE 1,1,0,0,1,1
  65. COLORT=0
  66. ’タイトル
  67. @TITLE
  68. LOCATE 0,4:COLOR COLORT
  69. PRINT”       ┿┿ ┿ ┿  ┿   ┿  ┿┿┿ ┿”
  70. PRINT”      ┿   ┿ ┿ ┿ ┿ ┿ ┿  ┿  ┿”
  71. PRINT”      ┿   ┿ ┿ ┿ ┿ ┿ ┿  ┿  ┿”
  72. PRINT”      ┿   ┿ ┿ ┿ ┿ ┿ ┿  ┿  ┿”
  73. PRINT”       ┿  ┿┿┿ ┿ ┿ ┿ ┿  ┿  ┿”
  74. PRINT”        ┿ ┿ ┿ ┿ ┿ ┿ ┿  ┿  ┿”
  75. PRINT”        ┿ ┿ ┿ ┿ ┿ ┿ ┿  ┿   ”
  76. PRINT”      ┿┿  ┿ ┿  ┿   ┿   ┿  ┿”
  77. PRINT””
  78. LOCATE 6,15
  79. PRINT”フ゜ロク゛ラム BY ニッケイ ソフトウエア”
  80. COLORT=COLORT+1
  81. IF COLORT==16 THEN COLORT=0
  82. SPOFS 0,120,130
  83. K=BUTTON()
  84. LOCATE 8,20
  85. PRINT”HIT START BUTTON”
  86. IF K AND 1024 GOTO @MLPINIT
  87. GOTO @TITLE
  88. ’メインル-フ゜ ノ ショキカ
  89. @MLPINIT
  90. COLOR 0:CLS:BGMPLAY 0
  91. ’メインル-フ゜
  92. @MAINLOOP
  93. LOCATE 0,0:PRINT”SCORE:”
  94. LOCATE 6,0:PRINT STR$(SCORE)
  95. GOSUB @DRAWBG
  96. GOSUB @SHIPMOVE
  97. GOSUB @ENEGEN
  98. GOSUB @ENEMOVE
  99. GOSUB @ENESHOT
  100. GOSUB @SHOTMOVE
  101. GOSUB @HITTEST
  102. IF GAMEOVER==1 GOTO @G_OVER
  103. ’テキ ハ゛クハツ
  104. IF EEC>0 THEN EEC=EEC-1:SPOFS 23,EEX,EEY
  105. IF EEC==0 THEN SPOFS 23,0,-17
  106. IF TIME>3000 GOTO @_BOSLOOP
  107. GOTO @MAINLOOP
  108. @_BOSLOOP
  109. BOSSY=-65:BOSSVY=0.1
  110. BOSSD=50:BCOUNT=0:BOSSDEAD=0
  111. @BOSSLOOP
  112. LOCATE 0,0:PRINT”SCORE:”
  113. LOCATE 6,0:PRINT STR$(SCORE)
  114. GOSUB @BOSSMOVE
  115. GOSUB @BOSSATK
  116. GOSUB @SHIPMOVE
  117. GOSUB @SHOTMOVE
  118. GOSUB @ENEMOVE2
  119. GOSUB @ENESHOT
  120. GOSUB @HITTEST
  121. GOSUB @BOSSHIT
  122. IF EEC>0 THEN EEC=EEC-1:SPOFS 23,EEX,EEY
  123. IF EEC==0 THEN SPOFS 23,0,-17
  124. BCOUNT=BCOUNT+0.5
  125. IF BCOUNT>65535 THEN BOSSDEAD=1
  126. IF BOSSDEAD==1 GOTO @BOSSDEAD
  127. IF GAMEOVER==1 GOTO @G_OVER
  128. GOTO @BOSSLOOP
  129. @BOSSDEAD
  130. BEEP 13
  131. TIME=0
  132. SCORE=SCORE+5000
  133. EEX=BOSSX+32:EEY=BOSSY+32
  134. EEC=16
  135. FOR I=0 TO 15
  136.  SPOFS I+24,0,-16
  137. NEXT I
  138. BOSSX=-100
  139. FOR I=0 TO 5
  140.  EVX(I)=0:EVY(I)=2
  141. NEXT I
  142. GOTO @MAINLOOP
  143. @BOSSATK
  144. FOR I=0 TO 5
  145.  IF EL(I)==1 GOTO @SKBOSA
  146.  EX(I)=BOSSX+I*12
  147.  EY(I)=BOSSY+50
  148.  EL(I)=1
  149.  T=ATAN(SHIPY-EY(I),SHIPX+4-EX(I))
  150.  EVX(I)=COS(T)
  151.  EVY(I)=SIN(T)
  152. @SKBOSA
  153. NEXT I
  154. GOSUB @ENEGEN
  155. RETURN
  156. @BOSSMOVE
  157. BOSSX=70*COS(BCOUNT/16)+96
  158. BOSSY=BOSSY+BOSSVY
  159. IF BOSSY>80 THEN BOSSVY=-0.1
  160. IF BOSSY<-12 THEN BOSSVY=0.1
  161. FOR I=0 TO 3
  162.  SPOFS I+24,BOSSX+I*16,BOSSY
  163.  SPOFS I+28,BOSSX+I*16,BOSSY+16
  164.  SPOFS I+32,BOSSX+I*16,BOSSY+32
  165.  SPOFS I+36,BOSSX+I*16,BOSSY+48
  166. NEXT I
  167. RETURN
  168. @DRAWBG
  169. FOR I=O TO 14
  170.  GPSET BGX(I),BGY(I),0
  171.  BGY(I)=BGY(I)+4
  172. NEXT I
  173. FOR I=O TO 14
  174.  GPSET BGX(I),BGY(I),BGC(I)
  175.  IF BGY(I)>191 THEN BGY(I)=0
  176. NEXT I
  177. RETURN
  178. @G_OVER
  179. BGMSTOP:BEEP 13:SPCLR 0
  180. @_G_OVER
  181. SPOFS 22,SHIPX,SHIPY
  182. SPSCALE 22,200
  183. LOCATE 12,11:PRINT”GAME OVER”
  184. LOCATE 8,20:
  185. PRINT”HIT START BUTTON”
  186. K=BUTTON()
  187. IF K AND 1024 GOTO @START
  188. GOTO @_G_OVER
  189. @BOSSHIT
  190. FOR I=0 TO 8
  191.  IF SHOTX(I)+8<BOSSX GOTO @SKBHIT
  192.  IF SHOTX(I)>BOSSX+64 GOTO @SKBHIT
  193.  IF SHOTY(I)+8<BOSSY GOTO @SKBHIT
  194.  IF SHOTY(I)>BOSSY+50 GOTO @SKBHIT
  195.  ’アタリ 
  196.  SHOTL(I)=0:SHOTY(I)=-200
  197.  SPOFS I+1,SHOTX(I),SHOTY(I)
  198.  BOSSD=BOSSD-1 
  199.  IF BOSSD<0 THEN BOSSDEAD=1
  200.  BEEP 11,64
  201. @SKBHIT
  202. NEXT I
  203. IF SHIPX+16<BOSSX THEN RETURN
  204. IF SHIPX>BOSSX+64 THEN RETURN
  205. IF SHIPY+16<BOSSY THEN RETURN
  206. IF SHIPY>BOSSY+64 THEN RETURN
  207. GAMEOVER=1
  208. RETURN
  209. @HITTEST 
  210. ’シ゛タ゛ン ト テキ
  211. FOR J=0 TO 5
  212.  FOR I=0 TO 8
  213.   IF SHOTX(I)+8<EX(J) GOTO @S1
  214.   IF SHOTX(I)>EX(J)+8 GOTO @S1
  215.   IF SHOTY(I)+8<EY(J) GOTO @S1
  216.   IF SHOTY(I)>EY(J)+8 GOTO @S1
  217.   ’アタリ
  218.   SCORE=SCORE+100
  219.   TIME=TIME+100
  220.   SHOTL(I)=0:SHOTY(I)=-200
  221.   SPOFS I+1,SHOTX(I),SHOTY(I)
  222.   ED(J)=ED(J)-1 
  223.   IF ED(J)!=0 GOTO @S1
  224.   EL(J)=0:ED(J)=1
  225.   EEX=EX(J):EEY=EY(J):EEC=16
  226.   BEEP 13,0,64
  227.  @S1
  228.  NEXT I
  229. NEXT J
  230. ’シ゛キ ト テキタ゛ン
  231. FOR I=0 TO 5
  232.  IF ESX(I)+4<SHIPX GOTO @S2
  233.  IF ESX(I)>SHIPX+4 GOTO @S2
  234.  IF ESY(I)+4<SHIPY GOTO @S2
  235.  IF ESY(I)>SHIPY+4 GOTO @S2
  236.  ’アタリ
  237.  GAMEOVER=1
  238. @S2
  239. NEXT I
  240. ’シ゛キ ト テキ
  241. FOR I=0 TO 5
  242.  IF EX(I)+8<SHIPX GOTO @S3
  243.  IF EX(I)>SHIPX+4 GOTO @S3
  244.  IF EY(I)+8<SHIPY GOTO @S3
  245.  IF EY(I)>SHIPY+4 GOTO @S3
  246.  ’アタリ
  247.  GAMEOVER=1
  248. @S3
  249. NEXT I
  250. RETURN
  251. @ENEGEN
  252. FOR I=0 TO 5
  253.  IF EL(I)==0 THEN EL(I)=1:EX(I)=RND(240):EY(I)=-16-RND(100)
  254. NEXT I
  255. RETURN
  256. @ENESHOT
  257. FOR I=0 TO 5
  258.  IF ESL(I)==1 GOTO @S4
  259.  R=RND(5)
  260.  IF EL(R)==0 THEN RETURN
  261.  T=ATAN(SHIPY-EY(R),SHIPX+4-EX(R))
  262.  ESX(I)=EX(R)
  263.  ESY(I)=EY(R)
  264.  ESVX(I)=3*COS(T)
  265.  ESVY(I)=3*SIN(T)
  266.  ESL(I)=1
  267. @S4
  268. NEXT I
  269. RETURN
  270. @ENEMOVE
  271. FOR I=0 TO 5
  272.  SPOFS I+10,EX(I),EY(I)
  273.  EY(I)=EY(I)+EVY(I)
  274.  EX(I)=EX(I)+EVX(I)
  275.  IF EY(I) > 191 THEN EL(I)=0
  276. NEXT I
  277. RETURN
  278. @ENEMOVE2
  279. FOR I=0 TO 5
  280.  SPOFS I+10,EX(I),EY(I)
  281.  EY(I)=EY(I)+EVY(I)
  282.  EX(I)=EX(I)+EVX(I)
  283.  IF EY(I) > 191 THEN EL(I)=0
  284.  IF EY(I) < -16 THEN EL(I)=0
  285.  IF EX(I) > 255 THEN EL(I)=0
  286.  IF EX(I) < -16 THEN EL(I)=0
  287. NEXT I
  288. RETURN
  289. @SHIPMOVE
  290. SPOFS O,SHIPX,SHIPY
  291. K=BUTTON()
  292. IF K AND 1 THEN SHIPY=SHIPY-3
  293. IF K AND 2 THEN SHIPY=SHIPY+3
  294. IF K AND 4 THEN SHIPX=SHIPX-3.5
  295. IF K AND 8 THEN SHIPX=SHIPX+3.5
  296. IF K AND 16 THEN GOSUB @FIRE
  297. IF SHIPX>242 THEN SHIPX=242
  298. IF SHIPX<0   THEN SHIPX=0
  299. IF SHIPY<0   THEN SHIPY=0
  300. IF SHIPY>175 THEN SHIPY=175
  301. RETURN
  302. @FIRE
  303. SHOTSK=SHOTSK+1
  304. IF SHOTSK % 4 THEN RETURN
  305. SHOTSK = SHOTSK AND 255
  306. IF SHOTL(SHOTI)==1 THEN RETURN
  307. SHOTX(SHOTI)=SHIPX
  308. SHOTY(SHOTI)=SHIPY
  309. SHOTL(SHOTI)=1
  310. SHOTI=SHOTI+1
  311. IF SHOTI==9 THEN SHOTI=0
  312. BEEP 10,0,64
  313. RETURN
  314. @SHOTMOVE
  315. FOR I=0 TO 8
  316.  IF SHOTL(I)==0 GOTO @S5
  317.  SPOFS I+1,SHOTX(I),SHOTY(I)
  318.  SHOTY(I)=SHOTY(I)-4
  319.  IF I%3 THEN SHOTX(I)=SHOTX(I)-1
  320.  IF (I+1)%3 THEN SHOTX(I)=SHOTX(I)+1
  321.  IF SHOTY(I)<-16 THEN SHOTL(I)=0:SHOTY(I)=-200
  322. @S5
  323. NEXT I
  324. FOR I=0 TO 5
  325.  IF ESL(I)==0 GOTO @S6
  326.  SPOFS I+16,ESX(I),ESY(I)
  327.  ESX(I)=ESX(I)+ESVX(I)
  328.  ESY(I)=ESY(I)+ESVY(I)
  329.  IF ESX(I)>255 THEN ESL(I)=0
  330.  IF ESX(I)<-8  THEN ESL(I)=0
  331.  IF ESY(I)<-8  THEN ESL(I)=0
  332.  IF ESY(I)>196 THEN ESL(I)=0
  333. @S6
  334. NEXT I
  335. RETURN