Algorithmus Problem in Minesweeper

Crushpest

Mitglied
Hallo zusammen,

nach Tagen des Verzweifelns, hab ich mich entschloßen hier um hilfe zu bitten. Mein Problem:
Ich schreibe an einem Minesweeper und habe mir hierfuer einen Algorithmus ausgedacht, mit dem ich alle leeren Felder um das geklickte Feld aufdecke, wenn dieses auch leer ist.
Bei einer Feldgröße von 10x10 ist das kein problem:
minesweeper10x10.png


Jedoch, sobald der Index im Array 2-stellig wird geht das nichtmehr. Also bei einer Feldgröße ab 11x11 passiert das:
minesweeper11x11.png


Hier der Quellcode:
Minesweeper.java
Feld.java

Ich glaube es liegt irgendwo in diesem Bereich:
Minesweeper.java
[JAVA=300]
private void leerAufdecken(Point point){
Point tmp = null;
//<editor-fold defaultstate="collapsed" desc="Von dir Geklaut :p">
for (int i = -1; i < 2; i++) {
for (int j = -1; j < 2; j++) {
tmp = new Point(point.x+i, point.y+j);
if (!outOfBound(tmp) && !pruefListe.contains(tmp)) {
pruefListe.add(tmp);
}
}
}
//</editor-fold>
for(Point p : pruefListe){
if(spielFeld[p.x][p.y].aufdecken() == FeldStatus.LEER){//Hier eigentlich minenAnzeige hochzählen, da eventuell schon entschaerft gewesen
leerAufdecken(p);
break;
}
}
pruefListe.clear();
}
[/code]

Feld.java
[JAVA=47]
public FeldStatus aufdecken() {
if (status == FeldStatus.ZU) {
if (minenAußenrum == 0) {
status = FeldStatus.LEER;
} else if (mine) {
this.setBackground(hintergrundGrau);
this.setIcon(bildMinen);
} else {
this.setIcon(null);//Hier eigentlich minenAnzeige hochzählen, da eventuell schon entschaerft gewesen
this.setBackground(hintergrundGrau);
this.setText("" + minenAußenrum + "");
status = FeldStatus.OFFEN;
}
} else if (status == FeldStatus.LEER) {
this.setIcon(null);//Hier eigentlich minenAnzeige hochzählen, da eventuell schon entschaerft gewesen
this.setBackground(hintergrundGrau);
status = FeldStatus.OFFEN;
}
return status;
}
[/code]

Ich hoffe einer von euch kann mir weiterhelfen. Es kommen keine Kompielerfehler oder Exceptions! Also muss es was mit der Logik zu tun haben. Ich bin am Verzweifeln :( !

Das ganze Projekt ist in Netbeans geschrieben. Downloaden kann man es hier:
http://rapidshare.com/files/444891587/Minesweeper.zip
 

XHelp

Top Contributor
Sind doch jeweils 10x10 Felder. Also ich konnte den Bug gerade nicht nachstellen, aber bei mir funktioniert das ganze eh nicht ganz deterministrisch. Manchmal muss mal 5 mal klicken, bis sich was öffnet.
Bau eine Möglichkeit ein die Spielkonfiguration bzw. Konstelation der Minen abzuspeichern und wieder zu laden. Dann spiele solange, bis der Fehler auftritt, dann kann man den nachstellen und genauer überprüfen. Ansonsten könnten noch Debugausgaben helfen.
 

Crushpest

Mitglied
K danke erstmal fuer den Hinweiß, das es immer 10x10 felder sind. Das hatte ich bisher garnicht bemerkt, da ich die feldgroeße im code verändert habe. Werd mich morgen nochmal dransetzten.
 

XHelp

Top Contributor
So auf den ersten Blick ist bei dir die spielFeldErzeugen-Methode falsch:
[JAVA=193]
private void spielFeldErzeugen() {
minenLegen();
panelCenter.removeAll();
panelCenter.setLayout(new GridLayout(schwierigkeitsgrad, schwierigkeitsgrad));
for (int i = 0; i < schwierigkeitsgrad; i++) {
for (int j = 0; j < schwierigkeitsgrad; j++) {
spielFeld[j].setMinenAußenrum(this.wievielMinenUmDasFeld(i, j));
panelCenter.add(spielFeld[j]);
}
}
this.repaint();
}
[/code]
Sollte eher nicht bis
Code:
schwierigkeitsgrad
gehen, sondern über das gesamte Spielfeld-Array.
 

Marco13

Top Contributor
Jaaaa.... das ist ja gar nicht mal so übersichtlich :autsch: Also, ich hab' jetzt eine Weile versucht, nachzuvollziehen, was da passiert, aber ... Hm.

Auch bei 10 Minen tritt manchmal das Problem auf, dass er Minenfelder aufdeckt. Ich wollte die Größe auf 9 reduzieren, aber irgendwas, was vermutlich mit solchen Sachen wie
... schwierigkeitsgrad * (schwierigkeitsgrad / 10)...
zusammenhängt, bewirkt dann, dass er 0 minen verteilt.

Ich habe jetzt mal
Code:
private void leerAufdecken(Point point){
        [b]System.out.println("Decke auf "+point);[/b]
und
Code:
    public FeldStatus aufdecken() {
        if (status == FeldStatus.ZU) {
            if (minenAußenrum == 0) {
                status = FeldStatus.LEER;
            } else if (mine) {
                [B]System.out.println("Decke "+point+" auf, mit mine!");[/B]
                this.setBackground(hintergrundGrau);
                this.setIcon(bildMinen);
...
eingefügt, und ... ja, er deckt eben die Felder mit minen auf, obwohl das bei "leerAufdecken" anfängt - aber ehrlich gesagt hat sich mir noch nicht erschlossen, warum er überhaupt manche Felder NICHT aufdeckt...

Als kleiner Tipp: Math.random() sollte man IMHO nie verwenden. Es macht debugging unmöglich. Du weißt nie, wo die Minen liegen, und kannst es nicht Systematisch testen. Mach' dir stattdessen in der Klasse ein
Code:
private static final Random random = new Random(0);
und rufe da, wo du bisher sowas machst wie
Code:
randomX = (int) (Math.random() * schwierigkeitsgrad);
in Zukunft
Code:
randomX = random.nextInt(schwierigkeitsgrad);
auf. Das Random-Objekt liefert immer die gleiche Folge von Zufallszahlen, abhängig von der Zahl die im Konstruktor übergeben wird (hier die 0). Wenn es "echt" zufällig sein soll, erstellt man ein Random() (ohne Parameter).

Ansonsten ... GUI und Modell zu trennen wäre ein bißchen viel verlangt. Sprechendere Variablennamen und so wären vielleicht nicht verkehrt. Und dann noch "Details": In der leerAufdecken-Methode wird die pruefListe verwendet. Und NUR da. Also sollte sie auch nicht als Variable oben in der Klasse stehen, sondern NUR da erstellt werden, wo sie gebraucht wird:
Java:
class Minesweeper extends JFrame {
....
    // WEG private List<Point> pruefListe = new ArrayList<Point>(); //Fuer Aufdeck-Algorithmus



    private void leerAufdecken(Point point){

        List<Point> pruefListe = new ArrayList<Point>() // HIN
...

        // Kann dann auch weg: pruefListe.clear();
    }
Ganz allgemein: Den Gültigkeitsbereich von Variablen so klein wie möglich halten.


Ich hatte auch mal so ein Programm geschrieben. Bei mir hieß das natürlich "MeinSweeper" :D . Die Methode zum aufdecken der Felder hatte ich rekursiv gemacht, im Pseudocode war das GROB sowas wie
Java:
void open(int x, int y)
{
    if (outOfBounds(x,y)) return;
    if (statusOf(x,y)==OPEN) return;
    changeStatusTo(x,y,OPEN);
    if (hasNeighborsWithMines(x,y)) return; 
    open(x-1,y);
    open(x+1,y);
    open(x,y-1);
    open(x,y+1);
}
 

Crushpest

Mitglied
Danke fuer die super schnelle und gute Rueckmeldung. Das problem lag an der spielFeldErzeugen() methode. Jetzt funktioniert es einigermaßen. Ansonsten werd ich die hier vorgeschlagenen veränderungen noch übernehmen.
Sonst wäre vielleicht ein tip fuer die uebersichtlichkeit und variablennamen vergebung ganz praktisch. Oder was euch sonst noch auffällt, was man besser machen koennte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
B Algorithmus - Project Euler Problem 18 Allgemeine Java-Themen 2
V Problem mit A* Pathfinder-Algorithmus Allgemeine Java-Themen 2
S Algorithmus Problem. Rechtecke effizient auf Spielfeld anordnen. Allgemeine Java-Themen 7
P Problem mit A*-Algorithmus Allgemeine Java-Themen 12
G Problem mit Algorithmus Allgemeine Java-Themen 3
T Problem RSA-Algorithmus in Java? Allgemeine Java-Themen 2
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
schegga_B AES-Algorithmus in javax.crypto Allgemeine Java-Themen 3
M Laufzeit des Prim Algorithmus Allgemeine Java-Themen 3
O Newton Algorithmus Java Allgemeine Java-Themen 1
CptK Backpropagation Algorithmus Allgemeine Java-Themen 6
N Google Authenticator Algorithmus (SHA1) Allgemeine Java-Themen 1
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
Zrebna Quicksort-Algorithmus - zufälliges Pivot wählen Allgemeine Java-Themen 6
B Algorithmus Warteschlange Ringpuffer wirklich fehlerfrei Allgemeine Java-Themen 8
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
F Q - Learning Algorithmus Bug Allgemeine Java-Themen 4
M Minmax Algorithmus Verständnisproblem Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
F KMP-Algorithmus Allgemeine Java-Themen 9
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
P MinMax Algorithmus Allgemeine Java-Themen 0
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
K Djikstra-Algorithmus Allgemeine Java-Themen 1
T Minimax/Alphabeta Algorithmus hängt sich auf (?) Allgemeine Java-Themen 2
M Algorithmus zum Zahlen einteilen Allgemeine Java-Themen 8
O Best Practice Hilfe bei Algorithmus gesucht Allgemeine Java-Themen 10
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
S Rucksackproblem und genetischer Algorithmus Allgemeine Java-Themen 9
L Abbruch des Algorithmus Allgemeine Java-Themen 8
D Input/Output Ausgleichen chemischer Reaktionsgleichungen mit dem Gauß-Algorithmus Allgemeine Java-Themen 2
Messoras A*-Algorithmus integrieren Allgemeine Java-Themen 3
S Buchscan 3D Dewarp Algorithmus - Ansätze Allgemeine Java-Themen 1
B Verteilungs-/Vergabe-Algorithmus mit abhängigen Score-Werten Allgemeine Java-Themen 3
Androbin "Shunting Yard"-Algorithmus Allgemeine Java-Themen 6
N Algorithmus zum bewerten von mathematischen Funktionen Allgemeine Java-Themen 11
O Algorithmus Optimierung Allgemeine Java-Themen 3
Joew0815 Algorithmus - Zahlenfolge in 4 ähnliche Teile aufteilen Allgemeine Java-Themen 0
O Tag Cloud Algorithmus Idee gesucht Allgemeine Java-Themen 2
A Implementierung eines Algorithmus (Farthest Insertion zur Lösung des TSP) in O(n²) Allgemeine Java-Themen 2
C Eclipse Probleme bei selbst erstelltem Algorithmus Allgemeine Java-Themen 2
H Graph-Algorithmus gesucht Allgemeine Java-Themen 21
N Algorithmus durch Workflow Allgemeine Java-Themen 7
M tree-based diff Algorithmus (Code-Vergleiche) Allgemeine Java-Themen 3
S Uhrzeit Algorithmus sale Allgemeine Java-Themen 11
N A*-Algorithmus Allgemeine Java-Themen 5
A Suche Algorithmus zum Erstellen eines planaren Graphen Allgemeine Java-Themen 5
F Methoden Algorithmus zur Gegnerfindung (Turnier) Allgemeine Java-Themen 9
T Algorithmus Graph Allgemeine Java-Themen 10
J Algorithmus gesucht (Stringtransformation) Allgemeine Java-Themen 4
B Algorithmus Krankenhausbelegung Allgemeine Java-Themen 17
S Algorithmus von Dijkstra Allgemeine Java-Themen 2
alex_fairytail OOP Banknoten Algorithmus Teil 2 Allgemeine Java-Themen 13
2 ArrayList aktualisieren Algorithmus Allgemeine Java-Themen 11
alex_fairytail Methoden Banknoten Algorithmus Allgemeine Java-Themen 10
R Codehinweise: Algorithmus Größenvergleich von n Zahlen Allgemeine Java-Themen 5
SuperSeppel13 WTF?! Algorithmus-Geschwindigkeitstest Allgemeine Java-Themen 2
L Algorithmus für kürzesten Weg mit Wegpunkten Allgemeine Java-Themen 21
S Algorithmus um Labyrinth zu erzeugen Allgemeine Java-Themen 6
S Algorithmus um nächst folgende Primzahl zu berechnen Allgemeine Java-Themen 7
C Algorithmus-Hilfe Allgemeine Java-Themen 20
J Algorithmus Längenkombinationen? Allgemeine Java-Themen 7
M Kombinationen über rekursiven Algorithmus berechnen? Allgemeine Java-Themen 10
L Algorithmus für Poker-Hände Allgemeine Java-Themen 7
chik 2 return werte für Greedy-Algorithmus (gelöst) Allgemeine Java-Themen 3
D Abstruse Probleme mit eigenem replace Algorithmus Allgemeine Java-Themen 11
P RC4 Algorithmus Allgemeine Java-Themen 3
D RSA Verfahren - Erweiterter Euklidischer Algorithmus Allgemeine Java-Themen 4
C IBAN und Bic Validieren (Algorithmus) Allgemeine Java-Themen 10
M Wörter Algorithmus Allgemeine Java-Themen 7
M Algorithmus für automatische Zeilenumbrüche Allgemeine Java-Themen 12
K Postleitzahlen Algorithmus Allgemeine Java-Themen 12
T Hilfe bei einem Algorithmus Allgemeine Java-Themen 2
S Stemming-Algorithmus gesucht (z.B. Porter) Allgemeine Java-Themen 2
RoliMG präfix zu infix algorithmus Allgemeine Java-Themen 6
Z A*-Algorithmus - Probleme mit offener/geschlossener Liste Allgemeine Java-Themen 7
S Javaimplementierung des MD5 Algorithmus Allgemeine Java-Themen 2
E Container-Pack-Algorithmus Allgemeine Java-Themen 4
G k nearest neighbor algorithmus Allgemeine Java-Themen 7
C HASH Algorithmus 2 Strings ergeben das Selbe. Allgemeine Java-Themen 2
P Page Rank Algorithmus implementieren Allgemeine Java-Themen 7
minzel Hash-Algorithmus Allgemeine Java-Themen 9
Y komprimierung mittels Huffman-Algorithmus, bit-shifting. Allgemeine Java-Themen 2
K Algorithmus Allgemeine Java-Themen 10
C Algorithmus für Array Allgemeine Java-Themen 9
I Verschlüsselung mit Pwd. - User soll Algorithmus wählen Allgemeine Java-Themen 4
J fällt euch ein Algorithmus ein? Allgemeine Java-Themen 4
S Algorithmus für Sudoku Allgemeine Java-Themen 17
N Euklidischer Algorithmus in Java und keine Terminierung. Allgemeine Java-Themen 7
F Algorithmus für Sortierung gesucht Allgemeine Java-Themen 15
T Algorithmus verbessern Allgemeine Java-Themen 10
U Suche Algorithmus zur bestimmung des längsten Wegs Allgemeine Java-Themen 3
U Ford-Fulkerson Algorithmus gesucht Allgemeine Java-Themen 1
U Dijkstra Algorithmus gesucht Allgemeine Java-Themen 4
D Algorithmus für die Erkennung fehlerhafter Eingaben Allgemeine Java-Themen 4
I hash-algorithmus Allgemeine Java-Themen 9
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben