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

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

ナンプレの基本インターフェイスを前回構築したんですが、やはり自動回答と自動問題作成機能を作らないとチャンとしたゲームとは言えないでしょう。
そこで、今回は問題を自動で回答する、機能に挑戦してみました。
最初に行っておきますが、ナンプレには、レベルがあって、初級、中級、上級とあり、今回は初級問題にのみ対応できるプログラムになっています。

前回のおさらい

http://wordpress.ideacompo.com/?p=7489
前回は、ナンプレの基本表示部分と、入力処理、回答を入力した後の正解チェック機能を作ってます。
基本的にjavascriptだけで動作する事を目的にしてますが、問題読み込み機能でajaxを使っているので、ファイル表示では動作しないので、読み込み機能を使うときは仮想環境か、サーバーに配置して使ってください。

今回の機能概要

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

1. 空欄の箇所に入る可能性のある数値を仮登録
2. 縦、横、3×3の箱でのユニーク値チェック
3. チェックを複数回繰り返す反復処理

ソースコード

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

解説

index.htmlに解凍ボタンを付け加えています。その影響でJS側でボタンを押したイベントを追加してますが、大した処理でないので、ここは解説カットします。
numberplace.jsの中の”$$.solve”という関数が今回のポイントですが、少し大きなプログラムになってしまったので、大まかなフローは下記のとおりです。

1. 解凍ボタンを押した時に処理を実行
2. 空欄に対して1~9の数字を仮登録
3. 仮登録した数字の縦、横、3×3の箱、の部分に重複のある数値を仮登録の数値から除外する
4. 縦、横、3×3箱の中で重複する数値の内値を拾って確定数値にする(この時点では仮登録するだけ)
5. 仮登録されている数値のうち、1つしかないものを確定数値として、反映させる。(この時仮登録は削除する)
6. 完了していない場合、3番に戻ってさらに処理をすすめる。

この手順で、初級レベルの解凍はできます。
もちろん、すこしレベルの高い問題になると、空欄を残してプログラムが終了してしまうので、この点は次回以降に対応する予定なので、認識しておいてください。

ポイント

解説の4番について、すこし分かりにくいので、図を用意しておきました。
分かりにくいですが、どうしてもわからない場合は、メールかコメントください。
別途解説したいと思います。

サンプル問題

%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-11-13-27-15

横列を例にします

%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-11-13-29-45

入れられる数値を全て書き出す

%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-11-13-38-01

1が一つしかないので確定

%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-11-13-39-56

これを繰り返す

上記の様な処理を繰り返し行うことで、初級レベルは空欄がどんどん埋まっていきます。

上級レベルに対しての課題

これでも解答できない問題は、もう少し別の判定を行わないといけません。
少し書いておくと、3×3マスの縦と横を1つのユニーク値として、他のブロックに対して優先順位を付けていき、不要判定を行なって、仮登録値を削除していくことで、確定数字を割り出すという内容です。
数独好きの人は、次回をお楽しみに・・・

Leave a Reply

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