package domain; import java.io.*; import java.net.URL; import java.util.*; public class HitoriBoardLoader { private Map availableBoards; private Map> solutions; public HitoriBoardLoader() { availableBoards = new HashMap<>(); solutions = new HashMap<>(); loadAllBoards(); } private void loadAllBoards() { try { // Define all board file names String[] boardFiles = { "Hitori4x4_leicht.csv", "Hitori5x5leicht.csv", "Hitori8x8leicht.csv", "Hitori8x8medium.csv", "Hitori10x10medium.csv", "Hitori15x15_medium.csv" }; // Try to load each board for (String fileName : boardFiles) { try { InputStream is = getClass().getResourceAsStream("/META-INF/" + fileName); if (is == null) { is = getClass().getResourceAsStream("/" + fileName); } if (is != null) { loadBoard(fileName, is); } } catch (Exception e) { System.out.println("Failed to load board: " + fileName); e.printStackTrace(); } } if (availableBoards.isEmpty()) { System.out.println("No board files found. Please ensure .csv files are in the resources folder."); } else { System.out.println("Successfully loaded " + availableBoards.size() + " boards."); } } catch (Exception e) { e.printStackTrace(); } } private void loadBoard(String fileName, InputStream inputStream) throws IOException { try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { List lines = new ArrayList<>(); String line; while ((line = reader.readLine()) != null) { lines.add(line); } // Find where the solution starts int solutionIndex = -1; for (int i = 0; i < lines.size(); i++) { if (lines.get(i).contains("//")) { solutionIndex = i; break; } } // Parse the board List boardRows = new ArrayList<>(); for (int i = 0; i < (solutionIndex == -1 ? lines.size() : solutionIndex); i++) { line = lines.get(i).trim(); if (!line.isEmpty()) { boardRows.add(line.split(",")); } } if (!boardRows.isEmpty()) { int rows = boardRows.size(); int cols = boardRows.get(0).length; int[][] board = new int[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { board[i][j] = Integer.parseInt(boardRows.get(i)[j].trim()); } } availableBoards.put(fileName, board); // Parse the solution if available List solutionCoordinates = new ArrayList<>(); if (solutionIndex != -1) { for (int i = solutionIndex + 1; i < lines.size(); i++) { line = lines.get(i).trim(); if (!line.isEmpty() && !line.startsWith("//")) { String[] coords = line.split(","); solutionCoordinates.add(new int[]{ Integer.parseInt(coords[0].trim()) - 1, Integer.parseInt(coords[1].trim()) - 1 }); } } solutions.put(fileName, solutionCoordinates); } } } } public Set getAvailableBoardNames() { return availableBoards.keySet(); } public int[][] getBoard(String boardName) { return availableBoards.get(boardName); } public List getSolution(String boardName) { return solutions.get(boardName); } }