“RUN” それは魔法の言葉

私とコンピュータの思い出を、だらだらと綴ります。

64.ゲーム&ウォッチのオクトパスを作ろう その5

次は、ゲームの本体と言ってもいい、タコ足の動きの処理を作った。
「マンホール」と同じく、1サイクルごとに、タコの足(の節)がどれか1つ動くことを繰り返してる。
今回はマンホールの通行人のように、ビットで管理するのはあまり意味が無いので、どの足が、どれくらいまで、伸びるもしくは縮むかの方向を、【リスト】という概念で管理することにした。

リストは昔からある考え方で、値をカンマ記号で区切ったものを羅列する。
 1,2,3,4,5,6,7
こんな感じ。ただ、昔のMSXなどのBASICには、このリストを処理するための命令がなかったので、自分で文字をカンマがどこにあるかを判定しながら切り出す処理を作っていた。
BASIC!では、ありがたいことに、リストを操作する命令が標準搭載されていた。

リストを作る:LIST.CREATE命令
リストに値を追加する:LIST.ADD命令

タコの足は、5か所に伸びるけど、1番目と2番目の足は、根元が共通で、どちらか一本しか出ない。
なので、リストは常に4項目になる。はじめのタコ足の順番は適当に。

!タコ足の位置・段階リスト
LIST.CREATE N,oct_leg_pos % タコ足位置
LIST.CREATE N,oct_leg_step % タコ足段階
LIST.CREATE N,oct_leg_def % タコ足方向
LIST.ADD oct_leg_pos,5,3,2,4
LIST.ADD oct_leg_step,0,0,0,0
LIST.ADD oct_leg_def,1,1,1,1

そして、タコ足を動かすのは、「マンホール」の時と同じく、TIMERイベントを発生させて、その都度1本ずつ処理していく。

リストから値を取得する:LIST.GET命令
リストから値を削除する:LIST.REMOVE命令

LIST.GET命令自体は、リストの何番目から値を取得するかを指定できるのだが、今回は常に先頭のリストを取得して、その足の処理を行う。それが終わったら先頭のリストを消して、末尾に今処理した足の情報をリストに付け加えるようにした。いわゆる、FIFO(ファースト・イン・ファースト・アウト)の処理がしやすい。

タコ足の節の数が3~5とバラバラなので、伸びきって縮むまでのステップの違いで、適度にばらついてくれる。
1番目、2番目の足が縮みきったら、ランダムで次にどちらの足を伸ばすかを決めて、リストに追加するようにした。
これだけ適当に作ってみても、それっぽく遊べるゲームになってきた。

! タコ足の処理
LIST.GET oct_leg_pos,1,o_pos
LIST.GET oct_leg_step,1,o_step
LIST.GET oct_leg_def,1,o_def

% タコの足を1つ動かす
IF o_step>0 THEN GR.HIDE oleg_obj[o_pos,o_step]
o_step+=o_def
IF o_step<oleg_ptn[o_pos] & o_step>0 THEN
 GR.SHOW oleg_obj[o_pos,o_step]
ELSEIF o_step=oleg_ptn[o_pos] THEN
 GR.SHOW oleg_obj[o_pos,o_step]
 o_def=-1
ELSEIF o_step=0 THEN
 o_def=1
 IF o_pos=1 | o_pos=2 THEN % タコ足①と②どちらか1本だけにする
  o_pos=INT(RND()*2)+1
 ENDIF 
ENDIF

IF o_pos=pos-1 & o_step=oleg_ptn[o_pos] THEN % ミス判定
 GOSUB miss_logic
ENDIF 

!タコ足情報の更新
!リストの先頭を削除
LIST.REMOVE oct_leg_pos,1
LIST.REMOVE oct_leg_step,1
LIST.REMOVE oct_leg_def,1

!末尾に次のタコ足情報を追加
LIST.ADD oct_leg_pos,o_pos
LIST.ADD oct_leg_step,o_step
LIST.ADD oct_leg_def,o_def

ENDIF