2013年02月03日

DPC-100プログラム・インベーダー風ゲーム

 この記事も含めて、まとめはこちらLink


 iPhoneのポケコンアプリ、DPC-100のプログラムだが、やっぱり私はシューティングゲームが好きなので、何とかこの1行の画面でSTGができないかと思い、作ってみた。
 ゲームとしてはスペースインベーダーみたいなものだけど、敵の動きやルールも全く違うので、インベーダー風ゲーム。
 また、今回アプリのアップデートで実装されたサウンドも、ビープ音で簡単ながら付けてみた。

20130203-01.jpg20130203-02.jpg

 プログラムを起動した所。右がスコアで、背景が全部真っ黒の中、中央にいるのが自機で、上から敵が少しずつ攻めてくる。
 画面をタップしながらスライドで自機を左右に操作、指をもう1本画面に触れると撃つ。つまり、指1本で操作、指2本でショット。

20130203-03.jpg20130203-04.jpg

 撃った画面と敵を攻撃した画面。
 敵が進んできた距離に応じて、倒した時に1〜6点入るので、できるだけギリギリに近づいてから倒した方が高得点。

20130203-05.jpg

 ただし、敵がいない所を撃ってしまうと、ミスショットとして跳ね返されてしまい、敵の速度が上昇する。

20130203-06.jpg

 敵が下まで侵略してきてゲームオーバー。

 敵の速度は、
  • スコアの上昇に応じて
  • ショットを1発撃つ
  • ミスショット
によって上昇するようにしている。
 つまり、ミスも無くできる限り少ないショットでギリギリに近づけてから撃ち続ける事が高得点になる。

プログラムリストと解説

インベーダー風ゲーム
110 STRING IV=FILLSTR(0,12,139)
120 SC=0
130 X=6
140 WT=0
150 CH=141
160 GOSUB SSUB
170 WAIT(1.0,0)
180 WHILE 1
190 D=RANDOM()*12
200 IF GETCHAR(IV,D)<=-123 THEN BREAK
210 IV=SETCHAR(D,GETCHAR(IV,D)+255,IV)
220 SYSBEEP(4)
230 FOR LP=CLAMP(1500-SC*5-WT*5,200,2000) TO 0 STEP -1
240 IF TOUCH(-1,0)>0 THEN X=CLAMP((TOUCH(0,0)+350)/45,0,11)
250 IF TOUCH(-1,0)>=2 GOSUB SHOT
260 GOSUB SSUB
270 NEXT
280 WEND
290 IV=SETCHAR(D,232,IV)
300 GOSUB SSUB
310 FOR I=0 TO 3 STEP 1
320 SYSBEEP(6)
330 WAIT(0.5,0)
340 NEXT
350 EXIT(0)
360 @SHOT
370 CH=234
380 GOSUB SSUB
390 SYSBEEP(0)
400 WT+=1
410 WAIT(0.3,0)
420 IF GETCHAR(IV,X)==-117 GOSUB MISS ELSE GOSUB HIT
430 GOSUB SSUB
440 WAIT(0.3,0)
450 CH=141
460 RETURN
470 @HIT
480 CH='*'
490 SYSBEEP(1)
500 SC+=-GETCHAR(IV,X)-117
510 IV=SETCHAR(X,139,IV)
520 RETURN
530 @MISS
540 CH=235
550 SYSBEEP(6)
560 WT+=10
570 RETURN
580 @SSUB
590 STRING BAR
600 BAR=IV
610 BAR=SETCHAR(X,CH,BAR)
620 PRINTF("%s %d",BAR,SC)
630 FREE BAR
640 RETURN
 まず変数は、
IV:インベーダーの配置
SC:スコア
X:自機のX座標
WT:ミスした時の速度上昇値
D:前進するインベーダーの位置
LP:ウエイト
CH:表示するキャラクター
BAR:表示用
I:ループ用

サブルーチンは、
SHOT:ショット処理
HIT:敵に命中した処理
MISS:ミス処理
SSUB:表示用

 横一列に並んだインベーダーをどう処理するか考えて、最初は「IV(11)」などと配列変数に数値を入れて使おうとしていた。

・・・が、実行したら落ちたw

 おかげで作り直して、結局、グラフで表示されるキャラクターをそのまま使い、各位置のものをコードNo.133〜139の数値で取得して処理するという、結構荒技をやってみた。
 今となっては、アプリのバージョンアップで可能かもしれないけど。

 200、210行などで12桁の文字列を読み取って1ずつ減らす処理をするが、ここでまた問題。
 DPC-100の場合、コードNo.0〜127までは問題ないが、No.128〜255の文字をGETCHARで取得すると、-128〜-1と負の数値になる。
 その数値のまま「SETCHAR()」で文字を挿入すると、文字列がおかしくなってしまう。

 そのため、正の数にするには「GETCHAR(IV,D)+256」の計算を追加しないといけなくて、例えば210行では1減らすため、
GETCHAR(IV,D)+256-1 → GETCHAR(IV,D)+255
にするなど、全てそのための計算をしている。
 最初はこれが分からず、表示が上手くいかない原因を突き止めるのにかなり時間かかったという。

 このプログラム、できる限りゲームとして面白くしようと速度上昇などを設けてみたけど、まだまだ調整が必要な感じ。



タグ:DPC-100 iPhone

posted by 司隆 at 09:46 | Comment(0) | Computer
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。