Search in sources :

Example 11 with BlockField

use of common.datastore.BlockField 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");
}
Also used : PatternGenerator(common.pattern.PatternGenerator) Stopwatch(lib.Stopwatch) EntryPoint(entry.EntryPoint) FilterOnDemandBasicSolutions(searcher.pack.solutions.FilterOnDemandBasicSolutions) BasicSolutions(searcher.pack.calculator.BasicSolutions) BlockField(common.datastore.BlockField) ColumnField(core.column_field.ColumnField) InOutPairField(searcher.pack.InOutPairField) Field(core.field.Field) ColumnSmallField(core.column_field.ColumnSmallField) BlockField(common.datastore.BlockField) SizedBit(searcher.pack.SizedBit) SolutionFilter(searcher.pack.memento.SolutionFilter) ColorConverter(common.tetfu.common.ColorConverter) MinoFactory(core.mino.MinoFactory) MinoShifter(core.mino.MinoShifter)

Aggregations

BlockField (common.datastore.BlockField)11 Field (core.field.Field)8 ColoredField (common.tetfu.field.ColoredField)6 Piece (core.mino.Piece)6 TetfuElement (common.tetfu.TetfuElement)5 ColorType (common.tetfu.common.ColorType)5 MinoOperationWithKey (common.datastore.MinoOperationWithKey)4 ColorConverter (common.tetfu.common.ColorConverter)4 PatternGenerator (common.pattern.PatternGenerator)3 Operation (common.datastore.Operation)2 OperationWithKey (common.datastore.OperationWithKey)2 Pieces (common.datastore.blocks.Pieces)2 Tetfu (common.tetfu.Tetfu)2 Mino (core.mino.Mino)2 MinoFactory (core.mino.MinoFactory)2 MinoShifter (core.mino.MinoShifter)2 EntryPoint (entry.EntryPoint)2 SizedBit (searcher.pack.SizedBit)2 SyntaxException (common.SyntaxException)1 BuildUpStream (common.buildup.BuildUpStream)1