Minesweeper programmieren?

1 Antwort

Ich habe dir jetzt das Programm geschrieben, weil ich absolute Langeweile habe, aber keine Lust auf Fernsehen.

Allerdings möchte ich betonen, dass es normalerweise keine Hilfestellung ohne Ansatz gibt, denn du wärst nicht der erste, der die Gutmütigkeit und Hilfsbereitschaft der Leute auszunutzen versucht, weil du lieber am Wochenende chillen wolltest, statt Hausaufgaben zu machen.

Und solltest du wirklich völlig planlos sein, stellt sich die Frage, ob der Studiengang das Richtige für dich ist. Ansonsten solltest du dringend noch mal die Übungen wiederholen, die du vorher aufbekommen hast.

Denn diese Aufgabe ist zwar nicht besonders anspruchsvoll, aber eben auch keine Aufgabe, die man einem absoluten Anfänger gibt mit 2 Wochen Programmiererfahrung gibt.

Ich habe es möglichst amateurhaft programmiert und mit vielen Kommentaren versehen, damit du dem Code hoffentlich folgen kannst. Und wie vom Prof gewünscht mit Exception-Handling.

public class Minesweeper {
    public static void main(String args[]) {
        Boolean startupcheck = false;
        int x=0;
        int y=0;
        try {
            //Prüfen wir, ob die Feldgrößen (Dimensionen) erlaubt sind (also größer 0)
            x = Integer.parseInt(args[0]);
            y = Integer.parseInt(args[1]);
            if (x>0 && y>0) {
                int produkt = x * y;
                //Nun gucken wir, ob die Anzahl der übrigen Elemente mit der Feldgröße übereinstimmen
                if ((args.length-2)!=produkt) {
                    System.out.println("ERROR: " + produkt + " Felder erwartet, aber " + (args.length-2) + " angegeben.");
                } else {
                    startupcheck = true;
                }
            } else {
                System.out.println("ERROR: Bei den Dimensionen sind nur natürliche Zahlen erlaubt!");
            }
        }
        catch (Exception e) {
            System.out.println("ERROR: Programmaufruf mit keinen oder zu wenigen Argumenten.");
        }
        // Startup Check nicht bestanden? Programm schließen!
        if (startupcheck==false)
            System.exit(1);
        //Prüfen wir jetzt noch ob alle Werte gültig sind (nur 0 und 1 sind erlaubt)
        //kopieren wir die Werte auch direkt in ein zweidimensionales Integer Array
        //Das macht es uns später sehr viel einfacher.
        int temp;
        int[][] felder = new int [y][x];
        int zeile=0;
        int spalte=0;
          //Wir starten die Schleife bei 2, weil die ersten beiden Werte für die Dimensionen des Felds stehen.
          for (int i=2; i<args.length; i++) {
              try {
                  temp = Integer.parseInt(args[i]);
                  if (temp!=0 && temp!=1) {
                      System.out.println("ERROR: Bei der Angabe der Minen sind nur 0 oder 1 erlaubt!");
                      System.exit(1);
                  } else {
                      //Koordinate ermitteln
                      //Das Spiel ist x Felder breit und y Felder hoch
                      //Das erste Feld hat die Koordinate [0|0] das letzte[x-1|y-1]
                      //Wenn also (i-2)%x==0 ist (wobei (i-2)>0 sein muss, da 0 durch irgendwas immer 0 ist, also keinen Rest hat), beginnt eine neue Zeile und die Spalte wird wieder 0
                      if ((i-2)>0 && (i-2)%x==0) {
                          zeile+=1;
                          spalte=0;
                      }
                      felder[zeile][spalte] = temp;
                      spalte+=1;
                  }
              }
            catch (Exception e) {
                System.out.println("ERROR:\n" + e);
                System.exit(1);
            }
        }
        //Wenn er bis hier hin kommt, stimmen alle Übergaben und wir können die Aufgabe bearbeiten
        //Mit der count Variable zählen mir alle Minen die mit dem aktuellen Feld verbunden sind
        int count;
        //Jetzt durchlaufen wir jedes Feld unseres zweidimensionalen Arrays
        try {
            for (int i=0; i<y; i++) {
                for(int j=0; j<x; j++) {
                    //Hier prüfen wir, ob es eine Mine ist, dann brauchen wir nur die -1 ausgeben, wobei ein X viel schöner ist mMn!
                    if (felder[i][j]==1) {
                        System.out.print("X ");
                    } else {
                        //Da es keine Mine war, beginnt der ganze Spaß
                        //Erst resetten wir die count Variable für die Anzahl der benachbarten Minen
                        count=0;
                        //Jetzt müssen wir jedes Feld überprüfen, was eine direkte Verbindung zum aktuellen Feld hat
                        //Dafür haben wir uns das zweidimensionale Array gemacht.
                        //Denn wenn i==0 ist, kann es kein Feld über uns geben
                        //und wenn i+1==y ist, kann es kein Feld mehr unter uns geben.
                        //und wenn j==0 ist, gibt es kein Feld links neben uns
                        //und wenn j+1==x ist, gibt es kein Feld rechts neben uns
                        //Schräg links über uns
                        if (i>0 && j>0 && felder[i-1][j-1]==1)
                            count+=1;
                        //Direkt über uns
                        if (i>0 && felder[i-1][j]==1)
                            count+=1;
                        //Schräg rechts über uns
                        if (i>0 && j+1<x && felder[i-1][j+1]==1)
                            count+=1;
                        //links neben uns
                        if (j>0 && felder[i][j-1]==1)
                            count+=1;
                        //rechts neben uns
                        if (j+1<x && felder[i][j+1]==1)
                            count+=1;
                        //Schräg links unter uns
                        if (i+1<y && j>0 && felder[i+1][j-1]==1)
                            count+=1;
                        //Direkt unter uns
                        if (i+1<y && felder[i+1][j]==1)
                            count+=1;
                        //Schräg rechts unter uns
                        if (i+1<y && j+1<x && felder[i+1][j+1]==1)
                            count+=1;
                        //Wie viele benachbarte Felder sind eine Mine?
                        System.out.print(""+count+" ");
                    }
                }
                //Neue Zeile nach jedem Durchlauf ausgeben, außer für den letzten Durchlauf!
                if (i+1<y)
                    System.out.print("\n");
            }
        }
        catch (Exception e) {
            System.out.println("ERROR: Trotz größter Bemühungen gab es trotzdem einen Crash:\n" + e + "");
        }
    }
}
eyo123227 
Fragesteller
 07.11.2021, 22:02

So erstmal danke, aber deine Ansätze zu meinem Vorhaben sind leider nicht ganz korrekt. Ich lerne so viel wie es geht. Das Problem ist einfach, ich hänge zu sehr hinterher, da ich zu spät immatrikuliert worden bin. Mir wurde erst 2 Wochen nach Studienbeginn bescheid gesagt, dass ich immatrikuliert bin. Ich beschäftige mich gerne mit PCs, möchte aber auch niemanden ausnutzen. Ich hab sogar mir eine Nachhilfe gesucht, da ich an sich Hardware und Software gerne nutze und mich dafür interessiere. Ich danke dir vom ganzen Herzen, dass du sowas gemacht hast, aber das hättest du nicht tun müssen. Ich schätze das sehr, aber mir helfen viel mehr beispielsweise Erklärungen. Wäre nett, wenn du erklären könntest wie du rangegangen bist oder ob man dich irgendwie kontaktieren kann, um fragen zu klären, gegebenenfalls ob man auch Nachhilfe von dir bekommen könnte.

0
eyo123227 
Fragesteller
 07.11.2021, 22:05

Achso habs gerade getestet, bei if (i+1<y && j+<x && felder[i+1][j+1]==1)

                            count+=1;

kommt ein Fehler zustande und funktioniert nicht.

0
GuteAntwort2021  07.11.2021, 22:17
@eyo123227
kommt ein Fehler zustande und funktioniert nicht.

Muss

j+1<x

heißen.

Wäre nett, wenn du erklären könntest wie du rangegangen bist

Wie bei jedem Programm. Ich erkläre dem Computer wie einem Kleinkind, was er tun soll um das Problem zu lösen.

Ansonsten habe ich möglichst viele Kommentare als Erklärung im Code eingebaut. Sie sollten eigentlich erklären, wie ich es angegangen bin.

Setz dich einfach mal hin und versuche mit einem Pseudocode aufzuschreiben, wie du einem Kind erklären würdest, was es tun soll.

Wenn dir aber wirklich jegliches Know How fehlt, dann fang von vorne an und investier massiv Zeit darin den Stoff aufzuholen. Sich jetzt irgendwie an den Aufgaben zu versuchen, obwohl dir jegliche Basics fehlen, hilft dir absolut Null.

Du kannst dich nicht an Algebra versuchen, wenn du nicht mal die Grundrechenarten beherrscht. Oder an einer Textanalyse auf Englisch, wenn dein Wortschatz nur 10 Vokabeln umfasst.

Das ist nicht böse gemeint, einfach nur ein Ratschlag den ich dir geben kann!

1
eyo123227 
Fragesteller
 07.11.2021, 23:33
@GuteAntwort2021

Das ist mir klar aber bei meiner Uni ist es leider so, dass ich die Übungen für die Klausurzulassung machen muss und das finde ich bescheuert. In anderen Universitäten bekommt man für Übungen nur Zusatzpunkte

0
eyo123227 
Fragesteller
 08.11.2021, 06:31
@GuteAntwort2021

ok hab geguckt ob es klappt und bisschen rumprobiert, aber leider steht, dass zu wenig bis gar keine Argumente vorhanden sind.

0
GuteAntwort2021  08.11.2021, 13:27
@eyo123227

Naja, dann hast du wohl zu wenig Argumente übergeben (Leerzeichen vergessen), etc. Du kannst ja mit was einfachem starten: z. B.

2 2 1 0 0 1

Ich hatte es in einem Online Compiler versucht und es lief einwandfrei. Dort bekomme ich bei den gerade genannten Parametern folgende Ausgabe:

X 2 
2 X 

Und wenn ich das Beispiel aus der Aufgabe eingebe:

6 5 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0

bekomme ich

X 2 0 2 X 2 
X 3 0 2 X 2 
X 2 0 2 3 3 
2 3 2 3 X X 
1 X X 3 X 3

Was genau mit dem Beispiel übereinstimmt.

0
GuteAntwort2021  08.11.2021, 13:31
@eyo123227

Du startest das Programm damit. Hast du überhaupt eine Sekunde das Aufgabenblatt gelesen?

java Minesweeper 6 5 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0
0