スローフードのように,LejOS(レホス)を使ってMindStormsでJavaを勉強していくことが最近のMindStorms日記のテーマである。本の付録やネット上のサンプル・ソースをコピーしてファーストフードのようにプログラムを作成するのではなく,じっくりと噛みしめるようにプログラミングを学習して行こうという試みである。

7月21日 梅雨明け間近を感じさせる暑い日,夕刻からこうしろうとMindStormsタイムを始めた。テーマにのっとり,決して慌てずスローに進行する。まずは前回作成したプログラムを再度見直す。
(Japan.java)



import josx.platform.rcx.*;    ……(1)
public class japan
{
 public static void main (String[] aArg)
 throws Exception
 {
  LCD.clear();            ……(2)
  TextLCD.print ("japan");    ……(3)
  Thread.sleep(500);
  LCD.clear();
  TextLCD.print (" ");
  Thread.sleep(500);
  TextLCD.print ("japan");
  Thread.sleep(3000);
 }
}



 (1)のimportコマンドでjosx\platform\rcxにあるパッケージ(ソースプログラム)を読み込む。


(このフォルダにはMindStormsの頭脳RCX用のパッケージが置かれている)

 (2)のLCD.clear()はLCDクラスのclearメソッドを実行する。RCXのLCDをクリアするメソッドである。Javaの場合,クラス名とファイル名は一致しなくてはいけないので,このメソッドはLCD.javaに定義されていることになる。

 (3)のTextLCDクラスのprintメソッドでLCDへの出力を行う。このメソッドはTextLCD.javaに定義されている。「こうしろう,TextLCD.print ("japan")とするとTextLCD.javaの中でどのメソッドが呼ばれているか見てごらん」とソースリストを読むことを勧める。

(TextLCD.javaから抜粋)


public static final void print(String str)   ……(1)
{
 // This is leaking
 print (str.toCharArray());
}

/**
 * Print up to the first 5 characters of a char array to the LCD.
 * There is no need to refresh the LCD.
 * Space is displayed if less than five characters.
 * Characters are approximations. There is only so much you can
 * do with this lcd screen!
 */
public static final void print(char[] text)   ……(2)
{
 int i = 0;

 for(; (i < text.length) && (i <= 4); i++)
  printChar( text[i] , 4 - i); 

  while(i <= 4) printChar((char)0, 4 - i++); // print blanks
  LCD.refresh();
 }

/**
 * Prints a character to a given position. Input character is
 * assumed to be an ascii character < 127. Position is between
 * zero and four, counting from the RIGHT.
 * Character will not be shown until <code>LCD.refresh</code> is called.
 */
public static final void printChar(char the_char, int pos)  ……(3)
{
 if (pos == 0)
  native_print_pos_0(ascii_display_codes[(int)the_char]);
  else if (pos == 1)
  native_print_pos_1(ascii_display_codes[(int)the_char]);
  else if (pos == 2)
  native_print_pos_2(ascii_display_codes[(int)the_char]);
  else if (pos == 3)
  native_print_pos_3(ascii_display_codes[(int)the_char]);
  else if (pos == 4)
  native_print_pos_4(ascii_display_codes[(int)the_char]);
}



 こうしろう,じっと読んではいるが,頭にはなかなか入っていかない様子。「そこに書いてある英語のコメント読んだら,処理の内容がわかるだろう?」,「わからん単語があるから」ともうひとつ気乗りしないようだ。梅雨明け前のじっとりとした暑さは午前中,部活をしていたこうしろうの体と,町内の祭りの準備をしていた私の体に,やる気を奪うに十分なだるさを残したようだ。

 TextLCD.print ("japan")とするとTextLCD.javaの(1)のprintメソッドが実行される。中身のコードはprint (str.toCharArray())で文字列を文字の配列に変換し(2)のprintメソッドを呼び出しているだけだ。(2)のprintメソッドは,文字配列から1文字ずつ取り出し(3)のprintCharメソッドに渡している。printCharメソッドはchar(文字)とpos(ポジション)の2つのの引数を受け取り,指定されたポジションに文字を表示する。posが0から4まで記述されているので,RCXのLCDには5文字分出力可能なことがわかる。

 この辺まで説明すると,こうしろうの眠そうな目に少し光がさしてきた。「スローフード協会のシンボルマークのカタツムリにちなんでさあ,このLCD上をゆっくりとカタツムリを模した文字を動かしてみよう」と問題を出す。

 こうしろうはsnail.javaというプログラムを作成した。


import josx.platform.rcx.*;

public class snail
{
 public static void main (String[] aArg)
 throws Exception
 {
  LCD.clear();
  int i;
  for(i=0;i<4;i++)
  {
   TextLCD.printChar ('G',i);
   LCD.refresh();
   Thread.sleep(400);
   TextLCD.printChar (' ',i);
   LCD.refresh();
  }
 }
}



 Gの文字をLCDの右から左へと動かしていくプログラムである。実は,最初LCD.refresh()を入れていなかったので,LCDには何も表示されなかった。「あれっ」と思い,TextLCD.java の(2)のprintメソッドのコードにならい,LCD.refresh()を追加すると首尾よく表示された。



 残念ながらカタツムリには見えない。

 「こんな風にさあ,こうしたらどうなる,ああしたらどうだ,と試行錯誤しながら言語の勉強していくのも面白いだろう」とノートPC越しに顔をのぞきこむと,こうしろうはふたをはぐって(富山弁解説:はがして,開いての意)中身を調べていくような作業にワクワクした表情を見せていた。