1月17日 手の届きそうな難しさが,かずを夢中にさせるのかHSP (Hot Soup Processor)によるプログラミングは留まるところを知らない。今日はまず,ボール(小さな四角形)が斜めに動くようにする。前回,Y軸の値(変数y)を変化させてボールを上下させたので,X軸の値(変数x)も変化させれば,ボールが斜めに動くことには,かずもすぐ気が付いた。
 しかし,ボールが壁にぶつかったときに,どうやって斜めに向きを変えるのかが,わからないと言う。
 こんな風に動かしたいのだが,左右の壁にぶつかったときに変数xとyの値を,どうすれば良いかがわからないのである。

 斜め方向の移動は,上下の移動と左右の移動の組み合わせであることを説明し,上下の壁に達したときと同様に左右の壁にぶつかったときも,変数xに加算する値の符号を反転させて,変数yの符号の反転と組み合わせれば,上図のような軌跡を描くことを紙に書いて説明した。

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

 理屈がわかれば,プログラミングに迷うことはない。これでボールは,プログラムを終了させない限り,ずっと斜めに移動するようになった。

 「今日はここまで」と試しに言ってみたが,「いや,まだやる」と 145話で作ったマウスに追随して動く細長い長方形(ラケット)のプログラムと,今作った斜めに移動するボールの動きを組み合わせることになった。
 「やってみるちゃ」とかずは2つのプログラムを1つにしていく。プログラム2つ分のwaitが入って,動きが遅くなっていたのを直したほかは,特に問題はなかった。

 これでやめるかと思ったら,次はラケットでボールを打ち返せるようにするという。これも「やってみるちゃ」と始めるのだが,どういう条件でヒットしたと判断するのか事前に考えていないので,プログラミングが進むわけがない。
 そこで,このぐらいの範囲をヒットにすればと絵を描いてみせた。

 「この範囲を式で書いてごらん」というと,yy-4がXXXで…と汚い字で書き,プログラムの作成を始めた。考え方やヒントを与えるだけで,自力でプログラミングできるようになりつつある。

----------------------------------------
  screen 0,600,480,1
  cls 4
  oldy=-1
  oldx=-1
  x=300
  y=5
  z=2
  a=2
  oldxx=-1
  oldyy=-1
  mouse -1
*draw_r
  if y <=2{
    z=z*(-1)
  }
  if y >= (winy-4){
    mouse 0
    stop
  }
  if (x >= (winx-4) )|(x <=2){
    a=a*(-1)
  }
  if (oldy >= 0) {
    color 0,0,0
    boxf oldx,oldy,oldx+4,oldy+4
  }
  color 200,255,100
  boxf x,y,x+4,y+4
  oldy=y
  oldx=x
  y+=z
  x+=a
  xx=mousex
  yy=mousey
  if xx > 540 {
    xx=540
  }
  if yy > 476 {
    yy=476
  }
  if (oldxx >= 0) & (oldyy >= 0) {
    color 0,0,0
    boxf oldxx,oldyy,oldxx+60,oldyy+4
  }
  color 200,255,100
  boxf xx,yy,xx+60,yy+4
  oldxx=xx
  oldyy=yy
  if (y >= (yy-4))&(y <= (yy-1)){
    if (x >=(xx-3))&(x <= (xx+63)){
      z=z*(-1)
    }
  }
  wait 2
  goto *draw_r
----------------------------------------

 if文はネストできる(入れ子にできる)ことを説明していたら,「ネストちゃ,ロシアのマトリョーシカみたいなが」とこうしろうが横から茶々を入れた。そんな中,かずは「この処理は,どこに書けばいいかな?」などと試行錯誤しながらプログラムを作っていった。

 ラケットでボールを弾き返せるようになった。

 次の目標は,処理の一部をサブルーチン化して,ズラズラ書きのコードを改善することと,コメントを入れどこで何をしているのかわかるようにすること,それから,コードの中で,540などと数値を直接指定しているところを・・・とケチをつけるとキリがないが,スタイルがどうであれ,自分でどんどんコードを書き出したかずに少しだけ感心した。