- タイトル
MissileDefense (電子工作マガジン2017年SUMMER号掲載) - 開発環境
IchigoJamBASIC1.2.1 - 内容
敵国によるICBM発射の兆候をつかんだ我が軍は、ミサイル防衛システムを配備した。
ICBMが本土上に着弾する前にそれらを撃墜し、我が国を守らなければならない。 - 遊び方
RUNすると少し時間を置いて、上空からミサイルが軌跡を描きながら落下してきます。
画面上の照準「+」を操作し、照準の位置に迎撃弾を発射することができます。
迎撃弾を発射すると爆炎が発生し、爆炎にミサイルを突入させることでミサイルを撃破できます。
迎撃弾は一度に3個までしか発射することができません。
1発でもミサイルが地表に着弾してしまったらゲームオーバーです。
迎撃した時の画面上の爆炎の数が1つの場合は15点、2つは10点、3つは5点です。
2つのミサイルを同時に破壊した時は、さらに10点追加です。 - 操作方法
[↑]キー 上移動
[↓]キー 下移動
[←]キー 左移動
[→]キー 右移動
[スペース]キー 迎撃弾発射
2つのキーを同時に押して斜めに移動することもできます。 - プログラムのしくみ
変数表(プログラム2) [0]~[3] ミサイル1の構造体:[0]発生フラグ,[1]長さ,[2]始点のX座標,[3]終点のX座標 [4]~[15] ミサイル2~3の構造体:内容はミサイル1と同じ [30]~[32] 爆炎1~3の位置 [33]~[35] 爆炎1~3の大きさ S スコア R スコアの加算値 I,J ループ用 N,M 爆炎用一時変数 K キー入力値 V 照準移動方向 T 照準の位置 U 自機のX座標 L ミサイル用インデックス C ミサイルのキャラクタ Y ミサイル描画Y座標
各行の処理(プログラム2) 1行 コメント(ファイル名) 2行 初期化 3行 タイマ 4~9行 爆炎処理 10~14行 ミサイル処理 15~22行 キー入力処理 23~24行 ミサイルの軌跡描画 - プログラムの具体的な入力方法
プログラム1は機械語サブルーチンになっていますので、間違えないように入力してください。 入力間違いがあるとエラーメッセージが出ずに、IchigoJamが操作不能になってしまう可能性があります。 ですので、プログラムを入力したら、まずSAVEしてからRUNするようにしてください。 もしIchigoJamが操作不能になってしまった場合は電源を入れ直してください。 (保存していないプログラムは消えてしまいます) - プログラムの改造
プログラム2の、3行めの「tick()<50-s /10」は敵ミサイルの速度を設定するタイマーになっており、現在はスコア連動で徐々に早くなるようになっています。
「s/10」の分母を大きくするとゆっくりになり、逆に小さくすると早くなります。
敵ミサイルの発生率は10行の「RND(10)」により決まります。
数値を大きくすると発生率が下がり、数値を小さくすると発生率が上がります。
このプログラムはIchigoJam-ap(PCアプリケーション版)やIchigoJam-PC(PC_OS版)でも実行することができます。
ただし、IchigoJam-apやIchigoJam-PCでは機械語を実行することができないのでプログラム1は入力せず、その代わりプログラム2の23~24行をプログラム3のように変更してください。
全く同じ処理を、プログラム3はBASICで記述、プログラム1は機械語で記述したものです。
PCのスペックにもよりますが、IchigoJam-apやIchigoJam-PCはBASICの処理でも十分な速度が出ます。
動作環境によっては照準の移動が速すぎるので、21行の「'」を消してWAIT文が実行されるようにしてください。 WAIT文の数値を変更することで照準の速度を遅くすることができます。 - 参考ゲーム
ミサイルコマンド
MissileDefense(プログラム1) |
---|
10 'MissileCommand1 20 POKE #700,254,180,140,38,54,1,14,68,144,39,63,1,15,68,0,37 30 POKE #710,44,34,18,1,243,120,210,24,179,120,210,26,106,67,22,35 40 POKE #720,91,2,1,36,100,2,0,32,154,66,1,212,210,26,0,25 50 POKE #730,91,8,100,8,248,209,115,120,180,120,2,25,184,92,3,40 60 POKE #740,2,209,1,32,157,66,5,208,48,121,184,84,1,53,171,66 70 POKE #750,222,218,0,32,254,188,112,71 80 LRUN(プログラム2の保存番号) |
MissileDefense(プログラム2) |
---|
1 'MissileCommand2 2 CLV:CLS:POKE4098,0:U=#50:T=#A10:POKET,43 3 IFTICK()<50-S/10GOTO15 4 R=4:FORJ=33TO35:IF![J]GOTO9 5 [J]=([J]+1)%7:N=ABS([J]*2-7):M=J-3:R=R-1:IFN=7POKE[M]-32,0:POKE[M]-1,0,0,0:POKE[M]+32,0:[M]=0 6 IFN=5POKE[M]-32,0:POKE[M]-1,0,3,0:POKE[M]+32,0 7 IFN=3POKE[M]-33,0,3,0:POKE[M]-2,0,3,3,3,0:POKE[M]+31,0,3,0 8 IFN=1POKE[M]-33,3,3,3:POKE[M]-2,3,3,3,3,3:POKE[M]+31,3,3,3 9 NEXT:CLT 10 FORI=0TO3:L=I*4:IF![L]IFRND(10)GOTO13ELSE[L+2]=RND(32):[L+3]=RND(32):[L]=1 11 C=219:GOSUB23:IF[L]=0C=0:GOSUB23:[L]=0:[L+1]=0:S=S+R:R=R+1 12 [L+1]=[L+1]+1 13 LC0,0:?"SCORE ";S*5:IF[L+1]=23LC0,5:?"GAME OVER":END 14 NEXT 15 K=PEEK(4098):V=0:IF!KGOTO3 16 IFK&16FORI=30TO32:IF[I]=TI=32:NEXTELSEIF[I]NEXTELSE[I]=T:[I+3]=1:POKET,3:I=33:NEXT:GOTO3 17 IFK&1V=V-1 18 IFK&2V=V+1 19 IFK&4V=V-32 20 IFK&8V=V+32 21 K=T+V:IFK>#91F&&K<#BC0IFVPOKET,0:POKEU,0:T=T+V:U=#BE0+T%32:POKET,43:POKEU,240:'WAIT10 22 GOTO3 23 POKE#8C0,[L],[L+1],[L+2],[L+3],C:IFUSR(#700,C)[L]=0 24 RETURN |
MissileDefense(プログラム3) |
---|
23 FORY=0TO[L+1]:P=#900+Y*(704+[L+3]-[L+2])/22+[L+2]:IFPEEK(P)=3&&Y=[L+1][L]=0:Y=22 24 POKEP,C:NEXT:RETURN |
MissileDefense(プログラム1のアセンブラリスト) |
---|
push {r1-r7} mov r6,#8c lsl r6,r6,4 'r6=#8c0=[l] add r6,r1 '#8c0 実アドレス mov r7,#90 lsl r7,r7,4 'r7=#900=VRAM add r7,r1 'VRAM 実アドレス mov r5,0 'y=counter @loop1 mov r2,#2C lsl r2,r2,4 'r2=#2c0=704=32*22 ldrb r3,[r6,3] 'R3=[L+3] add r2,r2,r3 ldrb r3,[r6,2] 'R3=[L+2] sub r2,r2,r3 mul r2,r5 'R2=y*(704+[L+3]-[L+2]) '--DIV st-- mov r3,#16 '割算 r2/22 lsl r3,r3,9 'r3=22*2^4=#160 mov r4,#1 'r4=シフト_カウンタ lsl r4,r4,9 mov r0,0 'r0=商 @div_loop cmp r2,r3 bmi @div_shift 'jmp r2<r3 sub r2,r2,r3 add r0,r0,r4 @div_shift lsr r3,r3,1 lsr r4,r4,1 bne @div_loop '--DIV ed-- ldrb r3,[r6,1] 'R3=[L+1] ldrb r4,[r6,2] 'R4=[L+2] add r2,r0,r4 '商+[L+2] ldrb r0,[r7,r2] 'R3=peek(R2) cmp r0,3 bne @nohit 'ifpeek(p)=3 mov r0,1 cmp r5,r3 beq @hit 'ify=[L+1] @nohit ldrb r0,[r6,4] 'R0=c strb r0,[r7,r2] 'pokeR2,R0 add r5,1 'counter ++ cmp r3,r5 'R3-R5=[L+1]-counter bge @loop1 mov r0,0 @hit pop {r1-r7} ret |
MixJuiceでのダウンロードURLは下記になります。
MissileDefense(Program1) http://tagiyasoft.blog.jp/missiledefense1.bin
MissileDefense(Program2) http://tagiyasoft.blog.jp/missiledefense2.bin
MissileDefense(Program3) http://tagiyasoft.blog.jp/missiledefense3.bin
以下のように入力してD/Lしてください。
NEW ? MJ GET tagiyasoft.blog.jp/missiledefense1.bin ? MJ GET tagiyasoft.blog.jp/missiledefense2.bin |
ブラウザでD/LしてIchigoJamに転送する場合は、通信ソフトでバイナリ送信をしてください。
(例:TeraTermの場合は、メニューの[ファイル]-[ファイル送信]で当該ファイルを送信します)