package com.company; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import java.util.Random; public class GUI extends JFrame implements ActionListener, KeyListener { private JMenuBar menuBar = new JMenuBar(); private JMenu fileMenu = new JMenu("File"); private JMenu newGame = new JMenu("New game"); private JMenuItem deleteGame = new JMenuItem("Delete game"); private JMenuItem easyGame = new JMenuItem("Easy game"); private JMenuItem mediumGame = new JMenuItem("Medium game"); private JMenuItem hardGame = new JMenuItem("Hard game"); private JTextField[][] gameGrid = new JTextField[9][9]; public GUI() { this.setLayout(new GridLayout(9, 9)); this.setTitle("Sudoku"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fillEmptyGrid(); addKeyListeners(); addMenuItems(); addActionListeners(); fillBoard(100); this.setVisible(true); this.pack(); } private void fillEmptyGrid() { for (int i = 0; i < 9 ; i++) { for (int j = 0; j < 9; j++) { this.gameGrid[i][j] = new JTextField(""); this.gameGrid[i][j].setPreferredSize(new Dimension(50, 50)); this.gameGrid[i][j].setHorizontalAlignment(JTextField.CENTER); this.add(this.gameGrid[i][j]); } } } private void addKeyListeners() { for (int i = 0; i < 9 ; i++) { for (int j = 0; j < 9; j++) { this.gameGrid[i][j].addKeyListener(this); } } } private void addActionListeners() { this.deleteGame.addActionListener(this); this.newGame.addActionListener(this); this.easyGame.addActionListener(this); this.mediumGame.addActionListener(this); this.hardGame.addActionListener(this); } private void addMenuItems() { this.setJMenuBar(this.menuBar); this.menuBar.add(this.fileMenu); this.fileMenu.add(this.newGame); this.fileMenu.add(this.deleteGame); this.newGame.add(this.easyGame); this.newGame.add(this.mediumGame); this.newGame.add(this.hardGame); } private ArrayList generateNumbers() { ArrayList sudokuNumbers = new ArrayList<>(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { sudokuNumbers.add((j + 1)); } } return sudokuNumbers; } private void clearGrid() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { this.gameGrid[i][j].setText(""); this.gameGrid[i][j].setEditable(true); } } } private void fillBoard(int fillPercentage){ clearGrid(); ArrayList sudokuNumbers = generateNumbers(); Random randomGenerator = new Random(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { int tolerance = randomGenerator.nextInt(100); if(tolerance < fillPercentage) { JTextField currentCell = this.gameGrid[i][j]; int randomIndex = randomGenerator.nextInt(sudokuNumbers.size()); String randomNumber = Integer.toString(sudokuNumbers.get(randomIndex)); sudokuNumbers.remove(randomIndex); currentCell.setText(randomNumber); currentCell.setEditable(false); } } } } @Override public void actionPerformed(ActionEvent e) { if (e.getSource().equals(this.deleteGame)) { clearGrid(); } else if (e.getSource().equals(this.easyGame)) { fillBoard(100); } else if (e.getSource().equals(this.mediumGame)) { fillBoard(80); } else if (e.getSource().equals(this.hardGame)) { fillBoard(60); } } @Override public void keyTyped(KeyEvent e) { if (e.getKeyChar() < 49 || e.getKeyChar() > 57){ e.consume(); } } @Override public void keyPressed(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } }