ナンプレ自動生成プログラム Version 2.0
XMLファイル入力例
ナンプレV2のアプリケーションで作ったXMLファイルを読み込んで、 同じヒント、作成条件で解きなおしてみよう。
ファイル名は、引数で与えることにし、 ナンプレV2で作ったファイルも簡単にテストデータファイルとして使えるようにしました。
プログラムを以下に示します。
読み込む部分が長くなったので、readFile()というメソッドの中にまとめました。
処理の概要は以下の通りです。
- 問題を読み込んで、一度そのまま解いて難易度ポイントを計算し、問題を表示します。
- 同じデータをそのまま利用して、自動生成を行って、難易度ポイントと問題を表示します。
プログラムが長めになっているのは、バージョン2は様々な機能を取り込んだためです。 使う機能を限定すれば、ずっと短く書くことができます。
XMLRead.java
2007-12-03 プログラムを修正:NumberPlaceFileからBlockConstraintを直接作るメソッドを Utilityに追加。
package jp.gr.puzzle.npv2.sample;
import java.io.File;
import jp.gr.puzzle.npv2.core.*;
public class XMLRead {
static int numSize;
static int[] hint;
static int[] hidden;
static int[] answer;
static int[] question;
static int point;
static SolverMethod method = new SolverMethod();
static BlockConstraint block;
static void readFile(String filename) {
File file = new File(filename);
NumberPlaceFile npFile = new NumberPlaceFile();
try {
npFile.Load(file);
} catch (Exception e) {
e.printStackTrace();
return;
}
numSize = npFile.getNumSize();
hint = Utility.boolean2int(npFile.getHint());
hidden = npFile.getHidden();
question = npFile.getProblem();
block = Utility.makeBlockConstraint(npFile);
int point = (int) Evaluator.evaluate(numSize, block, question);
System.out.println("old point " + point);
Utility.printGrid(question, numSize);
}
public static void main(String[] args) {
System.out.println("XMLRead remake a question.");
if (args.length == 0)
return;
readFile(args[0]);
Generator generator = new Generator( numSize, hint, hidden, block );
generator.setMethod(method);
while( (question = generator.generate()) == null )
;
Status state = new Status( numSize, block );
Solver.addNumbers(state, question);
point = (int)Evaluator.evaluate( numSize, block, question);
System.out.println( "new point "+point );
Utility.printGrid( question, numSize );
}
}
検証1
では、以下の問題をNPV2のアプリケーションでファイルにセーブし、それを読み込んで実行してみました。
XMLRead remake a question. old point 2458 0 0 0 0 0 0 0 0 0 0 0 3 4 0 1 2 0 0 0 7 0 0 9 0 0 1 0 0 1 0 0 3 0 0 6 0 0 0 4 7 0 2 3 0 0 0 6 0 0 5 0 0 7 0 0 5 0 0 7 0 0 3 0 0 0 9 5 0 3 8 0 0 0 0 0 0 0 0 0 0 0 new point 5125 0 0 0 0 0 0 0 0 0 0 0 2 9 0 4 6 0 0 0 8 0 0 1 0 0 5 0 0 7 0 0 8 0 0 3 0 0 0 8 4 0 3 9 0 0 0 6 0 0 5 0 0 8 0 0 1 0 0 3 0 0 9 0 0 0 9 7 0 8 3 0 0 0 0 0 0 0 0 0 0 0
難易度の異なる違う問題ができたことが分かるでしょう。
検証2
次は、違うサイズのジグソーナンプレを試してみました。
プログラムの変更は一切必要ありません。 この問題のファイル名を引数に指定するだけで、別の問題ファイルで試すことができます。
XMLRead remake a question. old point 1535 0 0 3 0 1 0 0 0 4 0 0 0 7 0 1 0 0 0 0 0 2 0 0 0 0 0 0 0 7 0 0 0 0 0 3 0 3 0 0 0 1 0 0 0 1 0 6 0 0 new point 2104 0 0 5 0 7 0 0 0 1 0 0 0 6 0 5 0 0 0 0 0 3 0 0 0 0 0 0 0 3 0 0 0 0 0 7 0 2 0 0 0 5 0 0 0 7 0 4 0 0
今度も、同様に新しい問題を作ることができました。
もっと大きな問題とか、対角線も指定されたナンプレとかももちろん動きますが、 検証をいちいち載せるのは省略します。