『象印クイズ ヒントでピント』は、テレビ朝日系列局ほかで、1979年3月4日から1994年9月25日まで、毎週日曜 19:30 – 20:00に放送されていたクイズ番組です。

Wikipediaを見て知ったのですが、この番組は魔法瓶メーカーの象印が一社提供しているため、同業他社であり象印のライバル企業でもあるタイガー魔法瓶に配慮し、トラそのもの、およびそれに関する問題は出題されたことがなく、野球の阪神タイガースに関する問題さえ作れなかったそうです。

いまから作ろうとしているのは、最初に分割され順序がバラバラの画像が表示され、だんだん元の画像に近づいていくというものです。

ではさっそく作成してみましょう。

最初に画像を分割します。そして分割された画像を保存するためのクラスを作成します。Bitmapは分割された画像、TrueRowとTrueColumは全体のなかにおける画像の本当の位置、RowとColumはそのときに表示されている画像の位置です。XとYは実際に描画するときのXY座標です。

また全体が一斉に表示されるのではなく、最初は渦巻き状にひとつずつ表示されていきます。IsShowがfalseのときは描画されません。

Form1クラスにおける処理ですが、最初に分割されたBitmapのリストを作成します。

縦と横に何分割するかを決めたら画像を一部だけ切り取ったものからBitmapPartオブジェクトを作成してそのリストをつくります。

BitmapPartオブジェクトのリストが生成されたら順番をシャッフルします。そして縦横どの位置に描画するかを変更します。

次に描画の処理ですが、最初は渦巻き状に1枚ずつ表示させます。

まだ表示されていないもののなかで、一番上の行で列番号が一番大きいもの、一番左の列で行番号が一番小さいもの、一番下の行で列番号が一番小さいもの、一番右の列で行番号が一番大きいものの順で探し、見つからなければ2周目に入ったということなので、「一番上の行」なら「2番目に上の行」と読み替えてすべての画像が表示されるまでこれを繰り返します。そして最後にInvalidateメソッドを呼び出して再描画させます。

すべての画像が表示されたら今度は各画像を元の位置に戻します。RowとColumのどちらかが本当の値と違っているものをLINQのメソッドWhereをつかって集めて、そのなかからどれかひとつを乱数で選びます。そしてこれを本当の位置にあるものと位置を入れ替えます。これをすべての画像が本当の位置に移動されるまで繰り返します。すべて終わったらタイマーを止めます。

次に描画の処理を示します。画像が完全に復元されるまで分割された画像の間に境界線を描画します。それ以外はBitmapPart.IsShowがtrueの画像はすべて描画します。

プログラムが開始されたらタイマーをセットしてShowBitmapPartsメソッドとRestoreBitmapPartsメソッドが一定間隔おきに呼び出されるようにします。

最初はBitmapPartsメソッドを呼び出し、BitmapPart.IsShowがfalseのものがなくなったらRestoreBitmapPartsメソッドを呼び出します。 そして完全に復元されたらタイマーを止めます。