[Game] Javascriptでナンプレ、自動解答機能 レベル2

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

前回までナンプレの操作UIと低レベル自動解凍機能を搭載したが、少し何回な問題を解けなかったので、非常にストレスの残るシステムとなってしまった。
今回は、かなり複雑になったが、少しレベルの高い問題をクリアできるように機能追加を行なってみた。
今のところ手元にある問題はこれでFinishしているので、解けない問題が現れたらさらなるレベルアップを行うとしよう。

前回のおさらい

http://wordpress.ideacompo.com/?p=7489
http://wordpress.ideacompo.com/?p=7529

第1回はナンプレのゲーム操作UIの構築
第2回はナンプレの自動解凍機能を付けたのだが、低レベルな解答しかできなかった。

今回の機能概要

「中級の自動回答機能」として、以下の処理を実現してます。

1. 縦、横、3×3の箱で比較してみて、有り得ない数値を除外

有り得ないというのを人間の頭で考えるとすぐにわかるのが、いかに計算で出せるかがポイントとなった。

ソースコード

今回の変更点は「numberplace.js」のみだけですが、とりあえず全てのソースコードを載せておきます。

※CSSファイルは前回と同じです

※JSライブラリも前回と同じ・・・

※今回の変更点はこのJSファイルのみです。

※12番の問題を追加したのだが、初級レベルで解答できてしまった・・・

解説

今回は前回の処理$$.solve.check()関数に加えて$$.solve.check2()というのを追加している。
そして、これに付随する関数を山ほど追加しているので、ソースコードから解析するのはなかなか時間がかかると思う。
とりあえず、コードに沿って解説します。
まず概要は以下の通り、ちなみに、6番までは前回と同じで7番からが今回追加した処理。

1. 解凍ボタンを押した時に処理を実行
2. 空欄に対して1~9の数字を仮登録
3. 仮登録した数字の縦、横、3×3の箱、の部分に重複のある数値を仮登録の数値から除外する
4. 縦、横、3×3箱の中で重複する数値の内値を拾って確定数値にする(この時点では仮登録するだけ)
5. 仮登録されている数値のうち、1つしかないものを確定数値として、反映させる。(この時仮登録は削除する)
6. 完了していない場合、3番に戻ってさらに処理をすすめる。※変更点が無くなったら7番に進む
7. 縦よ横の列を3つを1つのブロックとして、単一ブロック以外に値が無い場合に確定ブロックとして、値とセットのデータを作成(※配列「row」と「col」)
8. 確定ブロックを箱単位で縦、横毎に、同じ行と列に同一文字がある場合は、仮登録の値から除外する。
9. この場合変更点が0になるまで7番に戻って繰り返す

8番のBOX毎のユニーク値判定が2段階あり、非常に複雑になっていますが、とりあえず現時点でうまく行っているので、このままGOします。
※おそらくもう一段階レベルアップする時はリファクタリングすると思います。

ポイント

解説の8番について、図解しておきます。

ブロック数値確定サンプル

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-18-18-54-44

次への課題

現時点である程度の難易度レベルの自動解答ができたんですが、ランダムに問題を作成できる機能が作れると、無限にナンプレを楽しめるツールが作成できます。
しかも、難易度の指定もできる問題作成機能があれば、かなり便利だと思いませんか?
毎日ナンプレにTRYして、朝の通勤時などに、脳みそを解すことができそうです。

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です