The Bomberman Game

  • + 1 comment

    Java

    /*
     * Complete the 'bomberMan' function below.
     *
     * The function is expected to return a STRING_ARRAY.
     * The function accepts following parameters:
     *  1. INTEGER n
     *  2. STRING_ARRAY grid
     */
    public static List<String> bomberMan(int n, List<String> grid) {
    	if (n == 0 || n == 1) {
    		return grid;
    	}
    	// 3 -> 7 -> 11 -> 15 ...
    	if (n == 3 || ((n - 4) % 4) == 3) {
    		return bombsDetonateState3(grid);
    	}
    	// 5 -> 9 -> 13 ..
    	if (((n - 4) % 4) == 1) {
    		return bombsDetonateState5(grid);
    	}
    	if (n % 2 == 0) {
    		return boardFullOfBombsState(grid);
    	}
    	return grid;
    }
    
    private static List<String> bombsDetonateState3(List<String> grid) {
    	return explodeBombs(grid);
    }
    
    private static List<String> bombsDetonateState5(List<String> grid) {
    	List<String> baseGrid = bombsDetonateState3(grid);
    	return explodeBombs(baseGrid);
    }
    
    private static List<String> explodeBombs(List<String> grid) {
    	List<String> newGrid = new ArrayList<>();
    	for (int i = 0; i < grid.size(); i++) {
    		StringBuilder sb = new StringBuilder();
    		for (int j = 0; j < grid.get(0).length(); j++) {
    			char current = grid.get(i).charAt(j);
    			char up = i - 1 >= 0 ? grid.get(i - 1).charAt(j) : '.';
    			char down = i + 1 < grid.size() ? grid.get(i + 1).charAt(j) : '.';
    			char left = j - 1 >= 0 ? grid.get(i).charAt(j - 1) : '.';
    			char right = j + 1 < grid.get(0).length() ? grid.get(i).charAt(j + 1) : '.';
    			if (current == 'O') {
    				sb.append('.');
    			} else if (up == 'O' || down == 'O' || left == 'O' || right == 'O') {
    				sb.append('.');
    			} else {
    				sb.append('O');
    			}
    		}
    		newGrid.add(sb.toString());
    	}
    	return newGrid;
    }
    
    private static List<String> boardFullOfBombsState(List<String> grid) {
    	return grid.stream().map(s -> "O".repeat(grid.get(0).length())).collect(toList());
    }