2画面を使った、2人対戦のシューティングゲームの登場だ。
下画面タッチでゲームスタート(または終了)。タイトル画面に表示されている通り、前後左右とショットでそれぞれのプレイヤー機を操作する。一方向に押せば押すほどスピードが上がっていき、逆方向に押せば減速する、無重力の操作感にまず慣れておこう。
相手と撃ち合って画面上部のダメージ率を100%にするのが目的だが、ときどき現われるスターを取るとある程度回復になる。
ほかにもアイテムは、弾を画面内に何発まで撃てるか(赤色ゲージ)を変える「R」、敵に与えるダメージ量(黄色ゲージ)を変える「P」がある。アイテムが緑色ならゲージ上昇だが、赤色だとかえって低下してしまうので要注意。
もりちゃん
シューティングゲームを作っていたら、いつの間にか対戦ゲームになっていました。
(6月30日)下記のように訂正してください
491行目 LOCATE 21,21:PRINT "† FIRE";
(†=Rボタン記号)
GPUTCHR
拡張命令といったところかの。ラベル名が@SYMBOL
というのはF-BASIC使いならニヤリとするところじゃろう。RETURN
で終わるまで全部カラにして打っても動作に問題ないんだぜ! 打ち込むにはてっとり早えんじゃねェか?
- ’┌────────────┐
- ’│STAR BATTLER│
- ’└────────────┘
- ’ショキセッテイ
- VISIBLE 1,1,0,0,1,1
- COLOR 15:CLS:BGMSTOP
- FOR P=0 TO 1
- GPAGE P:SPPAGE P:BGPAGE P
- FOR I=0 TO 255
- COLINIT ”GRP”,I
- COLINIT ”BG”,I
- NEXT I
- GCOLOR 0:GCLS:SPCLR
- BGCLIP 0,0,31,23
- BGOFS 0,0,0:BGOFS 1,0,0
- NEXT P
- GPAGE 0:SPPAGE 0:BGPAGE 0
- PNLTYPE ”OFF”
- CLEAR:XYMAX=16:NN=10
- DIM B1(2,4),BCNT(2,4)
- DIM XB(2,4),YB(2,4),YS(2)
- DIM A1(2),XX(2),YY(2),REN(2)
- DIM DM(2),PW(2),RF(2),TA(2)
- DIM C$(3,256),KEYNO(2,5)
- DIM XN(NN),YN(NN),CN(NN)
- ’キ-No.トウロク
- FOR I=0 TO 1
- FOR J=0 TO 4
- READ NO
- KEYNO(I,J)=NO
- NEXT J
- NEXT I
- DATA 1, 2, 4, 8,256
- DATA 64, 32,128, 16,512
- ’BG(ホシソ゛ラ)セッテイ
- C$=”00000000”
- C$=C$+C$+C$+C$+C$+C$+C$+C$
- FOR I=0 TO 2
- FOR J=0 TO 255
- C$(I,J)=C$
- NEXT J
- NEXT I
- FOR I=1 TO 200
- C1=RND(3) :C2=RND(256)
- C3=RND(64):C4=RND(16)
- CB$=C$(C1,C2)
- C$(C1,C2)=MID$(CB$,0,C3)+HEX$(C4)+MID$(CB$,C3+1,63-C3)
- NEXT I
- FOR P=0 TO 1
- BGPAGE P
- FOR I=0 TO 2
- I$=”BGU”+STR$(I)
- FOR J=0 TO 255
- CHRSET I$,J,C$(I,J)
- NEXT J
- NEXT I
- FOR I=0 TO 47
- FOR J=0 TO 31
- BGPUT 0, J, I,(I % 24)*32+J,0,0,0
- BGPUT 1,31-J,47-I,(I % 24)*32+J,0,0,0
- NEXT J
- NEXT I
- NEXT P
- FOR I=0 TO NN-1
- XN(I)=-1
- NEXT I
- ’スフ゜ライトセッテイ
- ’0-3:シ゛キ 4-7:タマ 8-11:ハ゛クハツ
- ’12:ハ゜ワ-アッフ゜ 13:レンシャアッフ゜
- ’14:ハ゜ワ-タ゛ウン 15:レンシャタ゛ウン
- ’16-19:ライフアッフ゜
- CHRINIT ”SPU0”
- CHRINIT ”SPU2”
- CHRINIT ”SPU3”
- FOR I=0 TO 19
- READ NO1,NO2
- FOR J=0 TO 3
- SPPAGE 0
- CHRREAD(”SPU”+STR$(NO1),NO2*4+J),S$
- CHRSET ”SPU0”,I*4+J,S$
- SPPAGE 1
- CHRSET ”SPS0”,I*4+J,S$
- NEXT J
- NEXT I
- DATA 2, 8,2, 9,2,10,2,11
- DATA 0,40,0,42,0,44,0,46
- DATA 3,56,3,57,3,58,3,59
- DATA 3,41,3,43,3,40,3,42
- DATA 2,28,2,29,2,30,2,31
- ’[B]→[R]ヘンカン
- FOR I=0 TO 2 STEP 2
- SPPAGE 0
- CHRREAD(”SPU0”,(13+I)*4+3),S$
- SR$=MID$(S$,0,16)
- SR$=SR$+MID$(S$,8,3)
- SR$=SR$+MID$(S$,19,64-19)
- CHRSET ”SPU0”,(13+I)*4+3,SR$
- SPPAGE 1
- CHRSET ”SPS0”,(13+I)*4+3,SR$
- NEXT I
- FOR P=0 TO 1
- SPPAGE P
- FOR I=0 TO 3
- SPSET I ,0,0,0,0,0
- SPOFS I ,-16,-16
- SPSET I+10,0,2,0,0,0
- SPOFS I+10,-16,-16
- SPSET I+30,0,2,0,0,0
- SPOFS I+30,-16,-16
- SPSET I+40,0,0,0,0,0
- SPOFS I+40,-16,-16
- NEXT I
- SPSET 50,12,4,0,0,0
- SPOFS 50,-16,-16
- SPSET 51,13,4,0,0,0
- SPOFS 51,-16,-16
- SPSET 52,14,2,0,0,0
- SPOFS 52,-16,-16
- SPSET 53,15,2,0,0,0
- SPOFS 53,-16,-16
- SPSET 54,16,3,0,0,0
- SPOFS 54,-16,-16
- SPANIM 54,4,10,0
- NEXT P
- @START
- GOSUB @TITLE
- IF ED THEN VISIBLE 1,1,0,0,1,1:END
- ’シ゛ョウタイクリア
- SPPAGE 0
- FOR I=0 TO 1
- X(I)=20+I*200:Y(I)=20+I*330
- A1(I)=I*2+1:REN(I)=0:TA(I)=0
- DM(I)=0:PW(I)=2:RF(I)=2
- XX(I)=0:YY(I)=0:YS(I)=0
- FOR J=0 TO 3
- B1(I,J)=0:BCNT(I,J)=0
- NEXT J
- SPPAGE (Y(I)>191)
- SPCHR I*30,A1(I)
- SPOFS I*30,X(I),Y(I)
- NEXT I
- BKCNT=0:BK=-1:YID=0
- GOSUB @INFO
- ’メインル-チン
- @MAIN
- BTN=0:M=0
- FOR I=0 TO 4
- VSYNC 1
- BTN1=BUTTON()
- IF BTN1 THEN BTN=BTN1
- FOR J=0 TO 1
- IF (BTN AND KEYNO(J,4))==0 THEN REN(J)=0
- NEXT J
- NEXT I
- @LOOP
- MA=M*30:MB=MA+10
- IF BKCNT>0 AND M==BK THEN BKCNT=BKCNT+1:GOTO @LNEXT1
- IF BTN AND KEYNO(M,0) THEN YY(M)=YY(M)-2:A1(M)=3
- IF BTN AND KEYNO(M,1) THEN YY(M)=YY(M)+2:A1(M)=1
- IF BTN AND KEYNO(M,2) THEN XX(M)=XX(M)-2:A1(M)=2
- IF BTN AND KEYNO(M,3) THEN XX(M)=XX(M)+2:A1(M)=0
- IF XX(M)<-XYMAX THEN XX(M)=-XYMAX
- IF XX(M)> XYMAX THEN XX(M)= XYMAX
- IF YY(M)<-XYMAX THEN YY(M)=-XYMAX
- IF YY(M)> XYMAX THEN YY(M)= XYMAX
- X(M)=X(M)+XX(M):Y(M)=Y(M)+YY(M)
- IF X(M)<=-16 THEN X(M)=X(M)+256
- IF X(M)>=256 THEN X(M)=X(M)-256
- IF Y(M)<=-16 THEN Y(M)=Y(M)+384
- IF Y(M)>=384 THEN Y(M)=Y(M)-384
- PG=(Y(M)>191)
- Y2=Y(M)-192*PG
- SPPAGE PG
- SPCHR MA,A1(M)
- SPOFS MA,X(M),Y2
- SPPAGE 1-PG
- SPOFS MA,-16,-16
- XA=0:YA=0
- IF X(M)<0 THEN XA= 256
- IF X(M)>239 THEN XA=-256
- IF Y(M)<0 THEN YA= 192
- IF Y(M)>367 THEN YA=-192
- IF Y(M)>175 AND Y(M)<192 THEN YA=-192
- FOR P=0 TO 1
- SPPAGE P
- SPOFS MA+1,-16,-16:SPOFS MA+2,-16,-16:SPOFS MA+3,-16,-16
- NEXT P
- SPPAGE PG
- IF XA THEN SPCHR MA+1,A1(M):SPOFS MA+1,X(M)+XA,Y2
- SPPAGE 1-PG
- IF YA THEN SPCHR MA+2,A1(M):SPOFS MA+2,X(M) ,Y2+YA
- IF XA AND YA THEN SPCHR MA+3,A1(M):SPOFS MA+3,X(M)+XA,Y2+YA
- IF BTN AND KEYNO(M,4) THEN I=0:GOSUB @FIRE
- XC=X(1-M):YC=Y(1-M)
- IF XC<8 THEN XC=XC+256
- IF YC<8 THEN YC=YC+384
- @LNEXT1
- FOR I=0 TO 3
- IF BCNT(M,I)>0 THEN GOSUB @TAMA
- NEXT I
- IF M==0 THEN M=1:GOTO @LOOP
- IF YID==0 AND RND(30)==0 THEN GOSUB @ITEMSET
- IF YID THEN GOSUB @ITEMSCR
- IF BKCNT==0 THEN BEEP 21,(ABS(XX(0))+ABS(YY(0))+ABS(YY(1)))*125
- GOSUB @SCROLL
- GOSUB @SHOOTING
- IF BKCNT>=40 THEN @GAMEOVER
- GOTO @MAIN
- ’ホシソ゛ラスクロ-ル
- @SCROLL
- FOR P=0 TO 1
- BGPAGE P
- FOR I=0 TO 1
- YS(I)=YS(I)+I+1
- IF YS(I)>191 THEN YS(I)=0
- BGOFS I,0,YS(I)
- NEXT I
- NEXT P
- RETURN
- ’ナカ゛レホ゛シ
- @SHOOTING
- FOR I=0 TO NN-1
- IF XN(I)<0 THEN @SHTNEXT1
- GP=(YN(I)>191)
- GPAGE GP
- GLINE XN(I),YN(I)-192*GP,XN(I)+3,YN(I)-3-192*GP,0
- XN(I)=XN(I)-4:YN(I)=YN(I)+4
- IF XN(I)<0 OR YN(I)>383 THEN XN(I)=-1:GOTO @SHTNEXT1
- GP=(YN(I)>191)
- GPAGE GP
- GLINE XN(I),YN(I)-192*GP,XN(I)+3,YN(I)-3-192*GP,CN(I)
- @SHTNEXT1
- NEXT I
- @SHTSET
- FOR I=0 TO NN-1
- IF XN(I)>=0 THEN @SHTNEXT2
- XN(I)=RND(256)
- YN(I)=RND(94)*4+8
- CN(I)=RND(255)+1
- I=NN
- @SHTNEXT2
- NEXT I
- RETURN
- ’タマハッシャ
- @FIRE
- IF REN(M) OR TA(M)>=RF(M) THEN RETURN
- IF BCNT(M,I)<=0 THEN @FIRESET
- I=I+1
- GOTO @FIRE
- @FIRESET
- B1(M,I)=A1(M):XB(M,I)=X(M):YB(M,I)=Y(M)
- BCNT(M,I)=10:REN(M)=1:TA(M)=TA(M)+1
- PG=(YB(M,I)>191)
- SPPAGE PG
- SPCHR MB+I,B1(M,I)+4
- SPOFS MB+I,XB(M,I),YB(M,I)-192*PG
- IF BKCNT==0 THEN BEEP 10,M*2000
- RETURN
- ’タマイト゛ウ
- @TAMA
- IF B1(M,I)==0 THEN XB(M,I)=XB(M,I)+16
- IF B1(M,I)==1 THEN YB(M,I)=YB(M,I)+16
- IF B1(M,I)==2 THEN XB(M,I)=XB(M,I)-16
- IF B1(M,I)==3 THEN YB(M,I)=YB(M,I)-16
- IF XB(M,I)<= -8 THEN XB(M,I)=XB(M,I)+256
- IF XB(M,I)>=248 THEN XB(M,I)=XB(M,I)-256
- IF YB(M,I)<= -8 THEN YB(M,I)=YB(M,I)+384
- IF YB(M,I)>=376 THEN YB(M,I)=YB(M,I)-384
- PG=(YB(M,I)>191)
- SPPAGE PG
- SPCHR MB+I,B1(M,I)+4
- SPOFS MB+I,XB(M,I),YB(M,I)-192*PG
- SPPAGE 1-PG
- SPOFS MB+I,-16,-16
- GOSUB @CHECK
- BCNT(M,I)=BCNT(M,I)-1
- IF CK THEN BCNT(M,I)=0
- IF BCNT(M,I)<=0 THEN SPPAGE PG:SPOFS MB+I,-16,-16:TA(M)=TA(M)-1
- IF CK THEN GOSUB @DAMAGE
- RETURN
- ’アタリハンテイ
- @CHECK
- CK=0
- IF BKCNT>0 THEN RETURN
- XZ=ABS(X(1-M)-XB(M,I))
- YZ=ABS(Y(1-M)-YB(M,I))
- IF (XZ<=8 OR XZ>=248)AND YZ<=8 OR YZ>=376 THEN CK=1
- RETURN
- ’タ゛メ-シ゛
- @DAMAGE
- DM(1-M)=DM(1-M)+PW(M)*5+5
- IF DM(1-M)>100 THEN DM(1-M)=100
- GOSUB @INFO
- IF DM(1-M)>=100 THEN GOSUB @BAKUHATU:RETURN
- BEEP 11,(1-M)*2000
- RETURN
- ’アイテムセット
- @ITEMSET
- XI=RND(240):YID=RND(2)*2-1
- YI=-YID*200+184:IT=RND(5)
- IF BKCNT==0 THEN BEEP 12
- RETURN
- ’アイテムスクロ-ル
- @ITEMSCR
- YI=YI+YID*4
- SPPAGE 0:SPOFS IT+50,XI,YI
- SPPAGE 1:SPOFS IT+50,XI,YI-192
- IF YI<-15 OR YI>383 THEN YID=0:RETURN
- GOSUB @ITEMCHK
- IF CK<0 THEN RETURN
- BP=0
- ON IT GOSUB @POWERUP,@RAPIDUP,@POWERDN,@RAPIDDN,@LIFEUP
- FOR P=0 TO 1
- SPPAGE P:SPOFS IT+50,-16,-16
- NEXT P
- GOSUB @INFO
- IF BKCNT==0 THEN BEEP BP,CK*2000
- YID=0
- RETURN
- ’ハ゜ワ-アッフ゜
- @POWERUP
- BP=8:PW(CK)=PW(CK)+1
- IF PW(CK)>4 THEN PW(CK)=4
- RETURN
- ’レンシャアッフ゜
- @RAPIDUP
- BP=8:RF(CK)=RF(CK)+1
- IF RF(CK)>4 THEN RF(CK)=4
- RETURN
- ’ハ゜ワ-タ゛ウン
- @POWERDN
- BP=4:PW(CK)=PW(CK)-1
- IF PW(CK)<1 THEN PW(CK)=1
- RETURN
- ’レンシャタ゛ウン
- @RAPIDDN
- BP=4:RF(CK)=RF(CK)-1
- IF RF(CK)<1 THEN RF(CK)=1
- RETURN
- ’ライフアッフ゜
- @LIFEUP
- BP=32:DM(CK)=DM(CK)-20
- IF DM(CK)<0 THEN DM(CK)=0
- RETURN
- ’アイテムケ゛ットチェック
- @ITEMCHK
- CK=-1
- FOR I=0 TO 1
- XZ=ABS(X(I)-XI)
- YZ=ABS(Y(I)-YI)
- IF (XZ<=8 OR XZ>=248) AND YZ<=8 OR YZ>=376 THEN CK=I:I=1
- NEXT I
- RETURN
- ’シ゛ョウホウヒョウシ゛
- @INFO
- GPAGE 0
- FOR I=0 TO 1
- COLOR I*2+11:LOCATE I*14+5,0
- PRINT ” ”;
- LOCATE I*14+8-LEN(STR$(DM(I))),0
- PRINT DM(I);”%”;
- FOR J=0 TO 3
- XG=I*112+J*8
- GBOX XG+72,1,XG+77,2,2*(PW(I)>J)
- GBOX XG+72,4,XG+77,5,12*(RF(I)>J)
- NEXT J
- NEXT I
- RETURN
- ’ハ゛クハツ
- @BAKUHATU
- BKCNT=1:BK=1-M:MA=BK*30
- FOR P=0 TO 1
- SPPAGE P
- FOR J=0 TO 3
- SPCHR MA+J,8
- SPANIM MA+J,4,10,0
- NEXT J
- NEXT P
- BEEP 13,BK*2000
- RETURN
- ’ケ゛-ムオ-ハ゛-
- @GAMEOVER
- BGMPLAY 6:_M=8:_O=&H10:_Y=64
- FOR I=1 TO 22
- GPAGE 0:GCOLOR 0:GCLS
- _Z$=STR$(2-BK)
- _X=256-I*32+6*64
- GCOLOR BK*2+2
- GOSUB @SYMBOL
- FOR J=0 TO 5
- GPUTCHR 256-I*32+J*64,64,”BGF0”,ASC(MID$(”PLAYER”,J,1)),13-BK*2,8
- NEXT J
- GPAGE 1:GCOLOR 0:GCLS
- FOR J=0 TO 4
- GPUTCHR 256-I*32+(J+2)*64,64,”BGF0”,ASC(MID$(”WIN!!”,J,1)),4,8
- NEXT J
- VSYNC 11
- NEXT I
- @OVERWAIT
- IF BGMCHK()==TRUE THEN @OVERWAIT
- FOR P=0 TO 1
- GPAGE P:GCOLOR 0:CLS
- SPPAGE P
- FOR I=0 TO 1
- SPOFS IT+50,-16,-16
- FOR J=0 TO 3
- SPANIM I*30+J,1,0,0
- SPOFS I*30+J,-16,-16
- SPOFS I*30+J+10,-16,-16
- NEXT J
- NEXT I
- NEXT P
- GOTO @START
- ’タイトル
- @TITLE
- VISIBLE 1,1,0,0,1,0
- CLS:GPAGE 0
- _M=6:_O=&H00:_Z$=”STAR”
- FOR I=5 TO 1 STEP -1
- GCOLOR &H3E-I
- _X=I*4-6:_Y=I*2
- GOSUB @SYMBOL
- NEXT I
- GCOLOR 11
- _X=-6:_Y=0
- GOSUB @SYMBOL
- _M=4:_Z$=”BATTLER”
- FOR I=5 TO 1 STEP -1
- GCOLOR &HE5+I
- _X=I*4+18:_Y=I*2+48
- GOSUB @SYMBOL
- NEXT I
- GCOLOR 12
- _X=18:_Y=48
- GOSUB @SYMBOL
- GPAGE 1
- XT1=8:XT2=136:YT=104
- XTW=111:YTW=79
- GFILL XT1,YT,XT1+XTW,YT+YTW,4
- GBOX XT1,YT,XT1+XTW,YT+YTW,15
- GFILL XT2,YT,XT2+XTW,YT+YTW,2
- GBOX XT2,YT,XT2+XTW,YT+YTW,15
- GCOLOR 15
- _X=24:_Y=136:_M=2:_Z$=”START”
- GOSUB @SYMBOL
- _X=168:_Z$=”END”
- GOSUB @SYMBOL
- COLOR 15
- LOCATE 5,13:PRINT ”PLAYER 1”;
- LOCATE 8,15:PRINT ”↑”;
- LOCATE 5,17:PRINT ”←”;
- LOCATE 11,17:PRINT ”→”;
- LOCATE 8,19:PRINT ”↓”;
- LOCATE 6,21:PRINT ”К FIRE”;
- LOCATE 20,13:PRINT ”PLAYER 2”;
- LOCATE 23,15:PRINT ”Ф”;
- LOCATE 20,17:PRINT ”Х”;
- LOCATE 26,17:PRINT ”А”;
- LOCATE 23,19:PRINT ”Б”;
- LOCATE 21,21:PRINT ”н FIRE”;
- SPPAGE 0
- SPCHR 0,3:SPOFS 0,60,132
- SPCHR 30,3:SPOFS 30,180,132
- PNLSTR 5,3,”POWER UP” ,15
- PNLSTR 5,9,”RAPID UP” ,15
- PNLSTR 20,3,”POWER DOWN”,15
- PNLSTR 20,9,”RAPID DOWN”,15
- PNLSTR 13,6,”LIFE UP” ,15
- SPPAGE 1
- SPOFS 50, 20,20
- SPOFS 51, 20,68
- SPOFS 52,140,20
- SPOFS 53,140,68
- SPOFS 54, 84,44
- VISIBLE 1,1,1,1,1,1
- BGMPLAY 15:ED=0
- @TCHWAIT
- GOSUB @SCROLL
- VSYNC 4
- IF TCHST==FALSE THEN @TCHWAIT
- XT0=TCHX:YT0=TCHY
- IF XT0<XT1 OR XT0>XT2+XTW OR YT0<YT OR YT0>YT+YTW THEN @TCHWAIT
- IF XT0>XT1+XTW AND XT0<XT2 THEN @TCHWAIT
- IF XT0>=XT2 THEN ED=1
- FOR P=0 TO 1
- GPAGE P:GCOLOR 0:GCLS
- NEXT P
- FOR I=0 TO 4
- SPOFS I+50,-16,-16
- NEXT I
- SPPAGE 0
- SPOFS 0,-16,-16
- SPOFS 30,-16,-16
- CLS:BGMSTOP
- RETURN
- ’モシ゛カクタ゛イ
- @SYMBOL
- _O1=(_O AND &H0F)
- _O2=(_O AND &HF0)
- IF _O1==0 THEN _X1=_X:_Y1=_Y
- _LEN=LEN(_Z$)
- FOR _I=0 TO _LEN-1
- CHRREAD(”BGF0”,ASC(MID$(_Z$,_I,1))),_C$
- FOR _J=0 TO 7
- _Y2=_Y1+_M-1
- FOR _K=0 TO 7
- _X2=_X1+_M-1
- _A$=MID$(_C$,_J*8+_K,1)
- IF _A$==”0” THEN @_NEXT4
- IF _O==0 THEN GFILL _X1,_Y1,_X2,_Y2:GOTO @_NEXT4
- GPSET _X1,_Y1:GPSET _X1,_Y2
- GPSET _X2,_Y1:GPSET _X2,_Y2
- IF _J!=0 THEN IF MID$(_C$,(_J-1)*8+_K,1)!=”0” THEN @_NEXT1
- GLINE _X1,_Y1,_X2,_Y1
- @_NEXT1
- IF _J!=7 THEN IF MID$(_C$,(_J+1)*8+_K,1)!=”0” THEN @_NEXT2
- GLINE _X1,_Y2,_X2,_Y2
- @_NEXT2
- IF _K!=0 THEN IF MID$(_C$,_J*8+(_K-1),1)!=”0” THEN @_NEXT3
- GLINE _X1,_Y1,_X1,_Y2
- @_NEXT3
- IF _K!=7 THEN IF MID$(_C$,_J*8+(_K+1),1)!=”0” THEN @_NEXT4
- GLINE _X2,_Y1,_X2,_Y2
- @_NEXT4
- _X1=_X1+_M
- NEXT _K
- _X1=_X1-_M*8:_Y1=_Y1+_M
- NEXT _J
- _X1=_X1+_M*8:_Y1=_Y1-_M*8
- NEXT _I
- RETURN