$ \DeclareMathOperator{\arccosh}{arccosh} \DeclareMathOperator{\arcsinh}{arcsinh} \DeclareMathOperator{\rank}{rank} \DeclareMathOperator{\rot}{rot} \DeclareMathOperator{\grad}{grad} \DeclareMathOperator{\diver}{div} $

Hakyu Generator

Hakyu Generatorのメイン画面
パズルゲーム「波及効果」の盤面を自動生成するプログラムです。
Java Applet版 も用意しました。 うまく動かない人はオフライン版を使ってくださいね。

1はじめに

パズルゲーム「波及効果」の自動生成プログラムです。 波及効果を知らない人はニコリから出ている本でも買ってやってみるといいと思います。

2動作環境

本ソフトウェアはJavaで書かれています。 したがって実行にはJava VMが必要です。 Sun Microsystemsダウンロードページ などから ダウンロード・インストールしてください。 インストール方法は同社のwebページ上で確認してください。

3ダウンロード

上のリンクからダウンロードしてください。

4使い方

Hakyu Generatorのメイン画面
本プログラムは主にマウスを使って操作します。 以下に本プログラムの操作法を概説します。 概説の割に長いですが。

4.1盤面の操作法

ウィンドウの右側のマス目がたくさん表示されている部分を盤面と呼びます。
盤面上のセルを左クリックすると数字がインクリメントされます。 同様に右クリックするとデクリメントされます。
ただしStatusがsolvingの時は簡単なチェックを行い、 明らかに入らないものは飛ばして表示するようになっています。
またセルに表示されている数字より大きい数字を入れることができない場合に左クリックをした場合や、 セルに表示されている数字未満の数字を入れることができない場合に右クリックをした場合には 空欄にします。
Statusがsetの時にはセルの境界をクリックすることで壁の挿入・削除ができます。

4.2Statusについて

左側の"Status"の部分に表示されているものはそれぞれ以下の意味です。
setユーザエントリィ状態です。 右の盤面の空白をクリックして数字を入れたり、 壁の部分をクリックして壁の挿入・削除をしてください。
solving解答中です。右の盤面をクリックして数字を入れていってください。
solved解答が終了した状態です。Solveボタンでコンピュータに解かせた場合もこの状態になります。

4.3左のボタン

4.3.1Clear

盤面をクリアします。 これは全ての数字と壁を削除します。 ゲームの途中ではじめからやり直したい場合にはRetryボタンを押してください。

4.3.2Start

ゲームを始めます。 Statusがsetの時にヒントとなる数字や壁を全て入力し終わったらこのボタンを押してください。

4.3.3Retry

ゲームをはじめからやり直します。

4.3.4Solve

ゲームを始めたときの状態をsolverに与えて解かせます。 解かせた時の出力は以下の3通りです。
  • Solved successfully
  • Invalid problem
  • Cannot be solved

4.3.5Generate

自動生成の詳細設定画面を起動します。 詳細設定画面の説明は自動生成の説明を参照してください。

4.4自動生成

自動生成の詳細設定画面の説明です。
なお、"Modal of room size"と"Variance of room size"の設定値によって生成時間がだいぶ変わるようです。色々いじってみてください。

4.4.1Width

盤面の横方向のセル数です。

4.4.2Height

盤面の縦方向のセル数です。

4.4.3Upper bound of hint cells

ヒントセルの上限数です。全セル数に対する割合(

4.4.4Modal of room size

部屋の大きさの最頻値です。 これはWidthとHeightのうち小さくない方に対する割合(

4.4.5Variance of room size

部屋の大きさの散らばり具合です。 これを大きくするとさまざまな大きさの部屋ができます。 一方小さくすると部屋の大きさが似通ったものになります。

5ライセンス

GPLとします。

6アルゴリズム

大したことはやっていません。 以下に示すように作っていきます。 なお、実際にどうやっているのかはソースコードをご覧ください。

6.1Phase 1 - split

盤面を乱数を使って適当に区切ります。

6.2Phase 2 - solve

solverに解けるところまで解いてもらいます。 解けなかった場合はPhase 3に、解けた場合はPhase 4に進みます。

6.3Phase 3 - arrange

solverが埋められなかったセルにヒントとして数字を適当に入れます。 そしてPhase 2へ。

6.4Phase 4 - reduce

ヒントセルのうち無くても良いものがあるかもしれません。 それらを取り除いてより困難な問題にします。 そして要求されたヒント数より少ない問題ができたら終了します。 そうでない場合には全てのセルをクリアしてPhase 2に戻ります。

7To do

作らせてみて思ったのですが、かなり難しいです。 つーか解けねーよ。 というわけで難易度設定とかできたらいいですね。

8バージョン履歴

8.1v0.1

First release.