OCEANS

SHARE

試行錯誤もまた楽し。パズルを解くようにプログラムを攻略しよう

「ジョイコンを振るごとに、光る場所が順番に変わる」プログラムも、基本の流れは「ジョイコンを振ったら、画面が光る」プログラムと同様だ。まずは、「ジョイコンを振ったら」という入力ノードと、「画面が光る」という出力ノードを、光らせたい場所の数だけ配置し、ノードとノードを線でつないでみよう。

「カウンター」は、入力ノードから送られた信号の数を数えて、指定した条件に合う数(の範囲)になったときに(つながっているノードに)信号を渡す、という役割を果たす中間ノードだ。条件の指定は、ノードの「設定」ボタン(歯車の形)をタップして表示される画面で行う。
たとえば下の画面は、スライダーで数を「1」~「1」とすることで、入力ノードから送られた信号の累計が「1」になったときに信号を渡す、という設定をしたことになる。つまり、ジョイコンを1回振ったときに、信号が渡される(0回、または2回以上では渡されない)というプログラムを組んだわけだ。

同様に「『2』になったとき」「『3』になったとき」「『4』になったとき」というカウンターを配置し、入力ノード(ジョイコンを振る)と出力ノード(画面が光る)の間に挟むようにして、線でつなぐ。

試しにジョイコンを振ってみると……。思惑どおり、ジョイコンを振った回数に応じ、対応する場所が光るようになった。しかし、これだけではまだ不十分。なぜなら4回以上ジョイコンを振ると、どのカウンターも反応しなくなり、画面が光らなくなってしまうからだ。
この問題を解決するためには、どこかのタイミングでカウンターの数をリセット(0に戻す)する必要がある。
ここで重要なのが、中間ノードの線のつなぎ方。入力ノードと出力ノードの間に挟む中間ノードは、左右両方に線をつなぐ端子があり、「カウンター」の場合は左側に「+(数を1つ足す)」、「-(数を1つ減らす)」、「0(数を0にする)」という3つの端子が用意されている。
つまり「0」を使えば、カウンターの数がリセットされるわけだ。配線がちょっと複雑になるので、図版で説明しよう。

まずは「カウンターD」の配線(緑の線)に注目。「光る」だけでなく、カウンターA~Cの「0」とも線でつなぐことにより、対応する画面を光らせるのと同時に、A~Cのカウンターをリセットさせている。
ただし、これではやはりカウンターDの数値が増えたままになってしまうので、カウンターAとカウンターDの「0」とをつなぐ(赤い線)。これで、カウンターAが「1」になったときに、カウンターDがリセットされるようになる。
プログラムとしては、これで完成! のはずだったのだが。実際に動かしてみると、何故か思惑どおりには動いてくれない。プログラムが2巡目(最初にカウンターDがリセットされて以降)になると、4番目の「光る」が反応するタイミングがずれてしまうのだ。
試行錯誤の結果、カウンダ―Dの設定を「『4』になったとき」から「『2』になったとき」に変更することで、順序良く画面が光るようになった。詳細な説明は省略するが、各カウンターが「0」にリセットされることで、タイミングに余分が生じることが原因のようだ。あらためて上の図を見て、論理パズルを解くように考えてみれば、なぜカウンターDを「2」に設定する必要があるのか、わかってもらえると思う。
おそらく、より適切なプログラムもできるのだろうが、筆者のスキルではこれが限界。こだわりたい人は、さらなる工夫を考えてみるのも楽しいだろう。とはいえ、プログラミングの初歩としては「取り合えず目的通りに動けばOK」という考え方でも良いはずだ。


3/4

次の記事を読み込んでいます。