イラストロジック(お絵かきロジック)の問題作成はまずは答えありで進めます。
脳トレ京の場合は漢字をPNG画像にすることからはじめます。サイズは15×15、20×20、25×25、30×30の4種類です。
php上でフリーフォントを使って漢字をリアルタイムで描画して画像にするのですがアンチエイリアスがかかってグレーの部分も多く発生するためなかなかうまくいきません。
問題を作ってみてちゃんと読める漢字もあるのですが、漢字は横の線が細くデザインされているので横の線が完全に消えてしまう場合もありさすがに問題として使えません。
フリーフォントでビットマップのデザインのものがありそれを使って見ましたがこちらもうまくいきません。ビットの位置がずれるのか基本アンチエイリアスがかかりグレー部分がかなり出ます。
Illustratorで15×15、20×20、25×25、30×30のドキュメントを作成して描画[文字パネル]で文字の描画設定のアンチエイリアスをなしにします。するとビットマップに表示されるようになりました。
漢字のリストはあるのでそれをプログラムでドキュメントに表示させPNG保存をして3000文字ぐらいの漢字のビットマップ画像を作成しています。
漢字というのは大きさが違っていて20×20だからといって、全て埋まるわけではなく国とか口のような漢字は周りがかなり余ってしまいます。
それを画像を開いて修正して行けばよいのですが、なかなかそこまで手が回らないのが現状です。3000文字ですからね・・・
答えの画像ができたらそれを読み込んで黒の連続を数えて問題を作って行きます。画像さえできればこちらはそれほど難しくありません。
漢字でなくても画像でもモノクロのものを用意すればできるので、アイコンとか写真とかを問題にするのもありかと思います。
ここからが問題です。イラストロジック(お絵かきロジック)が問題として成り立つためには問題としてちゃんと解けないといけません。
せっかく問題を作成してもそもそも解けい問題だったら使えません。問題を一旦解くという作業が必要になります。
問題回答はかなり大変です。いろいろなサイトを調べたりしましたがなかなか見つからず、wikiの掲載されている解法をプログラムで再現して行きます。
10×10なら100の配列を作りすべてに解いていないという[-1]を入れます。
次に行・列と答えが1つしか入っていない場合しかも10または0の場合配列を0埋め・1埋めします。
10マスで7,2とか3,2,3の場合は
7,2と空白1で10ぴったり
3,2,3と空白2で10ぴったりというようになりますので
これも答えが決まります。ここもあらかじめ埋めておくことができます。
こちらもwikiに載っているイラストロジックの考え方ですが例えば10マスで8の場合は
■■■■■■■■□□
□■■■■■■■■□
□□■■■■■■■■
の三通りが考えられそのなかの共通部分はどの回答になっても共通なので■が確定します。
□□■■■■■■□□←共通部分
第1段階は最初の塗りつぶしでいわばざっと埋めた状態の基本段階です。この時点でまず基本が完成したのでここからいよいよ問題回答プログラムの本番部分となります。
第1段階でもし端に黒が入った場合はそこから条件の数だけ埋めていくことができます。また2マス目にあったとしても条件が3なら3マス目も塗ることができます。
決まってくると今度は絶対に入ることができない×の部分もできてきます。たとえば条件が3で左から■■■と埋まるとその横は必ず×になります。これも設定していきます。
ちょっと難しいのですが1,2,3なら下の10のパターンがあります。
■□■■□■■■□□
■□■■□□■■■□
■□■■□□□■■■
■□□■■□■■■□
■□□■■□□■■■
■□□□■■□■■■
□■□■■□■■■□
□■□■■□□■■■
□■□□■■□■■■
□□■□■■□■■■
どのパターンでも右から3つめは■です。こんな感じで全パターン作成して、すでに埋まっている部分と比べながらパターンの候補を減らしていくことで最終的に問題が解けます。
例えば下記のような問題の一部分があったとして
11
1
1
この問題は欠陥があって
11
1□■
1■□
でも
11
1■□
1□■
でもOKになってしまいます。重解というものです。
これではイラストロジックになりません。そこで脳トレ京ではあらかじめ回答を入れておくことで問題として成立させることができるようにしました。
この例でいくと下のように1箇所だけ■を入れておくと他のすべてが確定します。
11
1■
1
そんな感じでどうしても解けない問題はあらかじめ回答を入れておくことですべての問題をイラストロジックとして成り立たせることができています。