前回,かず(小学校4年生)はコマが大好きだという話を書いたが,もうひとつ大好きなものがある。それは『ゴム動力』だ。
9月1日 かずがレゴのカタログに載っているテクニック・シリーズの三輪バギーを真似て,MindStormsでゴム動力車を作る。
カタログの三輪バギーもゴム動力で動くのだが「見ても,よくわからない」ので独自の方法を考える。
後部の持ち手を持って,後ろに引っ張る。引っ張っているのは,おなじみとなりつつあるかずの手だ。
大きなギヤに繋がっているモーター部に,ゴムが巻かれる。手をはなすと三輪バギーは勢いよく進むのであるが,ゴム動力のプルバック・モーターの場合,一工夫必要なのである。動力部とギヤがつながりっぱなしであると,ゴムが巻かれた分進んだあと,ゴムの力でつっぱって急停車してしまう。スーと惰力で進むようにするにはギヤの1つを遊動式にしなくてはならない。
エンジン側のギヤとタイヤ側のギヤを繋ぐ中央のギヤは固定せず,上下に動くようにしている。プルバック・モーターを巻いている時とモーターの力で進んでいる時には,ギヤはピタッと固定されているが,動力がなくなると中央のギヤが数ミリ下がりギヤの連携を断ち切る。結果,三輪バギーは惰性でスーと進むのである。
ところで,こうしろうは何をしているのか?このままだと『かずのMindStormsで遊ぼう』になってしまう。主役交代か?
こうしろうは日経ソフトウエア連載の『ゼロから学ぶC/C++言語』でコツコツとC言語の勉強をしていたのである。この日は関数について学ぶ。サンプルプログラムを入力し,ジロジロとにらむ。(最近,また近視が進んだようだ。)
#include<stdio.h>
/*プロトタイプ宣言*/
int loop(void);
int kakunin(int k);
int main()
{
printf("%d回で当たりました!\n",loop());
return 0;
}
int loop(void)
{
int zobun = 50,fugou,kouho = 50;
int henji;
int kaisuu = 1;
while(1){
henji = kakunin(kouho);
switch(henji){
case 0:
return kaisuu;
case 1:
fugou = 1;
break;
case 2:
fugou = -1;
}
zobun /= 2;
if (zobun == 0)
zobun =1;
kouho += fugou * zobun;
kaisuu++;
}
}
int kakunin(int k)
{
int henji;
do{
printf("あなたの考えている数字は"
"%dですか?\n",k);
printf("はい=0 もっと大きい=1 "
"もっと小さい=2: ");
scanf("%d",&henji);
}while (henji < 0 || henji > 2);
return henji;
}
このプログラムは数当てゲームであるが,頭の中で1つ数字を考え,コンピュータがあなたの考えている数字はXXですか?と訊ねてくるのに対し,「はい」とか「もっと大きい」,「もっと小さい」と答えていくとそのうち一致するというおもしろくもなんともないゲームである。しかし,プログラムの学習に必要な要素はふんだんに盛り込まれている。zobun(増分値)を2で割り,fugou(符号)を掛けてkouho(候補)の値を増減させるところなんて実に勉強になる。
こうしろうが悩んだところは,printf関数の引数として,loop()関数を指定しているところだった。「それは,kaisuu(回数)という値を指定することと同じだよ」という説明でなんとなく理解できたようだ。