Numberplace

Numberplace(数独)ゲームプログラムです。
前田稔の超初心者のプログラム入門


Numberplace ゲームを提供します

  1. 難解レベルの問題も解けるプログラムを ダウンロードのページ から提供します。
    zip で圧縮されたファイルをダウンロードして解凍して下さい。
    Numberplace のフォルダーを作成して、全てのファイルを格納して下さい。
    このファイルと Number.exe と数枚の画像ファイルと数枚の *.num データが格納されています。
    データファイルは レッツ!ナンプレ に掲載されていたものです。
  2. C:\BIN\Number\Number.exe では画像ファイルを次のフォルダーから入力します。
    画像ファイルを指定のフォルダーに格納して下さい。
    (CSForm.cs ではカレントフォルダーから入力するバージョンもあります)
        m_back = new IMAGE(@"c:\data\test\back.gif");
        m_number = new IMAGE(@"c:\data\test\number.gif");
        m_num = new Card(@"c:\data\test\num.gif",60,60);
        m_mini = new Card(@"c:\data\test\mini.gif",30,30);
        m_color = new Card(@"c:\data\test\color.gif",60,60);
    
  3. ナンプレ(数独)は、9×9の81マスのプレートがあり、プレートは更に3×3の9マスの小プレートに分かれています。
    全ての縦・横・小プレートに1~9が一つずつ入るように、数字を入力するゲームです。
    Numberplace(数独)の基本配置は、ページ先頭の画像を参照して下さい。
    全ての行・列及び、9個の小プレートに1~9の数字が格納されています。
    Numberplace の問題は新聞や雑誌やネットに沢山掲載されています。
    Editor(メモ帳)などを使って簡単に問題ファイルを作成することが出来ます。
  4. Number.exe をダブルクリックで起動するとゲームが始まります。
    ゲームが始まると初心者レベルの盤面が表示されます。
    画面下部の1~9の数字を選択して、盤面をクリックすると数字が置かれます。
    数字が置かれているときにクリックすると削除されます。
    初心者レベルの問題を解いてみて下さい。

好み(レベル)に合わせてプレイします

    実力でゲームを解く
    1. プログラムに頼らずに正々堂々と実力でゲームを解く方法です。
      Number.exe をダブルクリックなどで起動して下さい。
      起動すると初心者レベルの問題が表示されます。
      全ての行・列及び、3×3=9個の小プレートに1~9の数字が入るように数字を配置します。
    2. 次の問題を解いてみましょう。
      左上の小プレートは、1と7が抜けています。
      そこで二個の空のマスに右クリックで1と7をマークします。

    3. 一行目に注目すると、既に1が配置されていて、1-3は 7 に決定です。
      従って、3-2は1に決定です。
    4. 次に9列に注目すると 1 5 6 が抜けています。
      3行目には既に6と1があるので3-9は 5 に決定です。
      これを繰り返して実力でゲームを解いて下さい。
    5. Tool/ErrCheck でエラーをチェックしながら進めて下さい。
      完成したと思ったら NewGame/Complete で完成を確かめます。
      失敗したときは Tool/ErrCheck でエラーのマスを確認して下さい。
      Tool/ErrCheck を実行するとヒントや色がリセットされます。
      NewGame/Init で出題図に戻ります。
    6. どうしても正解が見つからないときは Tool/Anser を選択すると正解が表示されます。
      Tool/Anser で正解が表示されるのは Level-1 Level-2 Level-3 で自動生成したときだけです。
      次の問題を選ぶときは NewGame から Level-1 or Level-2 or Level-3 を実行して下さい。
      ゲームの終了は File/Exit を実行します。
    7. 新聞や雑誌やネットに掲載されている問題を作成(タイプ)するのも簡単です。
      今解いている問題を File/Save から w.dot で保存して下さい。
      保存した問題は次のようになっています。
      数字が問題図に表示されている数字で . が空欄です。
      94.1..2..
      285.6.1.3
      6.37..9..
      .6.27.534
      ..465.7.8
      7.98.36..
      5......19
      ...31.857
      ..1.9...2
      
    8. このフォーマットに合わせて UTF-8 でタイプすれば幾らでも問題を作成することが出来ます。
      作成した問題を実行するときは File/Load から入力して下さい。

    プログラムで候補の数字を探す
    1. 全ての行・列や9個の小プレートで抜けている数字を探し出すのは結構面倒です。
      そこで数字の候補をプログラムで探してみましょう。
      Tool/Hint を実行すると足りない数字が小さく表示されます。

    2. マスの中に数字が1個しかないときは、その数字に確定です。
      数字を確定して Tool/Hint を実行すると更新された局面のヒントが表示されます。
    3. もう少し工夫したツールを使ってみます。
      Hint/SetHint を実行して下さい。
      マスの数字が1個で確定できるときは赤で、複数個でも確定可能な数字が緑で表示されます。
      このツールを使えば、赤と緑のマスに数字を設定するだけでパズルを解くことができます。
    4. さらに Hint/RunHint を使えば赤のヒントを自動的に設定してくれます。
      Hint/SetHint と Hint/RunHint を繰り返すだけでパズルの解析が進みます。
    5. Hint/RunHint は赤のヒントしか設定してくれませんが、Hint/Think は確定出来る全ての数字を設定します。
      Hint/SetHint の実行は省略可能で Hint/Think を繰り返すだけで初級のパズルは完成します。
    6. Level-1 Level-2 Level-3 で自動生成した問題では、複数の解が存在することがあります。

      そのときは、例えば 1 8 のマスの片方を1に確定して Hint/Think を実行して下さい。
      問題によって、同様の操作を繰り返すとパズルが完成します。
      ここまでの操作で問題が解けるのは初級問題で、ここからが本番です。

    Hint を編集する
    1. プログラムに任せないで、自分でヒントを編集しながら問題を解きます。
      「対の検索」で見つけたヒントなどは自分で編集する必要があります。
    2. Hint/SetHint は、現在のヒント(小さな数字)をリセットして最初からヒントを求めます。
      それに対して Hint/PreHint は、現在のヒントを引き継いでヒントを求めます。
      もし局面とヒントが合致しないと誤った情報が表示されます。
      また Hint/All も現在表示されているヒントが正しいことが前提です。
      Hint/Thinking もプレイヤーが設定したヒントを継承して問題を解きます。
    3. Hint の編集は、ヒント(小さな数字)を右クリックして下さい。
      数字が確定するとヒントも変わるので Hint を更新しながら Hint/PreHint Hint/All などを使って問題を解いて下さい。
    4. ヒントが壊れたら Hint/SetHint などを実行すると正しいヒントが設定されます。
      ヒントが初期化されるのは次のメニューで、他のメニューはヒントを継承します。
      Hint
      SetHint
      RunHint
      Think
      
    5. 作業中にマーク(記憶)しておきたいマスが生じることがあります。
      Tool/ColorON を選択してマスを左クリックするとマスの色が次々と3回変わります。
      Tool/ColorOFF を実行すると元のモードに戻ります。
    6. 現在の局面を残しておいて、もう少し進めたい場合があります。
      TestMode/Chenge を選ぶと「通常モード⇔テストモード」に切り替えます。
      テストモードに切り替えて局面が壊れても TestMode/Chenge を選ぶと元の局面に戻ります。

    HintOne, All を使う
    1. 次の問題を作成(タイプ)して起動して下さい。
      空欄は . または 0 でタイプします。
      100002000
      009087000
      000300200
      400063000
      508700090
      000000000
      203009085
      016000700
      090000040
      
      Hint/Think を繰り返すと次の局面で進展しなくなります。
      Hint/SetHint や Hint/RunHint を実行しても効果がありません。

    2. グループ内で対を検索して削除出来るヒントを調べます。
      • 6行目で36を置けるのは 6-2,6-8 だけで対になる。
      • 6-2.3 なら 6-8.6 で、6-8 の 1 2 が消える。
      • 6-8 の 1 2 が消えると、8列の 2-8.1 と8-8.2 が確定する。
    3. Hint/HintOne を実行すると「行,列,3*3行,3*3列」を順に繰り返して対を検出します。
      対が見つかると確定出来るヒント(1 2 の数字)が緑色で表示されます。
      そのマスに1と2を確定して Hint/Think でパズルが完成します。
    4. Hint/All を実行すると「行・列・3*3」を一度に実行して対を検出します。
      対が見つかると確定出来るヒントが赤または緑で表示されます。
      赤の数字のマスを確定して Hint/Think でパズルが完成します。
      緑や赤の数字が表示されないときは、確定できるマスが見つからなかったときです。

    チェーンを調べる
    1. ここからは上級問題に挑戦です。
      次の問題(N08.num)を作成して起動して下さい。
      9...3....
      ....4.3..
      5.781..4.
      ......8..
      7..4..13.
      .......5.
      .14..67..
      .6..57...
      .......8.
      
      Hint/Think を繰り返すと進展しなくなる局面が現れます。
    2. 9-5 に設定されている数字の候補(緑) 2,9 から 9 を消すことが出来ることをチェーンを使って調べます。
      現在の局面を壊さないように TestMode/Chenge でテストモードに切り替えます。
      TestMode/Terget から 9-5 のマスを選択するとマスの色が変わります。
      Terget はチェーンを調べるために、ターゲットのマスを設定するメニューです。
    3. 9-5 から連鎖する9に関連するグループのマスは次の通りです。
      5-5, 6-5, 9-4, 9-7, 9-9, 7-4
      この中から最も有力なマス(ピンク)は 5-5 と 9-7 です。

    4. 9-7 から右クリックで9を消し、TestMode/Chain を実行すると 9-5 の 9 が消えます。
      9 が消えて 2 だけになると、9のチェーンが成立します。
      TestMode/Chain の実行結果として空のマス(数字の候補が無い)やグループ内で同じ数字が設定されたときは破綻です。
      Chain は数字の論理的な関連や複数解答を調べるときに利用します。
    5. チェーンが成立すると TestMode/Chenge で元の画面に戻ります。
      9-5 から9を消し、2が確定します。
      2の確定により 9-1の3 7-1の2 4-5の7 が確定します。
    6. ここまでくれば Hint/Think でパズルが完成します。
      この手順中 9-7 から9を消すと 9-5 から9が消えるのがミソですが、次のように連鎖されます。
      • 9-7 の9が消えると 6-7 の9確定する。(7列で9はここだけ)
      • 6-7 の9が確定すると 5-9 の2が確定する。(29 から9が消えた)
      • 5-9 の2が確定すると 5-5 の9が確定する。(5行で9はここだけ)
      • 5-5 の9が確定すると 9-5 の9が消える。
      このパズルの最大の難関は、このような連鎖を見つけ出すことにあります。

    Search を使う
    1. プレイヤーが数字の連鎖(チェーン)を探し出すのは、非常に面倒です。
      そこでチェーンを検索してくれる TestMode/Search をサポートします。
      先の問題(N08.num)を起動して進展が無くなるまで Hint/Think を繰り返します。
    2. TestMode/Search を実行すると「チェーンが成立」が表示されて、マス(1-8)の1が赤で表示されます。
      ヒントが赤の数字は、これを消すことが出来ることを意味します。
      赤の1を右クリックして消して下さい。
    3. 1が消えると、マス(1-8)の7とマス(1-4)の6とマス(2-4)の7が確定します。
      (どこかのマスが確定するまで TestMode/Search で赤の数字を消し続けて下さい)
      数字の確定に従って、ヒントを整理します。
      ヒントの消し忘れなどがあると、誤った結果になる場合があります。
      • 1行から6と7を消します。
      • 8列と右上のグループから7のヒントを消します。
      • 4列と上中のグループから6と7のヒントを消します。
    4. 続いて Search メニューを実行するとマス(5-9)9が赤で表示されます。
      赤の9を右クリックして消して下さい。
    5. マス(5-9)の2とマス(5-3)の6とマス(5-5)9が確定します。
    6. マスが大分埋まったので RunHint メニューを実行するとゲームが完成します。
      難問では、Search メニューを繰り返して徐々にマスを埋めて下さい。
      N09.num や N10.num を解いてみて下さい。
      難問なので Search メニューを繰り返し使います。
      超難問を除いてナンプレの問題を解けるようになりました。

    SearchN を使う
    1. TestMode/Search を使って一個ずつチェーンを探すのが面倒になりました。
      そこで複数回まとめてチェーンを検索してくれる TestMode/SearchN をサポートします。
      N09.num を起動して進展が無くなるまで Hint/Think を繰り返します。
      .5....9.8
      41.......
      ...54...2
      ..4..862.
      8.......1
      9........
      .9..5..86
      2.13.6...
      ....1...9
      
    2. 数字の9を右クリックして、繰り返し回数を設定します。
      TestMode/SearchN を実行すると9回のチェーンが実行されて、消去可能な数字が消されます。
      1-5 には 6 が、5-2 には 2 が一個残っています。
      この二つを確定して進展が無くなるまで Hint/Think を繰り返します。
      (確定しないときは、数字の9の右クリックと TestMode/SearchN を繰り返して下さい)
    3. 数字の9を右クリックして、繰り返し回数を設定します。
      TestMode/SearchN を実行すると9回のチェーンが実行されて、消去可能な数字が消されます。
      6-9 には 3 が、8-7 には 7 が一個残っています。
      この二つを確定して Hint/Think を実行するとパズルが完成します。

    DelHint を使う
    1. Version 3.3 から TestMode に DelHint メニューを追加します。
      メニューを実行するとヒントに表示された数字から[破綻するヒント]を削除してくれます。
      これは「TestMode メニュー/Chenge/Play」の応用です。
      このメニューは「思ったより強力」で SearchN メニューをしのぐ威力を発揮します。
      難問レベルの問題は DelHint メニュー一発で解けるようです。
    2. N09.num を起動して進展が無くなるまで Hint/Think を繰り返します。
      ヒント(小さな数字)が表示されていることを確認して下さい。
    3. TestMode/DelHint を実行するとヒントから破綻する小さな数字を削除してくれます。
      今回は一個残ったマスが20個ぐらいあります。
      それらのマスの数字を確定して Hint/Think を実行するとパズルが完成します。

    超難問に挑戦
    1. 世界一難しい数独 に挑戦します。
      過去の「世界一難しい数独」
      ..53.....
      8......2.
      .7..1.5..
      4....53..
      .1..7...6
      ..32...8.
      .6.5....9
      ..4....3.
      .....97..
      
      今回作成された「世界一難しい数独」
      8........
      ..36.....
      .7..9.2..
      .5...7...
      ....457..
      ...1...3.
      ..1....68
      ..85...1.
      .9....4..
      
    2. SearchN と DelHint の強力なメニューが揃ったので「世界一難しい数独」に挑戦します。
      「世界一難しい数独」と言われるだけあって、DelHint では目立った進展はありませんでした。
      そこでヒントを整理した後で「二択のヒント」に注目します。
      二択のどちらかが正解で50%の確率だからです。
      二択のマスを二個(最終的には三個)組み合わせて、破綻するか調べます。
      二個の組み合わせでは正しいか否かが判定できませんでした。
      次に三個組み合わせて調べてみました。
      2*2*2=8 で1/8の確率で正解があるはずです。
      三個組み合わせると破綻するケースが見つかり、初期の盤面では機能しなかった SearchN も使えるようになりました。
      8通りを順に SearchN と DelHint と Think を組み合わせて正解が得られました。
    3. DelHint と言う強力な関数が出来たので、これを Super に組み込みます。
      今まで解けなかったほとんどの問題を Super メニュー一発で解くことが出来るようになりました。
      Super メニューは再帰関数を使っているのですが「世界一難しい数独」も一発で解くことが出来ました。

メニューの説明

  1. File メニューです。
    親メニュー 子メニュー 説明
    File(&F)
    Save(&S) 数字テーブルを保存する
    Load(&L) 数字テーブルとヒントを入力する
    SaveAll(&A) 数字テーブルとヒントを保存する
    Exit(&X) プログラムを終了する
  2. 問題の作成は NewGame メニューで行います。
    親メニュー 子メニュー 説明
    NewGame(&G)
    Lebel-1(&A) 初心者レベルの問題です
    Lebel-2(&B) 初級者レベルの問題です
    Lebel-3(&C) 中級者レベルの問題です
    Init(&R) リセットして出題図に戻す
    Complete(&Q)回答が正しいことを確認する
    このメニューで作成された問題は、解答が複数存在する場合があります。
    Hintメニュー/Think(&T) を実行して、解けなければ複数解答が存在する可能性があります。
  3. Tool メニューです。
    親メニュー 子メニュー 説明
    Tool(&T)
    ErrCheck(&C) 現在の局面のエラーをチェックする
    Hint(&H) マスに入る数字候補(ヒント)を表示する
    ColorON(&E) カラーモードに設定する
    ColorOFF(&O) カラーモードを解除する
    Anser(&P) 自動生成モードの解答を表示する
  4. Hint メニューです。
    親メニュー 子メニュー 説明
    Hint(&P)
    SteHint(&S) 可能性のある数字(ヒント)をカラー表示する
    PreHint(&C) 現ヒントを引き継いで数字候補(ヒント)を表示する
    HintOne(&O) グループ毎(行・列・3*3行・3*3列)の順に対を解析する
    HintAll(&A) グループ(行・列・3*3行・3*3列)を一度に対を解析する
    RunHint(&R) 候補が一個の数字(赤色)を確定する
    Think(&T) 数字候補を解析して確定する
    Thinking(&X)現ヒントを引き継いで解析する
  5. TestMode メニューです。
    親メニュー 子メニュー 説明
    TestMode(&T)
    Chenge(&C) 通常モード⇔テストモードに切り替える
    Play(&P) 現在の設定モードで問題を解く
    Terget(&G) チェーンを調べるために、ターゲットを設定する
    Chain(&H) 数字の連鎖(チェーン)を調べる
    DelHint(&D)破綻するヒントを削除する
    Search(&S) 数字の連鎖(チェーン)を探し出す
    SearchN(&N)Search を連続して実行する
  6. Help メニューです。
    親メニュー 子メニュー 説明
    Help(&H)
    Version(&V) バージョン情報を確認する
    Super(&S) 再帰関数を使って問題を解く
  1. Chenge
    通常モード⇔テストモードを切り替えます。
    現在の局面が破壊されないように、テストモードに切り替えて作業します。
    通常モードに切り替えると、以前の状態に戻ります。
  2. Play
    現在のモード(通常モード/テストモード)で問題を解きます。
    メッセージを除いて、実質的に Think と同等です。
  3. Terget
    チェーンを調べるために、ターゲットのマスを設定します。
    Chain で実行するとターゲットのマスが変更されたタイミング(ヒントの削除など)で画面を表示します。
    数字の論理的な関連や複数解答を調べるときに利用します。
  4. Chain
    プレイヤーが設定した局面とヒントを継承して解析します。
    数字の連鎖(チェーン)を確かめるために使用します。
    実行の結果として空のマス(数字の候補が無い)やグループ内で同じ数字が設定されたときは破綻です。
  5. Search
    Version 3.1 では消去可能なヒントを検索するメニューを提供します。
    Search では Chenge と同様にテストモードを使うので、通常モードで起動して下さい。
    解答が複数存在する場合「チェーンがみつかりません」が表示されます。
  6. SearchN
    Search メニューを繰り返し操作するのは面倒なので、回数を設定して繰り返します。
    回数の設定は、画面下部の数字をマウスで左クリックして下さい。
    マスに設定する数字と共通で、一度に最大9回まで繰り返すことが出来ます。

[Next Chapter ↓] ナンプレ・ガイド

超初心者のプログラム入門(C# Frame Work)