クラブに入るまで新中学生は,ひまなのだ。かずは,なんとなくモラトリアムな時間の多くをHSP (Hot Soup Processor)によるプログラミングに割いている。
 前回(155話),紹介したパソコンの使用時間を記録するプログラム「使用時間チェッカー」のほかに,151話から始めた魚雷船ゲームのプログラミングも地道に続けている。

 敵である潜水艦は勝手に,どんどんミサイルを打ち上げる。スペース・キーを押すと,船から対潜用魚雷が投下され,潜水艦に命中すると,潜水艦が消えるようになっている。

 「あとは,ダメージを計算しないといけないな…」と自力でプログラミングを進めるかずの思考に,私はついていっていない。休日のHSPタイムも「やってみるちゃ」と相談もなく進めるので,今何を考えているのか,わからない。
 強力な命令が用意されているHSPだから,150ステップ(行数)ぐらいで上記の処理を実現できるのだが,gosubであっちこっちに飛ぶのと,変数名が短くて,変数の目的がはた目にはわかりにくい。そんなわけで,父はもうソースコードを追うのをあきらめてしまった。
 ざっと,目を通してみてください。

---------------------------------------------------------------
;------初期処理------
  buffer 1,,,1 ;ウィンドウID1を用意
  picload "senkan2.bmp" ;グラフィックの読み込み
  screen 0,640,480, 1 ;画面サイズの設定
  palcopy 1 ;パレットをグラフィックに合わせる
  randomize   px=600 :py=40 ;自艦の初期位置
  hp=3 ;自艦の耐久値
  ex=1 ;敵の初期位置
  dim ey,20 ;敵位置の配列変数を用意
  dim ex,20
  e=0
  etmx=6 ;敵弾の表示の最大数
  ecn=20
  dim etf,etmx ;敵弾の情報の配列変数を用意
  dim etx,etmx
  dim ety,etmx   dim s,20
  i=0
  repeat etmx ;敵弾の表示状況の設定
    etf.i=0
    i+=1
  loop
  i=0
  repeat 20 ;敵艦が弾を表示してからどれだけ時間が経っているかの情報を入れる変数の初期設定
    s.i=100
    i+=1
  loop
  gmode 2 ;透明色を有効にしたコピーモードを指定
;------メインループ------
*main ;ラベル
  redraw 2 ;メイン画面に反映させない
  gosub *haikei ;背景設定にとぶ
  i=0
  repeat e
    if ex.i=640{
      emx-=1 ;ゲーム終了に跳ぶ
    }
    i+=1
  loop
  stick ky,15 ;キー入力
  if ky=1{ ;自艦の移動
    px-=8
    if px<8{
      px=8
    }
  }
  if ky=4{
    px+=8
    if px>600{
      px=600
    }
  }
  if tf=0 { ;自艦弾が発射されていたら以下の5行を実行
    if ky&16 { ;スペースキーが押されているかの判定
      tx=px+8 ;自弾の位置を自艦の下に合わせる
      ty=py+16
      tf=1 ;自弾が出ているか判定する変数に1を代入
    }
  }
  else { ;自弾が発射されていなかったら以下の4行を実行
    ty+=16 ;自弾の移動
    if ty>480 { ;自弾が画面から出ていたら以下の1行を実行
      tf=0 ;自弾が出ているか判定する変数をリセットする
    }
  }
  if tf=1 {
    gosub *hitto
  }
  if tf=1 { ;自弾が出ていたら以下の1行を実行
    pos tx,ty ;自弾の表示
    gcopy 1,64,0,16,16
  }
  pos px,py ;自艦の表示
  gcopy 1,0,0,32,32
  rnd z,50 ;変数zに0~49の数を代入
  if a>10{ ;前回敵が表示されてから1秒以上経ってるか
    if e<20{ ;敵の数が20機以下かの判定
      if z=49{ ;乱数が49の時に敵を増やす
        gosub *newe ;敵の出現にとぶ
      }
    }
  }
  a+=1 ;変数aに1を足す
  i=0 ;変数iの値を0にする
  repeat e ;敵の数だけループさせる
    ex.i+=4 ;敵の移動
    pos ex.i,ey.i ;敵の表示
    gcopy 1,32,0,32,32
    i+=1 ;変数iに1を足す
  loop
  if e>0 { ;敵艦が表示されていたら以下を実行
    rnd z,e ;ランダムに敵艦を1つ選択する
    rnd r,etmx ;ランダムに敵弾を1つ選択する
    if s.z>99 { ;選択した敵艦が前回に弾を表示してから一定時間経っていたら以下を実行
      if etf.r=0 { ;選択した敵弾が画面に表示されていなかったら以下を実行
        etx.r=ex.z+8 ;選択した敵艦の位置に選択した敵弾の位置を合わせる
        ety.r=ey.z
        etf.r=1 ;敵弾の表示状況の更新
        s.z=0
      }
    }
    i=0
    repeat etmx
      if etf.i=1 {
        pos etx.i,ety.i
        gcopy 1,80,0,16,16
        etx.i+=2
        ety.i-=4
        s.i+=10
        if (etx.i<0)|(etx.i>624)|(ety.i<60) {
          etf.i=0
        }
      }
      i+=1
    loop
  }
  if emx>1 {
    goto *owari
  }
  redraw 1 ;メイン画面の更新
  await 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.e,340 ;乱数でy軸に値を設定
  ey.e+=100
  a=0 ;変数aのリセット
  e+=1 ;変数eに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
;------当たり判定------
*hitto
  i=0
  repeat e
    x=ex.i
    y=ey.i
    if (x+32>tx)&(tx+16>x)&(y+32>ty)&(ty>y) {
      ex.i=640
      tf=0
    }
    i+=1
  loop
  return
---------------------------------------------------------------
 面倒くさくなったでしょ。私にとって,わかりやすくするために「適当にコメントを入れて」と注文を出すのだが,かずがテキトーに入れたコメントは,もうひとつわかりにくい。

 「変数の数が多くて,わかりにくいだろう。ムダなものもあるかもしれないから,変数の一覧をコメントにして書き出して,変数の目的を書き添えるとわかりやすくなるよ」などと猫なで声で誘導するのだが,先に進みたくてならないかずには届かない。

 この夜は1時間半ぶっつづけでプログラムを作っていた。私の役目は,かずがにっちもさっちもいかなくなった時に,「ウィンドウタイトルに文字列を表示するtitleコマンドで変数の値を表示させてごらん」とか,「全部一度に解決しようとしないで,//を入れてコメントにして,どこがちゃんと動いて,どこを実行するとおかしくなるのか,少しずつ確かめていかれ。」などと,かずが途方にくれないようにサポートするだけになってしまっている。

 プログラミングにおける彼の自立を(少し早すぎるようで,危ぶまれる),喜ぶべきか寂しがるべきか,あるいはソースをちゃんと理解して,ついていくべきか,それが問題である。