public boolean checkPoint(int x, int y, boolean[][] miniMap, short[][][] colormap) { int size = 1; int r = colormap[x + MiniMap.minX][y + MiniMap.minY][0]; int g = colormap[x + MiniMap.minX][y + MiniMap.minY][1]; int b = colormap[x + MiniMap.minX][y + MiniMap.minY][2]; boolean run = true; while (true) { for (int xPos = 0; xPos < size; xPos++) { int relX = x + MiniMap.minX + xPos; int relY = y + MiniMap.minY + size; if (!inMiniMap(miniMap, x + xPos, y + size) || colormap[relX][relY][0] != r || colormap[relX][relY][1] != g || colormap[relX][relY][2] != b) { size--; run = false; break; } } if (!run) break; for (int yPos = 0; yPos < size; yPos++) { int relX = x + MiniMap.minX + size; int relY = y + MiniMap.minY + yPos; if (!inMiniMap(miniMap, x + size, y + yPos) || colormap[relX][relY][0] != r || colormap[relX][relY][1] != g || colormap[relX][relY][2] != b) { size--; run = false; break; } } if (!run) break; int relX = x + MiniMap.minX + size; int relY = y + MiniMap.minY + size; if (!inMiniMap(miniMap, x + size, y + size) || colormap[relX][relY][0] != r || colormap[relX][relY][1] != g || colormap[relX][relY][2] != b) { size--; run = false; break; } size++; } for (int xPos = 0; xPos < size; xPos++) { for (int yPos = 0; yPos < size; yPos++) { int relX = x + xPos; int relY = y + yPos; miniMap[relX][relY] = false; } } // tiles are 4x4's therefore size 3 return size == 3; } public boolean inMiniMap(boolean[][] miniMap, int x, int y) { return x < miniMap.length && y < miniMap[x].length && miniMap[x][y]; } public void countTiles() { Timer time = new Timer(20000); boolean[][] miniMap = new boolean[MiniMap.maxX - MiniMap.minX][MiniMap.maxY - MiniMap.minY]; for (int x = 0; x < miniMap.length; x++) { for (int y = 0; y < miniMap[x].length; y++) { miniMap[x][y] = MiniMap.inMiniMap(x + MiniMap.minX, y + MiniMap.minY); } } int count = 0; short[][][] colorMap = getColorArray2d(); for (int x = 0; x < miniMap.length; x++) { for (int y = 0; y < miniMap[x].length; y++) { if (checkPoint(x, y, miniMap, colorMap)) { count++; } } } log("count=" + count + " in " + time.timePassed()); }