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

今回は「ナンバープレイス・プログラム」の第5回目になります。


前回までで、矛盾のない正解表(81マス)を実用的な確率で生成できるようになりました。

今回はそれをさらに発展させ、正解チェックを自動化して、成功した場合のみ表示されるように改善します。


🔧 設計

正解かどうかを判定するには、各行・各列・各3×3ブロックに含まれる数字が、すべて1〜9のユニークな値であること
チェックする必要があります。


HTMLでは、各マスに設定したclass属性(行: .r0〜.r8、列: .c0〜.c8、ブロック: .b00〜.b22)を使って、
9個ずつマスを簡単に取得できます。

取得した配列を昇順に並び替えて [1,2,3,4,5,6,7,8,9] と一致するかどうかでチェックします。



この判定をすべて通過するまで、盤面の生成処理をwhileループで繰り返すことで、確実に正しい盤面を表示できるようにします。



🔍 チェック関数の抜粋

以下は、ある行・列・ブロックに含まれるマスの値が 1〜9 のユニークな数字で構成されているかを確認する関数です。




🔁 メインループのロジック

  • init() … 表を初期化(空のマス作成)
  • putNumber() … 数字を配置
  • checkComplete() … 1~9 が揃っているかチェック

もし正しくなければ、表を .remove() で削除して最初からやり直します。

このループにより、成功した盤面だけが表示されるようになります。



💻 プログラム全体

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



✅ 実行結果と所感


このプログラムを実行すると…




 体感としては、数秒以内に正しい盤面が生成されます。
表示もスムーズで、ユーザー側の待機時間によるストレスもほとんどありません。



✅ 今回のまとめ


今回のプログラムでは、完成したナンプレの盤面が正しいかどうかを複数回チェックし、問題がなければ表示する仕組みを作りました。


実際に動かしてみると、成功した盤面は体感的にすぐに表示されるため、スムーズに動作します。
これでパズルの正解部分はできたので、次は空欄を上手く作って遊べるパズルにしていく予定です。



🔜 次回予告

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


完成した正解表から数字を抜いて、実際に遊べる「パズル問題」を自動生成する仕組みを作っていきます。

「解ける問題になっているか?」を自動で判定するロジックや、空欄の作り方の工夫など、プログラムとしての面白さが
より深まるフェーズです。


シリーズの集大成として、ナンプレ生成の仕組みを仕上げていきますので、ぜひお楽しみに!




それではまた次回👋
最後までお読みいただき、ありがとうございました!