8月15日 盆帰りしていた姉家族が,山梨へと帰る。こうしろうの従兄弟ゆうき(小6),なっちゃん(小2)も名残惜しそうにかずやほのちゃんと握手して車に乗りこんでいった。ここ数日は,中学生1名,小学生3名,幼稚園児1名で上へ下への大騒ぎであった。こうしろうが大人しくなった分だけ,ほのがパワーアップし「どどどー」と子供の群れが地響きをあげていた。従兄弟達が帰ってしまうと妙に静かになってしまった。祭りの後の寂しさを紛らわすために,かずは夏休みの宿題の定番,読書感想文を書き始め,こうしろうは「戦争についての記事をスクラップして,感想を書かなくっちゃ・・・」とコンビニに新聞を買いに行った。連日,飲みすぎて疲れた親父は,惰眠をむさぼる。
 
 昼過ぎにMindStormsタイムを始める。本日のテーマはJavaで無限軌道車を動かすことだ。



車を前進,後退,再度前進させるサンプルプログラムを示し「こんな,感じだ」と簡略すぎる説明をした。



import josx.platform.rcx.*;
class drivesp1 {
 final static int MOTOR_POWER = 4;
 static void main(String[] args) 
 throws Exception {
  Motor.A.setPower(MOTOR_POWER);
  Motor.A.forward();
  Motor.B.forward();
  Thread.sleep( 1000 );
  Motor.A.backward();
  Motor.B.backward();
  Thread.sleep( 1000 );
  Motor.A.reverseDirection();
  Motor.B.reverseDirection();
  Thread.sleep( 1000 );
  Motor.A.flt();
  Motor.B.flt();
  Thread.sleep( 1000 );
  Motor.A.stop();
  Motor.B.stop();
 }
}



言葉で説明しなくてもロボットを動かせば,直感的に理解できるところがMindStormsの良いところである。また,メソッドの名称が以前使っていたNQC(Not Quite C)に似ているので,スーッと読めるようである。setPowerはモーターの回転数を指定し,forwardは前進,backward は後退,reverseDirectionは回転方向を変え,stopで停止する。出力ポートAに繋いだモーターはMotor.A と指定できる。1つだけこうしろうに質問を受けたのがMotor.A.flt();のfltであったが「NQCのfloatと同じだよ」で説明は終わった。

 「四角形を描くように動くプログラムを作ってみるか」と問題を出すと,motorをmoterと書いたり,{ }の数が合ってなくて山のようにコンパイルエラーを出しながらも,何とか目的の処理にたどり着いた。


import josx.platform.rcx.*;
class sikaku {
 final static int MOTOR_POWER = 4;
 static void turn(Motor motor)
 throws Exception {
  motor.setPower(MOTOR_POWER);
  motor.reverseDirection();
  Thread.sleep( 2000 );
  motor.reverseDirection();
 }
 static void main(String[] args) 
 throws Exception {
  Motor.A.setPower(MOTOR_POWER);
  while(true){
   Motor.A.forward();
   Motor.B.forward();
   Thread.sleep( 1000 );
   turn (Motor.B);
  }
 }
}



 考えてみるとJavaの基本や文法的な規則をこうしろうに教えたことがない。と言うか,私も体系的に教えられる程,詳しくないのである。コンパイルエラーを見ながら,「ああ,きっとここだ」,「これ,書かなくっちゃいけないんだろう」とこうしろうと一緒にデバッグを進める。Javaコンパイラって丁寧だなと2人で感心したのは,turnメソッドにthrows Exceptionを書き忘れていたため出力された「例外 java.lang.InterruptedExceptionは報告されません。スローするにはキャッチまたは,スロー宣言をしなければなりません。 Thread.sleep( 2000 );」というエラーメッセージである。どうもThreadクラスのsleepメソッドが例外を投入するので,その例外が発生した場合の処理を記述するか,例外が発生するよと書きなさいということらしいが,現在の状態を指定した時間保つだけのsleepに例外は発生するまいとthrows Exceptionを追加して,コンパイルエラーをなくす。Javaは丁寧というか,決め決めというか,安全第一という感じがする。

 こうしろうが今回,作成したプログラムで「おっ,気が利いているな」と感じたのは,turnメソッドの中で直接モーターを指定せずに,turn(Motor motor)と引数としてモーターを受け取り,motor.reverseDirection();のように渡されたモーターに対して処理を記述してturnメソッドの汎用性を高めたところであった。