/
Binom
/
SudokuSolverAlise
Обзор
Документация
Войти
/
Binom
/
SudokuSolverAlise
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
SudokuController.java
189 строк
7 KB
Binom
upload files
23 ноя 2025, 12:16
23 ноя 2025, 12:16
a87f9bf
Код
Авторство
О чём код?
package org.example; import javax.swing.*; import java.awt.*; import java.io.IOException; import java.sql.Array; import java.util.ArrayList; import java.util.stream.Collectors; import static org.example.SudokuGUI.cells; import static org.example.SudokuGUI.miniGrids; public class SudokuController extends Component { private SudokuGUI view; private SudokuBoard model; private SudokuSolver solver; public SudokuController(SudokuGUI view, SudokuBoard model, SudokuSolver solver) { this.view = view; this.model = model; this.solver = solver; // Слушатели для меню view.addMenuItemListener("solve", e -> solveAction()); view.addMenuItemListener("clear", e -> clearBoard()); view.addMenuItemListener("save", e -> saveBoardAction()); view.addMenuItemListener("load", e -> loadBoardAction()); view.addMenuItemListener("hint", e-> showHint()); view.addMenuItemListener("possible", e -> { view.show = true; view.showCandidates();}); view.addMenuItemListener("disable", e-> { view.show = false; view.showCandidates();}); // Слушатели для кнопок внизу view.getSolveButton().addActionListener(e -> solveAction()); view.getClearButton().addActionListener(e -> {view.show = false; clearBoard();}); view.getHintButton().addActionListener(e -> showHint()); for (int i = 1; i < 10; i++) { int finalI = i; view.getBtn()[i-1].addActionListener(e -> insertNumber(finalI)); } } private void solveAction() { // 1. Получаем данные из UI int[][] uiData = view.loadBoardFromUI(); // 2. Обновляем модель model.updateFromArray(uiData); if (solver.solve(model)) { view.updateUIWithSolution(model); } else { JOptionPane.showMessageDialog(view, "Нет решения!"); } } private void clearBoard() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { model.getBoard()[i][j].setValue(0); model.getBoard()[i][j].setFixed(false); } view.getBtn()[i].setText(String.valueOf(i + 1)); } view.updateUIWithSolution(model); } private void saveBoardAction() { JFileChooser fileChooser = new JFileChooser(); fileChooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter("Файлы судоку (*.sudoku)", "sudoku")); int result = fileChooser.showSaveDialog(view); if (result == JFileChooser.APPROVE_OPTION) { String filePath = fileChooser.getSelectedFile().getPath(); if (!filePath.endsWith(".sudoku")) { filePath += ".sudoku"; } try { SudokuFileManager.saveBoard(model, filePath); JOptionPane.showMessageDialog(view, "Доска сохранена!"); } catch (IOException ex) { JOptionPane.showMessageDialog(view, "Ошибка сохранения: " + ex.getMessage()); } } } private void loadBoardAction() { JFileChooser fileChooser = new JFileChooser(); fileChooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter("Файлы судоку (*.sudoku)", "sudoku")); int result = fileChooser.showOpenDialog(view); if (result == JFileChooser.APPROVE_OPTION) { String filePath = fileChooser.getSelectedFile().getPath(); try { SudokuBoard loadedBoard = SudokuFileManager.loadBoard(filePath); model = loadedBoard; view.updateUIWithSolution(model); JOptionPane.showMessageDialog(view, "Доска загружена!"); } catch (Exception ex) { JOptionPane.showMessageDialog(view, "Ошибка загрузки: " + ex.getMessage()); } } } private void insertNumber(int num) { if (view.selectedCell == null) { JOptionPane.showMessageDialog(this, "Сначала выделите ячейку на поле судоку!", "Ошибка", JOptionPane.WARNING_MESSAGE); return; } // Находим индексы выделенной ячейки int row = -1, col = -1; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (cells[i][j] == view.selectedCell) { row = i; col = j; break; } } } if (row == -1 || col == -1) return; // Обновляем модель model.getBoard()[row][col].setValue(num); view.selectedCell.setText(String.valueOf(num)); // 1. Получаем данные из UI int[][] uiData = view.loadBoardFromUI(); // 2. Обновляем модель model.updateFromArray(uiData); // 3. Проверяем на количество введенных цифр checkTextButton(); } private void checkTextButton() { String number = view.selectedCell.getText(); int numb = Integer.parseInt(number); int count = model.countOccurrences(numb); if (count >= 9) { view.getBtn()[numb-1].setText(""); } } private void showHint() { if (view.selectedCell == null) { JOptionPane.showMessageDialog(this, "Сначала выделите ячейку на поле судоку!", "Ошибка", JOptionPane.WARNING_MESSAGE); return; } // Находим индексы выделенной ячейки int row = -1, col = -1; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (cells[i][j] == view.selectedCell) { row = i; col = j; break; } } } if (row == -1 || col == -1) return; if (solver.solve(model)) { int digit = model.getBoard()[row][col].getValue(); view.selectedCell.setText(String.valueOf(digit)); } else { JOptionPane.showMessageDialog(view, "Нет решения!"); } int[][] uiData = view.loadBoardFromUI(); model.updateFromArray(uiData); } }