1月11日 かずのHSP (Hot Soup Processor)タイムは今日で4回目だ。前回は細長い長方形をマウスの動きに追随するように動かしていたが,今回の目標は勝手に動くものを作ることだ。具体的には,小さな四角形をウィンドウの上下に移動させることである。
 これが完成イメージだ。小さいボールが上から落ちてくるように見えれば,成功である。

 まず,小さな四角形がどうすれば勝手に落ちてくるのか考えてごらんとかずに問題を出した。
 「Y軸の値を変化させればいいがや」と気づくのに,たいして時間は掛からなかったが,小さな四角形を発生させて,徐々に落としていくアルゴリズムを考えるのには相当の時間が必要だった。

 「ラベルを設定して,そこに繰り返しgoto 文で飛ばすことで繰り返しを行う」とか「システム変数winyでウィンドウのY軸の最大値がわかるので,それより先には描けないぞ」,「四角形の高さも計算に入れないといけないよ」などと,後ろから何度もアドバイスをしているうちに下記のプログラムが出来上がった。

----------------------------------------
  screen 0,600,480,1
  cls 4
  oldy=-1
  x=300
  y=5
*draw_r
  title "winyの値" + winy +"yの値" + y
  if (y >= (winy-4) ) {
    stop
  }
  if (oldy >= 0) {
    color 0,0,0
    boxf x,oldy,x+4,oldy+4
  }
  color 200,255,100
  boxf x,y,x+4,y+4
  oldy=y
  y+=2
  wait 5
  goto *draw_r
----------------------------------------

 前に書いた四角形のY座標の値をoldyに覚えておいてcolor 0,0,0(黒)で四角形を描くことで前の四角形を消すテクニックは,前回(145話参照)作ったプログラムを参考にした。waitコマンドに指定する時間(ミリ秒)を変更するとボールの落下速度が変わる。

 10時になったので,ここまでにしようと言うのだが,かずは「まだ,やりたい」ときかない。「じゃ,落ちたボールがバウンドして上がるようにするには,どうすればいいか」とまた問題を出した。
 「(変数)yの値を小さくすればいい」ことにはすぐ気づいた。
 ではプログラム上,どうやって実現するのかとたずねると「別のラベルを作り,そこに飛ばす。そこでは,繰り返しyから2を引くようにする」というようなロジックをかずは考えた。
 「いや,それは面倒だ」とyに加算する値を変数にして符号を反転させれば,余計なコードを書かなくてもいいよと説明するが,かずはキョトンとしている。

 ある数の符号を反転させる(正の数を負の数に,負の数を正の数に)方法には,その数に -1を掛ける方法,つまりz = z * (-1)とする方法と,「もう1つ,引き算で求める方法があるよね。わかるか」と聞くが,返ってこない。「負の数の計算は,まだ習っていない」とかずは言う。

 習っているけど忘れたんじゃないかと疑い,こうしろうに聞くと,負数の計算は中学1年で教わるとのこと。それでは,富山のような寒いところでは困らないかと「最低気温-2度,最高気温7度の日の温度差はどうやって求めるのだ」とかずに不適切な突っ込みをした。暖冬が続いたが,最近は本格的に寒い。
 「9度だとはわかるけど,式はわからん」と言う。7-(-2)=7+2=9で,負の値を引くのは足すのと同じことだと説明するが,z = 0 - zで符号が反転することは理解しにくいようだ。4月から通う中学の先生になんとかしてもらおう。
 なんか難しくなって今日はおしまい。

 翌日,続きをやる。ボールが下端に達したら上に向かうように,逆に上端に達したら下に向かうように,Y軸の値(y)に足す値(z)の符号を反転させるようにプログラムにコードを追加する。

----------------------------------------
  screen 0,600,480,1
  cls 4
  oldy=-1
  x=300
  y=5
  z=2
*draw_r
  title "winyの値" + winy +"yの値" + y
  if (y >= (winy-4) )|(y <=2){
    z=z*(-1)
  }
  if (oldy >= 0) {
    color 0,0,0
    boxf x,oldy,x+4,oldy+4
  }
  color 200,255,100
  boxf x,y,x+4,y+4
  oldy=y
  y+=z
  wait 3
  goto *draw_r
----------------------------------------

 『もしくは』ちゃ,どう書くがけ?などと質問をしながら,かずはプログラムを作っていった。HSPで,もしくは(OR)は|(縦棒)で表す。

 ボールが勝手に上下に移動するようになった。プログラムを書く前は「どうしたらできるのだろう」と難しそうに感じられる処理でも,少しずつ機能を追加していけば,なんとかなるものである。

 次の目標はボールを斜めに動かすことである。「まだ,続けてやりたい」というかずを「斜めに動かすのは難しいぞー」と半ば脅し,今回はここまでとした。