2014年10月21日

DPC-100プログラム・X-Y Invaders「XYIV」

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


 80年代を中心に普及していた、BASIC言語でプログラミングができるポットコンピューターを、iPhoneで再現させたアプリ、DPC-100。
 配信された当初、私も色々とプログラムを作っていたが、1年以上ぶりにバージョンアップされた。

DPC-100 of DETUNE Ltd.
DPC-100 アップデート履歴

 追加として、ファイルの読み書きができる命令の追加という事。
 この機会に、私も久しぶりにプログラムを作ってみた。でも今回は、この新コマンドを使ったものではなく、またタップ操作のゲーム。
 ファイルアクセスを利用したら、ゲームだったらセーブ機能が追加できるけど、それを使ったプログラムは、上手くいったらまた作りたい。

ゲーム内容説明

 という事で作ったのは、80年代の電子ゲームブームの時に出ていた、ゲーム電卓をイメージしてみた。

20141021-01.png
 起動した画面。スコアと共にあるのが、自分が操作する砲台。
 パネルの左、図で示している範囲辺りを指でスライドすると、砲台にある2つのキャラクターが変化して、指2本タップすると撃つ。

20141021-02.png
 砲台のキャラクターはこんな感じで、X方向は4種類+UFO、Y方向は6種類+UFOと変化する。
 画面右端から同じ形状のインベーダーが攻めてくるので、形状を合わせて次々と倒していくゲーム。

20141021-03.png
 スコアは、右端で倒すと9点で、左に行くごとに8点、7点・・・、と下がっていく。そのため、早く倒すほど高得点で、XとYの敵を同時に2つ倒す事も可能。

20141021-04.png
 また、X・Yの同時破壊を2回連続で行うと、UFOが出現する。これも早く倒すほど高得点だが、インベーダーの5倍のスコアが入る。

20141021-05.png
 撃ったのに形状の合う敵がいなかった、つまりミスした場合と、時間の経過と共に、敵の速度が速くなる。そして左端の砲台まで攻め込まれるとゲームオーバー。

 このゲーム、XとYを合わせてインベーダーを倒していくという事で、タイトルは

X-Y Invaders「XYIV」

 と名付けてみた。
 まあこれは、無理矢理にでも「X68000 XVI」みたいな名前にしたかったのだがw

プログラムリスト

 プログラムは次の通り。

 以前は、メモリにかなりの制限があって、変数を無効にする命令「FREE」を頻繁に使うなどかなり工夫しないといけなかったけど、今回作ってみたら、これだけ長くなっても、メモリ関係では不具合は出なかった。

X-Y Invaders「XYIV」
100 INT XY(2)
110 STRING IV
120 IV=FILLSTR(0,9,32)
130 SC=0
140 UF=0
150 WT=300
160 HC=238
170 // ** MAIN LOOP **
180 WHILE 1
190 // ** SET INVADERS **
200 CH=RANDOM()*2
210 IF CH THEN CH=RANDOM()*4+128 ELSE CH=RANDOM()*6+133
220 IF UF>=16 THEN CH=141
230 UF&=9
240 IV=COPYSTR(IV,1,9)+FILLSTR(0,1,CH)
250 SYSBEEP(0)
260 // ** TOUCH **
270 I=WT/10
280 WHILE I>0
290 XY(0)=CLAMP((TOUCH(0,0)+430)/70+128,128,132)
300 IF XY(0)==132 THEN XY(0)=141
310 XY(1)=CLAMP(139-TOUCH(0,1)/35,133,139)
320 IF XY(1)==139 THEN XY(1)=141
330 GOSUB SSUB
340 WAIT(0.05,0)
350 IF TOUCH(-1,0)<=1 THEN UF&=30
360 IF (TOUCH(-1,0)>=2)&&((UF&1)==0) GOSUB SHOT
370 I-=1
380 WEND
390 IF GETCHAR(IV,0)!=32 THEN BREAK
400 WT=CLAMP(WT-3,50,300)
410 WEND
420 // ** GAME OVER **
430 HC=232
440 GOSUB SSUB
450 SYSBEEP(5)
460 WAIT(0.5,0)
470 SYSBEEP(5)
480 WAIT(0.5,0)
490 SYSBEEP(6)
500 EXIT(0)
510 // ** SUB **
520 @SHOT
530 HP=0
540 FOR J=0 TO 2
550 HP=FINDCHAR(IV,0,XY(J))
560 IF HP>=0 GOSUB HIT
570 NEXT
580 IF (UF&6)==0 GOSUB MISS ELSE GOSUB DELIV
590 IF (UF&6)==6 THEN UF=CLAMP(UF+8,0,16) ELSE UF&=23
600 UF=(UF&24)+1
610 RETURN
620 @HIT
630 IV=SETCHAR(HP,232,IV)
640 SC+=(HP+1)*(1+(XY(J)==141)*4)
650 GOSUB SSUB
660 SYSBEEP(1)
670 WAIT(0.2,0)
680 IF XY(J)==141 THEN SYSBEEP(2)
690 WAIT(0.3,0)
700 UF|=(J+1)*2
710 RETURN
720 @MISS
730 HC=232
740 GOSUB SSUB
750 SYSBEEP(4)
760 WAIT(0.5,0)
770 HC=238
780 UF=0
790 WT-=15
800 I=0
810 RETURN
820 @DELIV
830 HP=0
840 WHILE 1
850 HP=FINDCHAR(IV,0,232)
860 IF HP<0 THEN BREAK
870 IV=COPYSTR(" "+IV,0,HP+1)+COPYSTR(IV,HP+1,9)
880 WEND
890 I=WT/10
900 RETURN
910 @SSUB
920 STRING SS
930 SPRINTF(SS," %d",SC)
940 SS=COPYSTR(SS,STRLEN(SS)-4,4)
950 PRINTF("%s%c%c%c%s",SS,XY(0),XY(1),HC,IV)
960 FREE SS
970 RETURN

プログラム解説

 ここでの変数は、
SC:スコア
SS:スコア表示用
IV:インベーダー
XY(0):砲台Xキャラ
XY(1):砲台Yキャラ
WT:ウエイト
HP:倒した位置
CH:書込用キャラNo.
HC:砲台表示キャラNo.
I,J:ループ用
UF:フラグ用
 サブルーチンは、
@SHOT:撃った時の処理
@HIT:当たった時
@MISS:ミスした時
@DELIV:破壊インベーダー消去
@SSUB:表示用
 この中で特に説明が必要なのは、フラグとして使っている変数「UF」。これは、全て2進数として処理している。
 例えば「UF=14」を2進数にすると「UF=01110」。この5桁の値それぞれに役目を設けて、ゲーム中でON・OFFを判別するフラグを、全てこの1つで済ませてみた。
 5桁それぞれの役目は、

1桁目(10進数で1):2本以上タップしているか
2桁目(10進数で2):Xが命中したか
3桁目(10進数で4):Yが命中したか
4桁目(10進数で8):XY両方命中したか
5桁目(10進数で16):UFO出現条件か

 1桁目の役目として、指2本のタップで撃つが、タップしたままだとどんどん撃ち続けてしまうため、一度1本離してから再度タップしないと撃てないようにする。それが350〜360行。
 2・3桁目は、撃って当たったのがにXY両方か、片方か、当たらなかったかの判別。当たらなかったらミスで、両方なら4桁目を1にする。
 4桁目が1の時、再度両方当たれば5桁目を1に、当たらなければ4桁目は0に戻す。
 5桁目が1の時はUFOを出して0に戻す。

 という感じ。

 特定のフラグのみ判別したい場合、例えば580行の「IF (UF&6)==0」は、2進数00110=6とのANDで2・3桁目だけ判別する。またAND代入「UF&=23」とすれば、23=10111と4桁目だけ0にできるなど、そこだけ抜き出せたり一度に処理できるので面白い。



タグ:iPhone DPC-100

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

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

×

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