From dcb0ac452d41d2699e1ad20836b606470b69f721 Mon Sep 17 00:00:00 2001 From: agp8x Date: Fri, 7 Apr 2017 13:44:04 +0200 Subject: [PATCH] add collapsing --- .../android/games/fillgrid/data/Cell.java | 2 + .../games/fillgrid/data/GridBoard.java | 57 +++++++++++++++++++ .../games/fillgrid/data/StringCell.java | 5 ++ .../games/fillgrid/data/GridBoardTest.java | 20 +++++++ 4 files changed, 84 insertions(+) diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/data/Cell.java b/app/src/main/java/org/agp8x/android/games/fillgrid/data/Cell.java index 06f07ef..0bbf86e 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/data/Cell.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/data/Cell.java @@ -6,4 +6,6 @@ package org.agp8x.android.games.fillgrid.data; public interface Cell { String getTableSymbol(); + + void markCollapsed(); } diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/data/GridBoard.java b/app/src/main/java/org/agp8x/android/games/fillgrid/data/GridBoard.java index c506bcb..bbdd1ad 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/data/GridBoard.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/data/GridBoard.java @@ -1,6 +1,8 @@ package org.agp8x.android.games.fillgrid.data; import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -43,6 +45,61 @@ public class GridBoard, C extends Cell> implements Grid< contents.clear(); } + /** + * Find lines with all cells filled and mark them as collapsed + * + * @return number of collapsed cells + */ + public int collapseFilledLines() { + List deletionQueue = findFullLines(); + deletionQueue.stream().map(contents::get).forEach(Cell::markCollapsed); + return deletionQueue.size(); + } + + public List findFullLines() { + List offsets = new LinkedList<>(); + offsets.addAll(findFullLines(dimensions.x, dimensions.y, new HorizontalLine())); + offsets.addAll(findFullLines(dimensions.y, dimensions.x, new VerticalLine())); + return offsets; + } + + private List findFullLines(int limit0, int limit1, OffsetLineGenerator offset) { + List offsets = new LinkedList<>(); + for (int i = 0; i < limit0; i++) { + List line = new LinkedList<>(); + for (int j = 0; j < limit1; j++) { + Offset key = offset.build(i, j); + if (contents.containsKey(key) && contents.get(key) != null) { + line.add(key); + } else { + break; + } + } + if (line.size() == dimensions.y) { + offsets.addAll(line); + } + } + return offsets; + } + + private interface OffsetLineGenerator { + Offset build(int x, int y); + } + + private class HorizontalLine implements OffsetLineGenerator { + @Override + public Offset build(int x, int y) { + return new Offset(y, x); + } + } + + private class VerticalLine implements OffsetLineGenerator { + @Override + public Offset build(int x, int y) { + return new Offset(x, y); + } + } + /** * Check whether a given object can be placed on a given origin * diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/data/StringCell.java b/app/src/main/java/org/agp8x/android/games/fillgrid/data/StringCell.java index e81f939..0174117 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/data/StringCell.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/data/StringCell.java @@ -30,4 +30,9 @@ public class StringCell implements Cell { public String getTableSymbol() { return value.substring(0,1); } + + @Override + public void markCollapsed() { + + } } diff --git a/app/src/test/java/org/agp8x/android/games/fillgrid/data/GridBoardTest.java b/app/src/test/java/org/agp8x/android/games/fillgrid/data/GridBoardTest.java index bb85621..3bdb8c0 100644 --- a/app/src/test/java/org/agp8x/android/games/fillgrid/data/GridBoardTest.java +++ b/app/src/test/java/org/agp8x/android/games/fillgrid/data/GridBoardTest.java @@ -38,5 +38,25 @@ public class GridBoardTest { System.out.println(board.symbolTable()); board.drop(new Offset(3,0), block1); System.out.println(board.symbolTable()); + System.out.println(board.findFullLines()); + GridBlock block2 = new GridBlock<>(new HashMap<>()); + block2.getObjects().put(new Offset(1,0), new StringCell("F")); + board.drop(new Offset(0,0), block2); + System.out.println(board.symbolTable()); + System.out.println(board.findFullLines()); + } + + @Test + public void testFullLines() throws Exception { + GridBlock block1 = new GridBlock<>(new HashMap<>()); + block1.getObjects().put(new Offset(0,0), new StringCell("1")); + block1.getObjects().put(new Offset(0,1), new StringCell("2")); + block1.getObjects().put(new Offset(0,2), new StringCell("3")); + block1.getObjects().put(new Offset(0,3), new StringCell("4")); + board.drop(new Offset(0,0), block1); + System.out.println(board.symbolTable()); + System.out.println(board.findFullLines()); + System.out.println(board.collapseFilledLines()); + } } \ No newline at end of file