GUI-Programmierung Sudoku-Rätsel lösen

Hallo Leute,

ich bin absoluter Neuling in Sachen Java. Habe schon ein paar Anläufe gehabt, Java zu verstehen, aber es scheiterte immer an der Objektorientierten Programmierung. Ich komme aus der iterativen Programmierung und bin es gewohnt riesige Programme in RPG IV zu schreiben (ein Dinosaurier halt).

Nun habe ich mir als Java-Projekt ein Programm ausgedacht, um ein Sudoku-Rätsel zu lösen. Ich will ein leeres Spiel-Feld haben, in welches ich die Sudoku-Zahlen aus einer Zeitung eingebe. An den Rändern der leeren Felder sollen die für das jeweilige Feld möglichen Zahlen erscheinen. Ich will dann eine Routine bauen, die das komplette Sudoku-Rätsel automatisch löst.

Ich scheitere schon beim einfachen Spielfeldaufbau. Natürlich könnte ich jetzt alle 81 Felder des Spielfeldes im riesigen Konstruktor definieren. Das finde ich aber zu umständlich. Mir schwebt eine eigene Klasse für ein einzelnes Zahlenfeld vor. Diese will ich dann auf dem Spielfeld positionieren, indem ich die x- und y-Positionen als Parameter übergebe. Und dann soll der Konstruktor alle 81 Felder in einem Rutsch platzieren. Und bei jedem Feld sollen die 9 Zahlen-Labels automatisch mit platziert werden.

Mein bisheriger Code sieht so aus:
Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.GridLayout;
import javax.swing.JTextField;
import javax.swing.JInternalFrame;
import javax.swing.JSplitPane;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.SwingConstants;

public class SudokuFrame extends JFrame {

    private JPanel contentPane;
    private JTextField textField00;
    private JTextField textField01;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    SudokuFrame frame = new SudokuFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     * Constructor
     */
    public SudokuFrame() {
        setTitle("Sudoku Machine");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1267, 711);
        contentPane = new JPanel();
        contentPane.setVisible(false);
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        JPanel pnlButtons = new JPanel();
        pnlButtons.setBounds(5, 5, 1235, 39);
        contentPane.add(pnlButtons);
        
        JButton btnClearFields = new JButton("Felder löschen");
        pnlButtons.add(btnClearFields);
        
        JButton btnSolveSudoku = new JButton("Sudoku lösen");
        pnlButtons.add(btnSolveSudoku);
        
        textField00 = new JTextField();
        textField00.setHorizontalAlignment(SwingConstants.CENTER);
        textField00.setFont(new Font("Tahoma", Font.PLAIN, 36));
        textField00.setBounds(188, 118, 50, 50);
        contentPane.add(textField00);
        textField00.setColumns(1);
        
        JLabel lblField00_1 = new JLabel("1");
        lblField00_1.setHorizontalAlignment(SwingConstants.RIGHT);
        lblField00_1.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField00_1.setBounds(169, 148, 14, 20);
        contentPane.add(lblField00_1);
        
        JLabel lblField00_2 = new JLabel("2");
        lblField00_2.setHorizontalAlignment(SwingConstants.RIGHT);
        lblField00_2.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField00_2.setBounds(169, 133, 14, 20);
        contentPane.add(lblField00_2);
        
        JLabel lblField00_3 = new JLabel("3");
        lblField00_3.setHorizontalAlignment(SwingConstants.RIGHT);
        lblField00_3.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField00_3.setBounds(169, 117, 14, 20);
        contentPane.add(lblField00_3);
        
        JLabel lblField00_4 = new JLabel("4");
        lblField00_4.setHorizontalAlignment(SwingConstants.RIGHT);
        lblField00_4.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField00_4.setBounds(186, 96, 14, 20);
        contentPane.add(lblField00_4);
        
        JLabel lblField00_5 = new JLabel("5");
        lblField00_5.setHorizontalAlignment(SwingConstants.RIGHT);
        lblField00_5.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField00_5.setBounds(202, 96, 14, 20);
        contentPane.add(lblField00_5);
        
        JLabel lblField00_6 = new JLabel("6");
        lblField00_6.setHorizontalAlignment(SwingConstants.LEFT);
        lblField00_6.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField00_6.setBounds(225, 96, 14, 20);
        contentPane.add(lblField00_6);
        
        JLabel lblField00_7 = new JLabel("7");
        lblField00_7.setHorizontalAlignment(SwingConstants.LEFT);
        lblField00_7.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField00_7.setBounds(242, 117, 14, 20);
        contentPane.add(lblField00_7);
        
        JLabel lblField00_8 = new JLabel("8");
        lblField00_8.setHorizontalAlignment(SwingConstants.LEFT);
        lblField00_8.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField00_8.setBounds(242, 133, 14, 20);
        contentPane.add(lblField00_8);
        
        JLabel lblField00_9 = new JLabel("9");
        lblField00_9.setHorizontalAlignment(SwingConstants.LEFT);
        lblField00_9.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField00_9.setBounds(242, 148, 14, 20);
        contentPane.add(lblField00_9);
        
        textField01 = new JTextField();
        textField01.setHorizontalAlignment(SwingConstants.CENTER);
        textField01.setFont(new Font("Tahoma", Font.PLAIN, 36));
        textField01.setColumns(1);
        textField01.setBounds(290, 118, 50, 50);
        contentPane.add(textField01);
        
        JLabel lblField01_1 = new JLabel("1");
        lblField01_1.setHorizontalAlignment(SwingConstants.RIGHT);
        lblField01_1.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField01_1.setBounds(271, 148, 14, 20);
        contentPane.add(lblField01_1);
        
        JLabel lblField01_2 = new JLabel("2");
        lblField01_2.setHorizontalAlignment(SwingConstants.RIGHT);
        lblField01_2.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField01_2.setBounds(271, 133, 14, 20);
        contentPane.add(lblField01_2);
        
        JLabel lblField01_3 = new JLabel("3");
        lblField01_3.setHorizontalAlignment(SwingConstants.RIGHT);
        lblField01_3.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField01_3.setBounds(271, 117, 14, 20);
        contentPane.add(lblField01_3);
        
        JLabel lblField01_4 = new JLabel("4");
        lblField01_4.setHorizontalAlignment(SwingConstants.RIGHT);
        lblField01_4.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField01_4.setBounds(288, 96, 14, 20);
        contentPane.add(lblField01_4);
        
        JLabel lblField01_5 = new JLabel("5");
        lblField01_5.setHorizontalAlignment(SwingConstants.RIGHT);
        lblField01_5.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField01_5.setBounds(304, 96, 14, 20);
        contentPane.add(lblField01_5);
        
        JLabel lblField01_6 = new JLabel("6");
        lblField01_6.setHorizontalAlignment(SwingConstants.LEFT);
        lblField01_6.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField01_6.setBounds(327, 96, 14, 20);
        contentPane.add(lblField01_6);
        
        JLabel lblField01_7 = new JLabel("7");
        lblField01_7.setHorizontalAlignment(SwingConstants.LEFT);
        lblField01_7.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField01_7.setBounds(344, 117, 14, 20);
        contentPane.add(lblField01_7);
        
        JLabel lblField01_8 = new JLabel("8");
        lblField01_8.setHorizontalAlignment(SwingConstants.LEFT);
        lblField01_8.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField01_8.setBounds(344, 133, 14, 20);
        contentPane.add(lblField01_8);
        
        JLabel lblField01_9 = new JLabel("9");
        lblField01_9.setHorizontalAlignment(SwingConstants.LEFT);
        lblField01_9.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lblField01_9.setBounds(344, 148, 14, 20);
        contentPane.add(lblField01_9);
    }
}
Ich stelle mir für den Konstruktor in etwa so etwas vor:
Java:
public SudokuFrame() {
    /**
     * Zuerst die Panels und die Buttons definieren
     */
    
    /**
     * Und jetzt die Felder setzen
     */
    SudokuField[0].setPosition(188, 118);
    SudokuField[1].setPosition(290, 118);
        // ...
    SudokuField[80].setPosition(xPosition, yPosition);
}
Aber wie schreibe ich so eine Klasse? Vielleicht könnt ihr mir ja weiterhelfen.

Ich programmiere übrigens mit Eclipse 2019-12 und als GUI-Erweiterung nutze ich WindowBuilder 1.9.1.

Schöne Grüße
Artur
 
Fang am besten mit dem Modell an und schreib das Programm erstmal ohne GUI. Zum Testen kannst Du z. B. Textdateien verwenden, in die Du das Sudoku schreibst.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben