あの『日経ソフトウエア』からの投稿! 近日発売の6月号(2011年4月23日発売予定)ではプチコンがちょっとだけ記事になるぞ。
プログラムは本格派のシューティング。十字ボタンで自機を操作して、Aボタンのショットで敵機を破壊しよう。
弾は微妙に角度をつけて発射される。Aボタン押しっぱなしで連射になるぞ。
キミは敵の猛攻をくぐり抜けてボスキャラクターを倒せるかな?
武部健一
本業は日経ソフトウエアの編集者です。FM-NEW7のユーザーでした。
BASICは超久しぶり!
プチコンをまだよくわかっていないときに作ったのでちょっと無意味なコード(CHRINITの呼び出し)が混じってますがカンベン!
CHRINIT
が無意味とあるが、他のプログラムの後に実行することも考えればこれも必要じゃろう。ATAN
関数に引数を2つ渡して自機の方向を求めているのがポイントじゃ。ワシの青春時代は敵弾は16方向限定とかよくあったものじゃよ。
- @START
- CLEAR:CLS:GCLS:SPCLR:COLOR 0
- VISIBLE 0,0,0,0,0,0
- SCORE=0:TIME=0
- ’シ゛キ ショキカ SP=0
- CHRINIT ”SPU4”
- SPSET 0,288,3,0,0,0
- SHIPX=120:SHIPY=130
- ’シ゛タ゛ン ショキカ SP=1―9
- DIM SHOTX(9),SHOTY(9)
- DIM SHOTL(9)
- CHRINIT ”SPU3”
- FOR I=0 TO 8
- SPSET I+1,202,0,0,0,0
- SPOFS I+1,-100,0
- SHOTX(I)=-100:SHOTY(I)=0
- SHOTL(I)=0
- NEXT I
- SHOTI=0:SHOTSK=0
- ’テキ ショキカ SP=10―15
- CHRINIT ”SPU2”
- DIM EX(6),EY(6),EL(6),ED(6)
- DIM EVX(6),EVY(6)
- FOR I=0 TO 5
- SPSET I+10,180,3,0,0,0
- SPANIM I+10,3,3
- SPOFS I+10,0,-16
- EX(I)=0:EY(I)=0:EL(I)=0
- ED(I)=1:EVX(I)=0:EVY(I)=2
- NEXT I
- ’テキタ゛ン ショキカ SP=16―21
- CHRINIT ”SPU3”
- DIM ESX(6),ESY(6),ESL(6)
- DIM ESVX(6),ESVY(6)
- FOR I=0 TO 5
- SPSET I+16,203,0,0,0,0
- SPOFS I+16,0,-16
- ESX(I)=0:ESY(I)=0:ESL(I)=0
- ESVX(I)=0:ESVY(I)=0
- NEXT I
- ’シ゛キ ハ゛クハツハ゜タ-ン ショキカ SP=22
- SPSET 22,249,0,0,0,0
- SPANIM 22,5,5
- SPOFS 22,0,-16
- ’テキ ハ゛クハツハ゜タ-ン ショキカ SP=23
- SPSET 23,251,0,0,0,0
- SPANIM 23,3,3
- SPOFS 23,0,-16
- EEX=0:EEY=0:EEC=0
- ’ホ゛ス ショキカ
- CHRINIT ”SPU7”
- FOR I=0 TO 15
- SPSET I+24,496+I,2,0,0,0
- SPOFS I+24,0,-16
- NEXT I
- GAMEOVER=0
- ’ハイケイ ショキカ
- DIM BGX(15),BGY(15),BGC(15)
- FOR I=0 TO 14
- BGX(I)=RND(256)
- BGY(I)=RND(192)
- BGC(I)=RND(255)
- NEXT I
- VISIBLE 1,1,0,0,1,1
- COLORT=0
- ’タイトル
- @TITLE
- LOCATE 0,4:COLOR COLORT
- PRINT” ┿┿ ┿ ┿ ┿ ┿ ┿┿┿ ┿”
- PRINT” ┿ ┿ ┿ ┿ ┿ ┿ ┿ ┿ ┿”
- PRINT” ┿ ┿ ┿ ┿ ┿ ┿ ┿ ┿ ┿”
- PRINT” ┿ ┿ ┿ ┿ ┿ ┿ ┿ ┿ ┿”
- PRINT” ┿ ┿┿┿ ┿ ┿ ┿ ┿ ┿ ┿”
- PRINT” ┿ ┿ ┿ ┿ ┿ ┿ ┿ ┿ ┿”
- PRINT” ┿ ┿ ┿ ┿ ┿ ┿ ┿ ┿ ”
- PRINT” ┿┿ ┿ ┿ ┿ ┿ ┿ ┿”
- PRINT””
- LOCATE 6,15
- PRINT”フ゜ロク゛ラム BY ニッケイ ソフトウエア”
- COLORT=COLORT+1
- IF COLORT==16 THEN COLORT=0
- SPOFS 0,120,130
- K=BUTTON()
- LOCATE 8,20
- PRINT”HIT START BUTTON”
- IF K AND 1024 GOTO @MLPINIT
- GOTO @TITLE
- ’メインル-フ゜ ノ ショキカ
- @MLPINIT
- COLOR 0:CLS:BGMPLAY 0
- ’メインル-フ゜
- @MAINLOOP
- LOCATE 0,0:PRINT”SCORE:”
- LOCATE 6,0:PRINT STR$(SCORE)
- GOSUB @DRAWBG
- GOSUB @SHIPMOVE
- GOSUB @ENEGEN
- GOSUB @ENEMOVE
- GOSUB @ENESHOT
- GOSUB @SHOTMOVE
- GOSUB @HITTEST
- IF GAMEOVER==1 GOTO @G_OVER
- ’テキ ハ゛クハツ
- IF EEC>0 THEN EEC=EEC-1:SPOFS 23,EEX,EEY
- IF EEC==0 THEN SPOFS 23,0,-17
- IF TIME>3000 GOTO @_BOSLOOP
- GOTO @MAINLOOP
- @_BOSLOOP
- BOSSY=-65:BOSSVY=0.1
- BOSSD=50:BCOUNT=0:BOSSDEAD=0
- @BOSSLOOP
- LOCATE 0,0:PRINT”SCORE:”
- LOCATE 6,0:PRINT STR$(SCORE)
- GOSUB @BOSSMOVE
- GOSUB @BOSSATK
- GOSUB @SHIPMOVE
- GOSUB @SHOTMOVE
- GOSUB @ENEMOVE2
- GOSUB @ENESHOT
- GOSUB @HITTEST
- GOSUB @BOSSHIT
- IF EEC>0 THEN EEC=EEC-1:SPOFS 23,EEX,EEY
- IF EEC==0 THEN SPOFS 23,0,-17
- BCOUNT=BCOUNT+0.5
- IF BCOUNT>65535 THEN BOSSDEAD=1
- IF BOSSDEAD==1 GOTO @BOSSDEAD
- IF GAMEOVER==1 GOTO @G_OVER
- GOTO @BOSSLOOP
- @BOSSDEAD
- BEEP 13
- TIME=0
- SCORE=SCORE+5000
- EEX=BOSSX+32:EEY=BOSSY+32
- EEC=16
- FOR I=0 TO 15
- SPOFS I+24,0,-16
- NEXT I
- BOSSX=-100
- FOR I=0 TO 5
- EVX(I)=0:EVY(I)=2
- NEXT I
- GOTO @MAINLOOP
- @BOSSATK
- FOR I=0 TO 5
- IF EL(I)==1 GOTO @SKBOSA
- EX(I)=BOSSX+I*12
- EY(I)=BOSSY+50
- EL(I)=1
- T=ATAN(SHIPY-EY(I),SHIPX+4-EX(I))
- EVX(I)=COS(T)
- EVY(I)=SIN(T)
- @SKBOSA
- NEXT I
- GOSUB @ENEGEN
- RETURN
- @BOSSMOVE
- BOSSX=70*COS(BCOUNT/16)+96
- BOSSY=BOSSY+BOSSVY
- IF BOSSY>80 THEN BOSSVY=-0.1
- IF BOSSY<-12 THEN BOSSVY=0.1
- FOR I=0 TO 3
- SPOFS I+24,BOSSX+I*16,BOSSY
- SPOFS I+28,BOSSX+I*16,BOSSY+16
- SPOFS I+32,BOSSX+I*16,BOSSY+32
- SPOFS I+36,BOSSX+I*16,BOSSY+48
- NEXT I
- RETURN
- @DRAWBG
- FOR I=O TO 14
- GPSET BGX(I),BGY(I),0
- BGY(I)=BGY(I)+4
- NEXT I
- FOR I=O TO 14
- GPSET BGX(I),BGY(I),BGC(I)
- IF BGY(I)>191 THEN BGY(I)=0
- NEXT I
- RETURN
- @G_OVER
- BGMSTOP:BEEP 13:SPCLR 0
- @_G_OVER
- SPOFS 22,SHIPX,SHIPY
- SPSCALE 22,200
- LOCATE 12,11:PRINT”GAME OVER”
- LOCATE 8,20:
- PRINT”HIT START BUTTON”
- K=BUTTON()
- IF K AND 1024 GOTO @START
- GOTO @_G_OVER
- @BOSSHIT
- FOR I=0 TO 8
- IF SHOTX(I)+8<BOSSX GOTO @SKBHIT
- IF SHOTX(I)>BOSSX+64 GOTO @SKBHIT
- IF SHOTY(I)+8<BOSSY GOTO @SKBHIT
- IF SHOTY(I)>BOSSY+50 GOTO @SKBHIT
- ’アタリ
- SHOTL(I)=0:SHOTY(I)=-200
- SPOFS I+1,SHOTX(I),SHOTY(I)
- BOSSD=BOSSD-1
- IF BOSSD<0 THEN BOSSDEAD=1
- BEEP 11,64
- @SKBHIT
- NEXT I
- IF SHIPX+16<BOSSX THEN RETURN
- IF SHIPX>BOSSX+64 THEN RETURN
- IF SHIPY+16<BOSSY THEN RETURN
- IF SHIPY>BOSSY+64 THEN RETURN
- GAMEOVER=1
- RETURN
- @HITTEST
- ’シ゛タ゛ン ト テキ
- FOR J=0 TO 5
- FOR I=0 TO 8
- IF SHOTX(I)+8<EX(J) GOTO @S1
- IF SHOTX(I)>EX(J)+8 GOTO @S1
- IF SHOTY(I)+8<EY(J) GOTO @S1
- IF SHOTY(I)>EY(J)+8 GOTO @S1
- ’アタリ
- SCORE=SCORE+100
- TIME=TIME+100
- SHOTL(I)=0:SHOTY(I)=-200
- SPOFS I+1,SHOTX(I),SHOTY(I)
- ED(J)=ED(J)-1
- IF ED(J)!=0 GOTO @S1
- EL(J)=0:ED(J)=1
- EEX=EX(J):EEY=EY(J):EEC=16
- BEEP 13,0,64
- @S1
- NEXT I
- NEXT J
- ’シ゛キ ト テキタ゛ン
- FOR I=0 TO 5
- IF ESX(I)+4<SHIPX GOTO @S2
- IF ESX(I)>SHIPX+4 GOTO @S2
- IF ESY(I)+4<SHIPY GOTO @S2
- IF ESY(I)>SHIPY+4 GOTO @S2
- ’アタリ
- GAMEOVER=1
- @S2
- NEXT I
- ’シ゛キ ト テキ
- FOR I=0 TO 5
- IF EX(I)+8<SHIPX GOTO @S3
- IF EX(I)>SHIPX+4 GOTO @S3
- IF EY(I)+8<SHIPY GOTO @S3
- IF EY(I)>SHIPY+4 GOTO @S3
- ’アタリ
- GAMEOVER=1
- @S3
- NEXT I
- RETURN
- @ENEGEN
- FOR I=0 TO 5
- IF EL(I)==0 THEN EL(I)=1:EX(I)=RND(240):EY(I)=-16-RND(100)
- NEXT I
- RETURN
- @ENESHOT
- FOR I=0 TO 5
- IF ESL(I)==1 GOTO @S4
- R=RND(5)
- IF EL(R)==0 THEN RETURN
- T=ATAN(SHIPY-EY(R),SHIPX+4-EX(R))
- ESX(I)=EX(R)
- ESY(I)=EY(R)
- ESVX(I)=3*COS(T)
- ESVY(I)=3*SIN(T)
- ESL(I)=1
- @S4
- NEXT I
- RETURN
- @ENEMOVE
- FOR I=0 TO 5
- SPOFS I+10,EX(I),EY(I)
- EY(I)=EY(I)+EVY(I)
- EX(I)=EX(I)+EVX(I)
- IF EY(I) > 191 THEN EL(I)=0
- NEXT I
- RETURN
- @ENEMOVE2
- FOR I=0 TO 5
- SPOFS I+10,EX(I),EY(I)
- EY(I)=EY(I)+EVY(I)
- EX(I)=EX(I)+EVX(I)
- IF EY(I) > 191 THEN EL(I)=0
- IF EY(I) < -16 THEN EL(I)=0
- IF EX(I) > 255 THEN EL(I)=0
- IF EX(I) < -16 THEN EL(I)=0
- NEXT I
- RETURN
- @SHIPMOVE
- SPOFS O,SHIPX,SHIPY
- K=BUTTON()
- IF K AND 1 THEN SHIPY=SHIPY-3
- IF K AND 2 THEN SHIPY=SHIPY+3
- IF K AND 4 THEN SHIPX=SHIPX-3.5
- IF K AND 8 THEN SHIPX=SHIPX+3.5
- IF K AND 16 THEN GOSUB @FIRE
- IF SHIPX>242 THEN SHIPX=242
- IF SHIPX<0 THEN SHIPX=0
- IF SHIPY<0 THEN SHIPY=0
- IF SHIPY>175 THEN SHIPY=175
- RETURN
- @FIRE
- SHOTSK=SHOTSK+1
- IF SHOTSK % 4 THEN RETURN
- SHOTSK = SHOTSK AND 255
- IF SHOTL(SHOTI)==1 THEN RETURN
- SHOTX(SHOTI)=SHIPX
- SHOTY(SHOTI)=SHIPY
- SHOTL(SHOTI)=1
- SHOTI=SHOTI+1
- IF SHOTI==9 THEN SHOTI=0
- BEEP 10,0,64
- RETURN
- @SHOTMOVE
- FOR I=0 TO 8
- IF SHOTL(I)==0 GOTO @S5
- SPOFS I+1,SHOTX(I),SHOTY(I)
- SHOTY(I)=SHOTY(I)-4
- IF I%3 THEN SHOTX(I)=SHOTX(I)-1
- IF (I+1)%3 THEN SHOTX(I)=SHOTX(I)+1
- IF SHOTY(I)<-16 THEN SHOTL(I)=0:SHOTY(I)=-200
- @S5
- NEXT I
- FOR I=0 TO 5
- IF ESL(I)==0 GOTO @S6
- SPOFS I+16,ESX(I),ESY(I)
- ESX(I)=ESX(I)+ESVX(I)
- ESY(I)=ESY(I)+ESVY(I)
- IF ESX(I)>255 THEN ESL(I)=0
- IF ESX(I)<-8 THEN ESL(I)=0
- IF ESY(I)<-8 THEN ESL(I)=0
- IF ESY(I)>196 THEN ESL(I)=0
- @S6
- NEXT I
- RETURN