こんにちは!
エルフィールドでエンジニアとして働いている、H.Tと申します。

今回はナンプレプログラムの第6回、いよいよ完結編です!


前回までで、正しく完成された盤面(答えの状態)を自動で生成できるようになりました。

いよいよ今回は、「実際に遊べるナンプレ問題」に仕上げていきます。


🔧 設計

今回の処理の流れは以下の通りです:

  1. 前回までの方法で、数字がすべて入った盤面(正解表)を作成
  2. ランダムにマスを選んで空白にする
  3. フラグを初期化し、数字が入っているマスからフラグを立て直す
  4. 解けるかどうかをチェック
  5. 解けたら空白マスだけを戻して「問題」とする。解けなければ②に戻る

この処理を繰り返し実行し、成功した問題だけが表示されるようにします。



🎨 文字色の設定

パズルが解けたときに、空白に入れた数字が見分けられるように、赤文字で表示したいと思います。

CSSに以下のスタイルを追加します:




🔲 空欄の作成

空白を1つ作る関数は以下のようになります:



「i」と「j」を0〜8からランダムに選び、class指定でマスを選択しています。
選ばれたマスの中身が空でなければ削除し、フラグをリセットします。

空白マスの数は60回ランダムに選びます。重複もあるため、実際の空白マス数は60個以下になります。



🧠 パズルを解く

コードは以下のようになっています。

すべてのフラグを初期化し、数字が入っているマスからフラグを立て直します。

その後、空欄に数字を入れていきます。

最後にcheckComplete()関数で正しく解けているかをチェックします。



🧪 ボタンで解く!


以下のように、ボタンを作成してsolveNP()関数を呼び出します。





ボタンを押したらsolveNP()が実行されます。これがJavascriptらしい使い方ですね。
空白を作って解いてみると、解けない場合もありますが、解けた場合は以下のように表示されます。




解けた場合、赤文字にすれば「このマスは後から埋めた」ことが分かりますが……

ここを赤文字ではなく白文字にすれば、見えない=空欄のまま見える状態になりますよね。

そして「解く!」ボタンを押したときに白文字から赤文字にすればいいのでは?


そのため、少しだけ改修します。



🎨 色の切り替えを実装する


・空欄作成関数removeNumの中でも、色指定を白に変更します:


・ボタンを押したときに色を変える関数を作成:



🔁 メイン処理のロジック


この処理により、

  • ランダムに空欄を作成
  • 解けるかをチェック
  • 解けなければやり直し

という流れを繰り返す仕組みになります。


💻 プログラム全体



✅ 実行結果と所感

この方式で実行すると、以下のようになります。




  • 最初は空白マス(白文字)で「問題」として表示される
  • 「解く!」ボタンを押すと、白文字だったマスが赤に変化し、解答が表示される
  • 赤文字の数字は「後から自動で埋められたマス」であることが一目でわかる

試してみると、シンプルなロジック(可能性が1つのマスから順に埋める)でも、十分に解ける問題が自動で生成されました。



🧩 プログラミングで一番大事なこと

考えるだけではなく、「とりあえず作って試してみること」

失敗しても、試行錯誤を繰り返すことで、少しずつ形が見えてきます。

このナンプレも、思いつきを形にして、修正して、また作り直して…
 

そうするうちに、「ちょうど良いシステム」にまとまりました。



🏁 最後に

これまで全6回にわたって、ナンプレの自動生成と解答チェック、そして問題生成までを作ってきました。

最終的に、自動的に問題を作って、解くツールとして動作するプログラムが完成しました。

  • 自動で正解表を作る
  • ランダムに空欄を作る
  • 解けるかどうか自動判定する
  • 白→赤の仕組みで問題として成立させる

ナンプレを題材にしたこのプログラム制作を通じて、JavaScriptでのロジック設計やUI操作の勉強にもなりました。



✨ ありがとうございました!

これでナンプレ編は終了です!

最初は「表を作るだけ」だったところから、問題として遊べるところまで到達できました。

ここまで読んでいただき、本当にありがとうございました!

それではまた別のテーマでお会いしましょう!👋


🔚(完)