use of common.pattern.PatternGenerator in project solution-finder by knewjade.
the class PathEntryPoint method run.
@Override
public void run() throws FinderException {
output("# Setup Field");
// Setup field
Field field = settings.getField();
Verify.field(field);
// Setup max clear line
int maxClearLine = settings.getMaxClearLine();
Verify.maxClearLineUnder10(maxClearLine);
// Setup reserved blocks
BlockField reservedBlocks = settings.getReservedBlock();
if (settings.isReserved()) {
Verify.reservedBlocks(reservedBlocks);
for (int y = maxClearLine - 1; 0 <= y; y--) {
StringBuilder builder = new StringBuilder();
for (int x = 0; x < 10; x++) {
if (reservedBlocks.getBlock(x, y) != null)
builder.append(reservedBlocks.getBlock(x, y).getName());
else if (!field.isEmpty(x, y))
builder.append('X');
else
builder.append('_');
}
output(builder.toString());
}
} else {
output(FieldView.toString(field, maxClearLine));
}
// Setup max depth
// パフェに必要なミノ数
int maxDepth = Verify.maxDepth(field, maxClearLine);
output();
// ========================================
// Output user-defined
output("# Initialize / User-defined");
output("Max clear lines: " + maxClearLine);
output("Using hold: " + (settings.isUsingHold() ? "use" : "avoid"));
output("Drop: " + settings.getDropType().name().toLowerCase());
output("Searching patterns:");
// Setup patterns
List<String> patterns = settings.getPatterns();
PatternGenerator generator = Verify.patterns(patterns, maxDepth);
// Output patterns
for (String pattern : patterns) output(" " + pattern);
output();
// ========================================
// Setup core
output("# Initialize / System");
int threadCount = getThreadCount();
// Output system-defined
output("Version = " + FinderConstant.VERSION);
output("Threads = " + threadCount);
output("Need Pieces = " + maxDepth);
output();
// ========================================
// Initialize
MinoFactory minoFactory = new MinoFactory();
MinoShifter minoShifter = new MinoShifter();
ColorConverter colorConverter = new ColorConverter();
SizedBit sizedBit = decideSizedBitSolutionWidth(maxClearLine);
SolutionFilter solutionFilter = new ForPathSolutionFilter(generator, maxClearLine);
// Holdができるときは必要なミノ分(maxDepth + 1)だけを取り出す。maxDepth + 1だけないときはブロックの個数をそのまま指定
output("# Enumerate pieces");
boolean isUsingHold = settings.isUsingHold();
int piecesDepth = generator.getDepth();
output("Piece pop count = " + (isUsingHold && maxDepth < piecesDepth ? maxDepth + 1 : maxDepth));
output();
// ========================================
output("# Cache");
output(" -> Stopwatch start");
Stopwatch stopwatch1 = Stopwatch.createStartedStopwatch();
BasicSolutions basicSolutions = calculateBasicSolutions(field, minoFactory, minoShifter, sizedBit, solutionFilter);
stopwatch1.stop();
output(" ... done");
output(" -> Stopwatch stop : " + stopwatch1.toMessage(TimeUnit.MILLISECONDS));
output();
// ========================================
output("# Search");
output(" -> Stopwatch start");
output(" ... searching");
Stopwatch stopwatch2 = Stopwatch.createStartedStopwatch();
PathCore pathCore = createPathCore(field, maxClearLine, maxDepth, patterns, minoFactory, colorConverter, sizedBit, solutionFilter, isUsingHold, basicSolutions, threadCount);
List<PathPair> pathPairs = run(pathCore, field, sizedBit, reservedBlocks);
stopwatch2.stop();
output(" ... done");
output(" -> Stopwatch stop : " + stopwatch2.toMessage(TimeUnit.MILLISECONDS));
output();
// ========================================
output("# Output file");
OutputType outputType = settings.getOutputType();
PathOutput pathOutput = createOutput(outputType, generator, maxDepth);
pathOutput.output(pathPairs, field, sizedBit);
output();
// ========================================
output("# Finalize");
output("done");
}
Aggregations