Informatik: Sudoku mit Java programmieren?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Fang bei A an.

Ich dürfte mich auch damit beschäftigen Programme mit GUI zu erstellen. Dabei bin ich so vorgegangen, dass ich zuerstmal die grundsätzliche Logik erstellt habe.

In deinem Fall wären da die Fragen:

  • Welcher Datentyp?
  • Wie die Einträge generieren
  • Wie Eingaben überprüfen

Meine Idee wäre jetzt erstmal eine Matrix mit Arrays zu schreiben und mich darum zu kümmern, dass diese mit Daten gefüllt werden kann. Die spontane Idee meinerseits wäre sich dafür einfach ein Array mit 8 Werten zu nehmen. Warum 8? Weil eine Zahl in der Ecke eh fest steht. Die anderen würde ich dann zufällig verteilt zuteilen.

Damit haste den ersten Ansatz um eine grundsätzliche Füllung zu erreichen. Anschließend musst du dir nur ein Muster überlegen in dem du generieren willst. Einmal außen an den Ecken lang und n paar in der Mitte sollten passen.

Jetzt kannst du dir überlegen wie du überprüfst ob der Wert der eingetragen werden soll richtig ist. Dazu müsstest du ja prüfen, ob in der Zeile oder der Spalte der Wert bereits auftaucht.

Dazu folgende Idee:

public static boolean testInput(int input, int[][] sudArray){
    for(int i=0;i<sudArray.length;i++){
        if(sudArray[i][2]==input){
            return false;
        }
    }
    for(int j=0;j<sudArray.length;j++){
        if(sudArray[2][j]==input){
            return false;
        }
    }
    return true;
}

So in die Richtung würde ich das aufziehen.

Damit hätteste dann vmtl. ein Sudoku, welches du beispielsweise auf der Konsole schon spielen könntest, wenn du eine entsprechende Ausgabe schreibst.

Jetzt kannst du dir überlegen wie du die GUI aufbauen willst aufgrund deines bisherigen Fortschritts. Ne plumpe Idee meinerseits wäre wohl einfach ein GridView zu nutzen. Die Zahlen die du bereitstellst werden als Label eingetragen durch die entsprechende Datenstruktur. Die Elemente, welche im GridLayout dargestellt werden müssten vmtl. vorher noch in einem Array gespeichert werden, allerdings wird es da n bissl eng mit meinem Wissen (da müsst ich vmtl. selber rumprobieren).

https://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html

Ansonsten noch n kleiner Tipp meinerseits: Bevor du mit der GUI Programmierung anfängst, mal dir einen kleinen Prototypen (also wie soll das Ergebnis aussehen). Dann such danach, was du dafür alles brauchst.

Btw wäre eine andere Möglichkeit das komplette Sudoku einmal zu generieren und dann einfach die Lösung deinerseits mit den eingetragenen Zahlen zu vergleichen. Also hätteste quasi 2 Arrays. Eins als Musterlösung, eins für die Anzeige.


Etter  18.03.2018, 23:51

Und weil regex9 es schon angesprochen hatte noch ein weiterer Tipp: Guck dir an was das MVC-Pattern ist und versuch es einzuhalten.

https://de.wikipedia.org/wiki/Model_View_Controller

Ist verbessert die Wartbarkeit und Übersichtlichkeit des Codes deutlich.

Etter  18.03.2018, 23:57
@Etter

Btw wielange haste Zeit für den Krams? Teil dir die Zeit ein und schreib dir einen groben Zeitplan was wann fertig sein soll/muss. Denk an einen Puffer vor der Abgabe, um etwaige Krankenheiten/Faulheiten oder bis dahin unentdeckte Fehler noch abfangen zu können.

Wenn du noch Anfänger bist, wieso beschäftigst du dich dann bereits mit GUI-Programmierung, für die mehr als die absoluten Grundlagen notwendig sind? Fange erst von vorne an und beschäftige dich mit Swing, wenn du dich mit den Konzepten der OOP in Java anvertraut hast.

Um das Sudoku darzustellen, solltest du dir ein Array anlegen, welches alle Felder abbildet. Wenn ein Feld gesetzt werden soll, musst du alle Abhängigkeiten prüfen, ich würde mir für jede Abhängigkeit (prüfe Reihe/Spalte/3x3-Box) eine Funktion schreiben. Solange die Zahl, die in ein Feld eingetragen werden soll, nicht passt, kann sie auch nicht eingetragen werden.

Bezüglich der Verteilung der festgeschriebenen Werte musst du dir anfangs ein Konzept überlegen. Lasse dir bestenfalls erst ein vollständiges Feld generieren und lösche dann eine bestimmte Anzahl an Werten (für die grafische Oberfläche) aus den Feldern wieder heraus.

Um Zufallszahlen zu generieren, kannst du dir einmal die Methoden der Klasse Math anschauen, ansonsten gibt es auch die Klasse Random.

Wie kriege ich es hin, dass dort Zahlen erscheinen und ich die freien Bearbeiten und anschließend kontrollieren lassen kann ?

Verwende Textfelder, keine Panels.

Das gesamte Programm wird typischerweise in Model, View und Controller unterteilt. Die Grundlagen dazu werden dir aber wohl wie gesagt noch fehlen.


CeceBlck 
Beitragsersteller
 18.03.2018, 17:08

Warum GUI? Weil unser Lehrer von uns erwartet, dies in einem Projekt selbst zu erlernen. Genauso wie das OOP. Werde mir das mit den Textfeldern mal anschauen danke.

regex9  18.03.2018, 17:14
@CeceBlck

Ein JPanel ist Teil einer GUI. Lies dich also auch zu Begriffen wie diesen ein.