あみだくじ

概要

あみだくじをシミュレートします。 上辺に並ぶ四角い枠をクリックすると、それが落ちてあみだをたどって進みます。 一番下まで到達すると、何番だったかが分かるので、それを上辺に書き込みます。 横渡しする棒はランダムに生成しているので、実行する度にどの位置がどこにゴールするかはプログラムにも分かっていません。 シミュレートして、最後まで到達してはじめてわかるつくりになっています。 画面左下の QUIT ボタンを押すと、いつでも実行終了します。

元は2011年の基礎プログラミング演習IIのために作ったもので、そのためにこの演習授業が終了した時点で受講生たちが知りうる範囲の文法と記述方法で作っています。 大域変数に、構造体でも何でも無く一次元配列の形で座標情報などがとられているのはそのためです。 ポインタを扱わないので関数も参照渡し無しです。 基礎プログラミング演習 II 終了時点ではこの位のことができるまでには到達している、という参考までに。

内部構造

内部的にはデータは上の図(左側)のように「線」ではなく、二次元配列のマス目からなるマップを用意して、そこのマス目を一コマずつ進むように作られています。 つまり一コマ進むごとに、到達したマスが「線」か、「交差点」か、「ゴール」かがわかります。 それによって次にどこに進むべきかを決めることができるわけです。

ただし、描画するときは上の図右側のように、線として表現しています。 マスがつながるようにして描画する事もできるのですが、実際そんなにたくさんの四角形を描画させるのは Handy Graphic にはちょっと荷が重く、ループ周期を余り短く出来なくなってカクカク動くようになってしまいます。

プログラム

実のところ、このコードは幾らかトリッキーなところがあります。 その奇妙なところは真似しないようにお願いしますね。
(たとえば lineX1[], lineY1[], lineX2, lineY2[] には描画した線の両端の位置情報が格納されていますが、プログラム中ではこの配列のゼロ番要素から Vlines -1 番要素までが「縦の線」に関する情報です。Vlines 番めから後に横線の情報が蓄積されています。プログラムではこの「あみだくじの n 番が、画面上の横位置 lineX1[n] に存在する」ことを使って「ゴールにたどり着いたときの横位置は n だった、これは lineX1 の N 番目の要素と等しい」場合、このくじは N 番にたどり着いた、と判定しています。これはやはり変で、実際にはマップ上のマス目の情報として「ゴール」だけではなく「何番目のゴール」かを記録しておくべきですね。)

  1. コード:amida.c(コンパイルと実行にはHandy Graphic が必要です。)
  2. 動作サンプル:#1 (QuickTime Movie)

Yutaka Yasuda (yasuda@bakkers.gr.jp)