ある夜,かずがパソコンに向かい,ごちゃごちゃやっている。また,ゲームかとのぞき込むと以前買ってやった「HSP2.55プログラミング入門」を片手にHSP (Hot Soup Processor)の勉強をしているのである。妻に聞くと,ひとりでつまつま,たまにやっているとのこと。ヘぇー,こいつ勉強熱心なところもあるんだと感心してしまった。

 3月14日 前々回(第151話参照)から,かずは魚雷船ゲームをHSPで作っている。戦艦から魚雷を落とし,海中にうようよしている潜水艦をやっつけるゲームである。潜水艦はミサイルで攻撃する。
 戦艦を右左の矢印キーで動かすことと,潜水艦を一隻出現させるところまでは前回までで,できている。今日の目標は潜水艦を何隻も出現させることだ。

 「つんから,つんから,潜水艦を出すときは,配列を使えばいいがいちゃ。説明しようか。」(富山弁解説 つんから,つんから=「どんどん続けて」のような意味)「なーん,やってみるちゃ」とHSPというプログラム開発環境に「やってみればなんとかなる」という程度に慣れたかずは,自力でプログラミングを進めていく。私は,しめしめとソファーで昼寝をする。富山も春めいてきたので,眠気が強い。一生懸命,考えているかずの後ろで1時間近く寝てしまった。

 「できたよ」と言って,見せてくれたプログラムには,「なぜ」と悩んでしまうようなコードや考慮不足なところもあったが,なんにしても潜水艦はつんから,つんから現われ,ウィンドウ上を左から右に進んで行っていた。

 プログラムは以下の約80ステップである。かずは妙な几帳面さを発揮して,全行にコメントを入れるという修行のようなコーディングをしたが,読者のみなさんはとても全行読む気にならないでしょうから,かいつまんで説明します。
 dim ey,20,dim ex,20でey,exを0から19の20の要素を持つ配列として定義して,潜水艦20隻の現在位置を記録できるようにしている。repeat emx ~ loopの中でex.i(ex配列のi番目)に4を足して,各潜水艦を移動させている。emxは出現させた潜水艦の数である。ラベル*newe以降が新しい潜水艦を出現させる処理だ。

----------------------------------------
 
;------初期処理------
  buffer 1,,,1                          ;ウィンドウID1を用意
  picload "senkan2.bmp"                 ;グラフィックの読み込み
  screen 0,640,480, 1                   ;画面サイズの設定
  palcopy 1                             ;パレットを
                                          ;グラフィックに合わせる
  randomize                             
  px=600 :py=40                         ;自艦の初期位置
  ex=1                                  ;敵の初期位置
  dim ey,20                             ;敵位置の配列変数を用意
  dim ex,20                             ;
  emx=0
;------メインループ------
*main                                     ;ラベル
  redraw 2                              ;メイン画面に反映させない
  gosub *haikei                         ;背景設定にとぶ
  stick ky,15                           ;キー入力
  if ky=1{                              ;自艦の移動
    px-=8                             
    if px<8{                          
      px=8                          
    }                                 
  }                                     
  if ky=4{                              
    px+=8                             
    if px>600{                        
      px=600                        
    }                                 
  }                                     
  pos px,py                             ;自艦の表示
  gcopy 1,0,0,32,32                     
  rnd z,50                              ;変数zに0~99の数を代入
  if a>10{                              ;前回敵が表示されてから
                     ;1秒以上経ってるか
     if emx<20{                        ;敵の数が20機以下かの判定
      if z=49{                       ;乱数が49の時に敵を増やす
        gosub *newe                ;敵の出現にとぶ
      }                             
    }                                 
  }                                     
  i=0                                   ;変数iの値を0にする
  repeat emx                            ;敵の数だけループさせる
    ex.i+=4                           ;敵の移動
    pos ex.i,ey.i                     ;敵の表示
    gcopy 1,32,0,32,32                 
    i+=1                              ;変数iに1を足す
  loop                                  
  a+=1                                  ;変数aに1を足す
  if ex.19>640{                         ;最後の敵が通り過ぎて
                                          ;いないかの判定
    gosub *owari                      ;ゲーム終了に跳ぶ
  }                                     
  redraw 1                              ;メイン画面の更新
  wait 1                                ;0.01秒待つ
  goto *main                            ;*mainに戻る
;------背景の設定------
*haikei                                   ;ラベル
  color 0,255,255                       ;画面を水色に塗りつぶす
  boxf 0,0,639,479                      
  color 0,0,255                         ;画面の下を青色に塗る
  boxf 0,60,639,479                     ;
  return                                ;メインループに戻る
;------敵の出現------
*newe                                     ;ラベル
  rnd ey.emx,340                        ;乱数でy軸に値を設定
  ey.emx+=100                           
  a=0                                   ;変数aのリセット
  emx+=1                                ;変数emxに1を足す
  return                                ;メインループに戻る
;------ゲームの終了------
*owari
  color 0,0,0
  boxf 0,0,639,479
  color 255,0,0
  font "MS ゴシック",60,1
  pos 150,200
  mes "ゲームクリア"
  redraw 1
  stop
  return

----------------------------------------
 ざっとソースを眺めていただけただろうか。実はこのソースは,私がレビューして「ここは意味がないぞ」とか「変数は読んでわかりやすいように,ちゃんと定義して,初期化して」などと注文を付け,直させたものである。
 最初のコードは迷い箸を煮魚や,里芋の煮っ転がしに突き刺したように,ずいぶん悩んだあとがうかがえるコードだったが,それでも,かずは自力で何とか目標を達成していた。HSPはデバッグウィンドウも使えるし,強力な命令があるので短いコードで結果を出しやすいのである。