Advertisement
Guest User

Untitled

a guest
Apr 7th, 2020
364
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.06 KB | None | 0 0
  1. **********************
  2. package com.company;
  3.  
  4. public class Main {
  5.  
  6.     public static void main(String[] args) {
  7.         // делаем форму видимой
  8.         Gui2 app = new Gui2();
  9.         app.pack();
  10.         app.setVisible(true);
  11.     }
  12. }
  13. *************************
  14.  
  15. package com.company;
  16. import java.awt.*;
  17. import java.awt.event.*;
  18. import javax.swing.*;
  19. import javax.swing.border.LineBorder;
  20.  
  21. public class Gui2 extends JFrame {
  22.     //Объявление переменных
  23.     Boolean RED;
  24.     String Buf;
  25.     int X1;
  26.     int Y1;
  27.     boolean mark = false;
  28.  
  29.     //изначальное поле судоку
  30.     //В дальнейшем поля будут создаваться и передаваться в отдельном классе/пакете
  31.     int array[][] = {{0, 0, 8, 2, 0, 0, 9, 0, 3},
  32.             {3, 4, 2, 0, 9, 5, 0, 0, 7},
  33.             {1, 9, 7, 0, 0, 0, 0, 0, 4},
  34.             {0, 0, 5, 3, 1, 2, 4, 7, 9},
  35.             {0, 0, 0, 0, 0, 0, 0, 0, 0},
  36.             {2, 0, 0, 0, 7, 4, 5, 0, 0},
  37.             {0, 2, 0, 0, 0, 1, 0, 0, 5},
  38.             {0, 7, 0, 0, 0, 6, 8, 9, 1},
  39.             {8, 0, 0, 4, 3, 0, 7, 0, 6}};
  40.     //Решенное поле
  41.     int Resh[][] = {{5, 6, 8, 2, 4, 7, 9, 1, 3},
  42.             {3, 4, 2, 1, 9, 5, 6, 8, 7},
  43.             {1, 9, 7, 8, 6, 3, 2, 5, 4},
  44.             {6, 8, 5, 3, 1, 2, 4, 7, 9},
  45.             {7, 3, 4, 9, 5, 8, 1, 6, 2},
  46.             {2, 1, 9, 6, 7, 4, 5, 3, 8},
  47.             {9, 2, 6, 7, 8, 1, 3, 4, 5},
  48.             {4, 7, 3, 5, 2, 6, 8, 9, 1},
  49.             {8, 5, 1, 4, 3, 9, 7, 2, 6}};
  50.  
  51.     //Создание FocusListener
  52.     class MutableListener implements FocusListener {
  53.  
  54.         //Действия при получении текстовым полем фокуса
  55.         @Override
  56.         public void focusGained(FocusEvent e) {
  57.             if (getFocusOwner().getBackground() == Color.RED) {
  58.                 RED = true;
  59.             } else {
  60.                 RED = false;
  61.             }
  62.             getFocusOwner().setBackground(Color.GREEN);
  63.             //Ищем поле, на котором стоит фокус
  64.             //В дальнейшем алгоритм будет изменен
  65.             for (int x = 0; x <= 8; x++) {
  66.                 for (int y = 0; y <= 8; y++) {
  67.                     if (f[x][y].getBackground() == Color.GREEN) {
  68.                         // помечаем поля по горизонтали вертикали от выбраного
  69.                         // опять же будет меняться
  70.                         // Так же будет закрашен квадрат внутри которого находится выбраное поле
  71.                         // И помечены все поля с тем же значением, что и в выбранном
  72.                         for (int i = 0; i <= 8; i++) {
  73.                             if (f[x][i].getBackground() != Color.RED) {
  74.                                 f[x][i].setBackground(Color.LIGHT_GRAY);
  75.                             }
  76.                             if (f[i][y].getBackground() != Color.RED) {
  77.                                 f[i][y].setBackground(Color.LIGHT_GRAY);
  78.                             }
  79.                         }//Ошибочные поля оставаются закрашенными
  80.                         if (RED == true) {
  81.                             f[x][y].setBackground(Color.RED);
  82.                         } else {
  83.                             f[x][y].setBackground(Color.GRAY);
  84.                         }
  85.  
  86.                         //Задаем буферным переменным значения в зависимости от выбранного поля
  87.                         Buf = f[x][y].getText();
  88.                         X1 = x;
  89.                         Y1 = y;
  90.                         break;
  91.                     }
  92.                 }
  93.             }
  94.         }
  95.         //Действия при потере фокуса
  96.         @Override
  97.         public void focusLost(FocusEvent e) {
  98.             //Закрашиваем все обратно
  99.             if ((f[X1][Y1].getBackground() == Color.RED) |  (f[X1][Y1].getBackground() == Color.GRAY)){
  100.                 if (f[X1][Y1].getBackground() == Color.RED) {
  101.                     RED = true;
  102.                 }
  103.                 for (int i = 0; i <= 8; i++) {
  104.                     if (f[X1][i].getBackground() != Color.RED) {
  105.                         f[X1][i].setBackground(Color.WHITE);
  106.                     }
  107.                     if (f[i][Y1].getBackground() != Color.RED) {
  108.                         f[i][Y1].setBackground(Color.WHITE);
  109.                     }
  110.                 }
  111.                 if (RED == true) {
  112.                     f[X1][Y1].setBackground(Color.RED);
  113.                 }
  114.             }
  115.         }
  116.     }
  117.  
  118.     //Создаем массивы с текстовыми полями и панелями
  119.         private JTextField f[][] = new JTextField[9][9];
  120.         public JPanel p[][] = new JPanel[3][3];
  121.  
  122.     //Привет интерфейс
  123.         public Gui2() {
  124.             super("Sudoku");
  125.             //При выходе из формы мы выйдем и из программы
  126.             setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  127.  
  128.             //Создаем текстовые поля
  129.             for (int x = 0; x <= 8; x++) {
  130.                 for (int y = 0; y <= 8; y++) {
  131.                     //Тут думаю объяснять ничего не нужно
  132.                     f[x][y] = new JTextField();
  133.                     f[x][y].setHorizontalAlignment(JTextField.CENTER);
  134.                     f[x][y].setBorder(new LineBorder(Color.BLACK));
  135.                     f[x][y].setBorder(BorderFactory.createStrokeBorder(new BasicStroke(1f)));
  136.                     f[x][y].setPreferredSize(new Dimension(50, 50));
  137.                     //Определяем какие поля у нас будут доступны пользователю
  138.                     if (array[x][y] != 0) {
  139.                         String buf = String.valueOf(array[x][y]);
  140.                         f[x][y].setText(buf);
  141.                         f[x][y].setFocusable(false);
  142.                         f[x][y].setBackground(Color.WHITE);
  143.                     } else {
  144.                         f[x][y].setFocusable(true);
  145.                         //Добавляем пустым полям FocusListener и KeyListener(
  146.                         f[x][y].addFocusListener(new MutableListener());
  147.                         f[x][y].addKeyListener(new KeyAdapter() {
  148.  
  149.                             // Собственно KeyListener(
  150.                             @Override
  151.                             public void keyTyped(KeyEvent e) {
  152.  
  153.                                 //Проверка на ввод
  154.                                 int a = Character.getNumericValue(e.getKeyChar());
  155.                                 // Проверка на Back_Space
  156.                                 if (e.getKeyChar() == KeyEvent.VK_BACK_SPACE && Buf.length() > 0) {
  157.                                     // Buf - это значение выбраного поля (смотри FocusListener)
  158.                                     Buf = Buf.substring(0, Buf.length() - 1);
  159.                                     f[X1][Y1].setBackground(Color.GRAY);
  160.                                     RED = false;
  161.                                 } else if ((Character.isDigit(e.getKeyChar())) && (a<10)&&(a>0) && (Buf.length()!=1)) {
  162.                                     Buf += e.getKeyChar();
  163.                                 } else {
  164.                                     //Если нажатая кнопка не число от 1 до 9 и не Back_Space - то действие отменяется
  165.                                     e.consume();
  166.                                 }
  167.  
  168.                                 // проверка на правильность
  169.                                 Integer Buf_int = Integer.valueOf(Buf);
  170.                                 if (Resh[X1][Y1] != Buf_int) {
  171.                                     f[X1][Y1].setBackground(Color.RED);
  172.                                 }
  173.                                 //Проверяем не закончил ли случаем пользоваеель Судоку
  174.                                 //Потом алгоритм тоже будет изменен
  175.                                 if (Ending() ==true) {
  176.                                     JOptionPane.showMessageDialog(null,"Поздравляю\n вы решили судоку");
  177.                                 }
  178.                             }
  179.                         });
  180.                     }
  181.                 }
  182.             }
  183.             // Расставление панелей (для деления текстовых полей на 9 квадратов)
  184.             for (int x = 0; x <= 2; x++) {
  185.                 for (int y = 0; y <= 2; y++) {
  186.                     p[x][y] = new JPanel(new GridLayout(3, 3));
  187.                     p[x][y].setBorder(new LineBorder(Color.BLACK));
  188.                     p[x][y].setBorder(BorderFactory.createStrokeBorder(new BasicStroke(1f)));
  189.                 }
  190.             }
  191.  
  192.             setLayout(new GridLayout(3, 3, 5, 5));
  193.  
  194.             for (int u = 0; u <= 2; u++) {
  195.                 for (int i = 0; i <= 2; i++) {
  196.                     for (int y = 0; y <= 2; y++) {
  197.                         for (int x = 0; x <= 2; x++) {
  198.                             p[u][i].add(f[y + u * 3][x + i * 3]);
  199.                         }
  200.                     }
  201.                     add(p[u][i]);
  202.                 }
  203.             }
  204.         }
  205.         // Проверяем правильную заполненость Судоку
  206.     public boolean Ending() {
  207.         int c = 0;
  208.         for (int i = 0; i <= 8; i++) {
  209.             for (int j = 0; j <= 8; j++) {
  210.                 if (f[i][j].getText().equals(("" + Resh[i][j]))) {
  211.                     c++;
  212.                     if (c==80) mark=true;
  213.                 }
  214.             }
  215.         }
  216.         return mark;
  217.     }
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement