Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- **********************
- package com.company;
- public class Main {
- public static void main(String[] args) {
- // делаем форму видимой
- Gui2 app = new Gui2();
- app.pack();
- app.setVisible(true);
- }
- }
- *************************
- package com.company;
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- import javax.swing.border.LineBorder;
- public class Gui2 extends JFrame {
- //Объявление переменных
- Boolean RED;
- String Buf;
- int X1;
- int Y1;
- boolean mark = false;
- //изначальное поле судоку
- //В дальнейшем поля будут создаваться и передаваться в отдельном классе/пакете
- int array[][] = {{0, 0, 8, 2, 0, 0, 9, 0, 3},
- {3, 4, 2, 0, 9, 5, 0, 0, 7},
- {1, 9, 7, 0, 0, 0, 0, 0, 4},
- {0, 0, 5, 3, 1, 2, 4, 7, 9},
- {0, 0, 0, 0, 0, 0, 0, 0, 0},
- {2, 0, 0, 0, 7, 4, 5, 0, 0},
- {0, 2, 0, 0, 0, 1, 0, 0, 5},
- {0, 7, 0, 0, 0, 6, 8, 9, 1},
- {8, 0, 0, 4, 3, 0, 7, 0, 6}};
- //Решенное поле
- int Resh[][] = {{5, 6, 8, 2, 4, 7, 9, 1, 3},
- {3, 4, 2, 1, 9, 5, 6, 8, 7},
- {1, 9, 7, 8, 6, 3, 2, 5, 4},
- {6, 8, 5, 3, 1, 2, 4, 7, 9},
- {7, 3, 4, 9, 5, 8, 1, 6, 2},
- {2, 1, 9, 6, 7, 4, 5, 3, 8},
- {9, 2, 6, 7, 8, 1, 3, 4, 5},
- {4, 7, 3, 5, 2, 6, 8, 9, 1},
- {8, 5, 1, 4, 3, 9, 7, 2, 6}};
- //Создание FocusListener
- class MutableListener implements FocusListener {
- //Действия при получении текстовым полем фокуса
- @Override
- public void focusGained(FocusEvent e) {
- if (getFocusOwner().getBackground() == Color.RED) {
- RED = true;
- } else {
- RED = false;
- }
- getFocusOwner().setBackground(Color.GREEN);
- //Ищем поле, на котором стоит фокус
- //В дальнейшем алгоритм будет изменен
- for (int x = 0; x <= 8; x++) {
- for (int y = 0; y <= 8; y++) {
- if (f[x][y].getBackground() == Color.GREEN) {
- // помечаем поля по горизонтали вертикали от выбраного
- // опять же будет меняться
- // Так же будет закрашен квадрат внутри которого находится выбраное поле
- // И помечены все поля с тем же значением, что и в выбранном
- for (int i = 0; i <= 8; i++) {
- if (f[x][i].getBackground() != Color.RED) {
- f[x][i].setBackground(Color.LIGHT_GRAY);
- }
- if (f[i][y].getBackground() != Color.RED) {
- f[i][y].setBackground(Color.LIGHT_GRAY);
- }
- }//Ошибочные поля оставаются закрашенными
- if (RED == true) {
- f[x][y].setBackground(Color.RED);
- } else {
- f[x][y].setBackground(Color.GRAY);
- }
- //Задаем буферным переменным значения в зависимости от выбранного поля
- Buf = f[x][y].getText();
- X1 = x;
- Y1 = y;
- break;
- }
- }
- }
- }
- //Действия при потере фокуса
- @Override
- public void focusLost(FocusEvent e) {
- //Закрашиваем все обратно
- if ((f[X1][Y1].getBackground() == Color.RED) | (f[X1][Y1].getBackground() == Color.GRAY)){
- if (f[X1][Y1].getBackground() == Color.RED) {
- RED = true;
- }
- for (int i = 0; i <= 8; i++) {
- if (f[X1][i].getBackground() != Color.RED) {
- f[X1][i].setBackground(Color.WHITE);
- }
- if (f[i][Y1].getBackground() != Color.RED) {
- f[i][Y1].setBackground(Color.WHITE);
- }
- }
- if (RED == true) {
- f[X1][Y1].setBackground(Color.RED);
- }
- }
- }
- }
- //Создаем массивы с текстовыми полями и панелями
- private JTextField f[][] = new JTextField[9][9];
- public JPanel p[][] = new JPanel[3][3];
- //Привет интерфейс
- public Gui2() {
- super("Sudoku");
- //При выходе из формы мы выйдем и из программы
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- //Создаем текстовые поля
- for (int x = 0; x <= 8; x++) {
- for (int y = 0; y <= 8; y++) {
- //Тут думаю объяснять ничего не нужно
- f[x][y] = new JTextField();
- f[x][y].setHorizontalAlignment(JTextField.CENTER);
- f[x][y].setBorder(new LineBorder(Color.BLACK));
- f[x][y].setBorder(BorderFactory.createStrokeBorder(new BasicStroke(1f)));
- f[x][y].setPreferredSize(new Dimension(50, 50));
- //Определяем какие поля у нас будут доступны пользователю
- if (array[x][y] != 0) {
- String buf = String.valueOf(array[x][y]);
- f[x][y].setText(buf);
- f[x][y].setFocusable(false);
- f[x][y].setBackground(Color.WHITE);
- } else {
- f[x][y].setFocusable(true);
- //Добавляем пустым полям FocusListener и KeyListener(
- f[x][y].addFocusListener(new MutableListener());
- f[x][y].addKeyListener(new KeyAdapter() {
- // Собственно KeyListener(
- @Override
- public void keyTyped(KeyEvent e) {
- //Проверка на ввод
- int a = Character.getNumericValue(e.getKeyChar());
- // Проверка на Back_Space
- if (e.getKeyChar() == KeyEvent.VK_BACK_SPACE && Buf.length() > 0) {
- // Buf - это значение выбраного поля (смотри FocusListener)
- Buf = Buf.substring(0, Buf.length() - 1);
- f[X1][Y1].setBackground(Color.GRAY);
- RED = false;
- } else if ((Character.isDigit(e.getKeyChar())) && (a<10)&&(a>0) && (Buf.length()!=1)) {
- Buf += e.getKeyChar();
- } else {
- //Если нажатая кнопка не число от 1 до 9 и не Back_Space - то действие отменяется
- e.consume();
- }
- // проверка на правильность
- Integer Buf_int = Integer.valueOf(Buf);
- if (Resh[X1][Y1] != Buf_int) {
- f[X1][Y1].setBackground(Color.RED);
- }
- //Проверяем не закончил ли случаем пользоваеель Судоку
- //Потом алгоритм тоже будет изменен
- if (Ending() ==true) {
- JOptionPane.showMessageDialog(null,"Поздравляю\n вы решили судоку");
- }
- }
- });
- }
- }
- }
- // Расставление панелей (для деления текстовых полей на 9 квадратов)
- for (int x = 0; x <= 2; x++) {
- for (int y = 0; y <= 2; y++) {
- p[x][y] = new JPanel(new GridLayout(3, 3));
- p[x][y].setBorder(new LineBorder(Color.BLACK));
- p[x][y].setBorder(BorderFactory.createStrokeBorder(new BasicStroke(1f)));
- }
- }
- setLayout(new GridLayout(3, 3, 5, 5));
- for (int u = 0; u <= 2; u++) {
- for (int i = 0; i <= 2; i++) {
- for (int y = 0; y <= 2; y++) {
- for (int x = 0; x <= 2; x++) {
- p[u][i].add(f[y + u * 3][x + i * 3]);
- }
- }
- add(p[u][i]);
- }
- }
- }
- // Проверяем правильную заполненость Судоку
- public boolean Ending() {
- int c = 0;
- for (int i = 0; i <= 8; i++) {
- for (int j = 0; j <= 8; j++) {
- if (f[i][j].getText().equals(("" + Resh[i][j]))) {
- c++;
- if (c==80) mark=true;
- }
- }
- }
- return mark;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement