2D Array eingabe vom Benutzer

Hamudi Bachir

Hamudi Bachir

Mitglied
Für ein Hochschul projekt brauch ich für das bekannte spiel des Lebens eine benutzerdefinierte eingabe für die große des Spiel felds.

Das ganze in einem 2D Array. Ich habe meine Code angefangen zu schreiben und die eingabe funktioniert aber es kommt eine fehlermeldung mit der ich nix anfangen kann.

Der code:


import java.util.Scanner ;


public class Main {

public static void main(String[] args) {

// Begrüßung/ Erklärung/Regeln vom Spiel

System.out.println("Willkommen bei dem Simulationsspiel Spiel des Lebens.");
System.out.println("Das Spiel des Lebens ist eine einfache Simulation von Wachstumsprozessen.");


// Eingabe vom Benutzer für die Größe des Spielfelds in einem 2D Array

Scanner sc = new Scanner (System.in);

System.out.println("Bitte geben sie die Zeilen anzahl des Spielfeldes ein. ");
int i = sc.nextInt() ;
System.out.println("Bitte geben sie die Spalten anzahl des Spielfelds ein.");
int j= sc.nextInt() ;

int Spielfeld [][] = new int [j] ;


for (i=0; i<Spielfeld.length; i++){

for (j=0; i<Spielfeld.length; j++)

System.out.println(Spielfeld[j]);
}



}

}

Fehlermeldung :
Screenshot (29).png
 
temi

temi

Top Contributor
Wenn du Englisch kannst ist die Aussage doch eindeutig: Du versuchst auf einen Index des Arrays zuzugreifen, den es nicht gibt.

Verwende für Code bitte die Code-Tags (</> im Editor). [i] wird sonst als kursiv interpretiert und fehlt damit im gezeigten Code.

Ansonsten, schau dir mal deine Schleifenbedingungen genau an.
 
kneitzel

kneitzel

Top Contributor
Also erst einmal wäre es super, denn Du Code in Code-Tags schreiben würdest. Das geht am einfachsten über den Knopf </> oberhalb der Eingabe.
Sonst wird z.B. das [i] als Start einer rekursiven Darstellung gewertet.

Daher sehe ich jetzt erst einmal nicht das Problem bei Deinem Code. Kernaussage der Fehlermeldung ist, dass Du auf Index 5 zugreifst von einem Array, das nur 5 Felder groß ist (Index von 0 bis 4).

Aber die Schleife besagt auch sauber, dass es jeweils < ist.
 
Hamudi Bachir

Hamudi Bachir

Mitglied
Also erst einmal wäre es super, denn Du Code in Code-Tags schreiben würdest. Das geht am einfachsten über den Knopf </> oberhalb der Eingabe.
Sonst wird z.B. das [i] als Start einer rekursiven Darstellung gewertet.

Daher sehe ich jetzt erst einmal nicht das Problem bei Deinem Code. Kernaussage der Fehlermeldung ist, dass Du auf Index 5 zugreifst von einem Array, das nur 5 Felder groß ist (Index von 0 bis 4).

Aber die Schleife besagt auch sauber, dass es jeweils < ist.

Wenn du Englisch kannst ist die Aussage doch eindeutig: Du versuchst auf einen Index des Arrays zuzugreifen, den es nicht gibt.

Verwende für Code bitte die Code-Tags (</> im Editor). [i] wird sonst als kursiv interpretiert und fehlt damit im gezeigten Code.

Ansonsten, schau dir mal deine Schleifenbedingungen genau an.
Danke erstmal.
Hier der Code nochmal als Scrennshot. Dann weiß ich für das nächste mal mit der Eingabe bescheid.

Also mein Problem hab ich jetzt nicht wirklich gefunden. Ich habe versucht das der Benutzer eine Eingabe tätigt für ein Spielfeld. Nach der Eingabe wird halt das Spielfeld in einem 2D array erstellt.

"Halten Sie die Größe des Spielfelds flexibel, indem Sie die Zahl der Zeilen und Spalten als symbolische Konstanten definieren. Sehen Sieauch eine Möglichkeit vor, die Ausgangsbedingung zufällig zu erzeugen" <- Der teil der aufgaben Stellung.
Screenshot (30).png
 
temi

temi

Top Contributor
Ansonsten noch ein Tipp: Variablennamen mit einem Buchstaben, wie "i" sind für Schleifenvariablen i.d.R. in Ordung, aber gerade bei mehrdimensionalen Arrays führen sie häufig zu Verwirrung. Besser wäre es aussagekräftige Namen wie "zeile" und "spalte" zu nehmen. Dann muss man nicht so viel denken. ;)
 
Hamudi Bachir

Hamudi Bachir

Mitglied
Ansonsten noch ein Tipp: Variablennamen mit einem Buchstaben, wie "i" sind für Schleifenvariablen i.d.R. in Ordung, aber gerade bei mehrdimensionalen Arrays führen sie häufig zu Verwirrung. Besser wäre es aussagekräftige Namen wie "zeile" und "spalte" zu nehmen. Dann muss man nicht so viel denken. ;)
Klingt viel besser. Danke !
 
Hamudi Bachir

Hamudi Bachir

Mitglied
Ganz genau ansehen!
Kann es sein das ich in den Zeilen 26 und 28 nach der Eingabe die Eingabe sozusagen wieder auf 0 zurück setzte ?

hier der Code richtig eingefügt hoffe ich mal :D

Java:
import java.util.Scanner ;


public class Main {

    public static void main(String[] args) {
            
        // Begrüßung/ Erklärung/Regeln vom Spiel
        
        System.out.println("Willkommen bei dem Simulationsspiel Spiel des Lebens.");
        System.out.println("Das Spiel des Lebens ist eine einfache Simulation von Wachstumsprozessen.");
    
        
        // Eingabe vom Benutzer für die Größe des Spielfelds in einem 2D Array
        
        Scanner sc = new Scanner (System.in);
        
        System.out.println("Bitte geben sie die Zeilen anzahl des Spielfeldes ein. ");
        int zeilen = sc.nextInt() ;
        System.out.println("Bitte geben sie die Spalten anzahl des Spielfelds ein.");
        int spalten = sc.nextInt() ;
        
        int Spielfeld [][] = new int [zeilen][spalten] ;
        
        
                    for (zeilen =0; zeilen<Spielfeld.length; zeilen++){         
                    
                        for (spalten =0; spalten <Spielfeld[i].length; spalten++)
                            
                                System.out.println(Spielfeld[zeilen][spalten]);
        }
        
        
        
    }

}
 
temi

temi

Top Contributor
Kann es sein das ich in den Zeilen 26 und 28 nach der Eingabe die Eingabe sozusagen wieder auf 0 zurück setzte ?
Ja, das ist so, weil du die Variablen sozusagen mehrfach verwendest. Nicht super, aber auch nicht schlimm, weil das Array ja bereits erzeugt wurde und die Variablen nicht mehr gebraucht wurden.
 
temi

temi

Top Contributor
Der Fehler ist gefunden aber wenn ich jetzt 26 = : Zeilen = 0 ; raus lösche muss ich zeilen dann irgendwie als eingabe vom benutzer da irgendwie deffinieren?
Ich verstehe die Frage nicht. Warum willst du in Zeile 26 etwas löschen?

Und dann war da noch: In Java gibt es Konventionen. Klassennamen beginnen mit einem Großbuchstaben und Variablen-, sowie Methodennamen mit einem Kleinbuchstaben. Demnach "Spielfeld" => "spielfeld". Es ist sinnvoll sich daran zu halten, dann tun sich alle leichter, den Code zu lesen.
 
Hamudi Bachir

Hamudi Bachir

Mitglied
Ich verstehe die Frage nicht. Warum willst du in Zeile 26 etwas löschen?
Hab meine Fehler gefunden und hat es hat funktioniert danke. Wenn der Benutzer 5 x 5 eingibt gebt mir die Console 26 mal die 0 raus weil noch nix im array gespeichert ist.

Ich hätte noch eine weitere frage was genau mit n x m Zellen gemeint ist.

Aufgabenstellung :

"Die Simulation erfolgt typischerweise auf einem zweidimensionalen Spielfeld mit n x m Zellen."

Soll es heißen das das Array im Aufbau so aussehen soll? und n und m sozusagen dann die zeilen und spalten sind?
 
Hamudi Bachir

Hamudi Bachir

Mitglied
Ja, gibt es natürlich. Du musst es halt anders ausgeben.

Die Spalten ohne Zeilenumbruch mit print() und für die Zeilen dann einen Zeilenumbruch mit println().
Ich habe jetzt weiter dran gearbeitet und versucht die arrays mit jeweils 0 und 1 zu füllen für tote oder lebende zelle.

In den Zeilen 39 und 41 zeigt er mir an das die variablen sich doppeln aber ich benutze die doch für das selbe oder?

funktioniert meine variante mit der zufalls genaration von 0 und 1 so überhaupt?


math random:
import java.util.Scanner ;



public class Main {

    public static void main(String[] args) {
            
        // Begrüßung
        
        System.out.println("Willkommen bei dem Simulationsspiel Spiel des Lebens.");
        System.out.println("Das Spiel des Lebens ist eine einfache Simulation von Wachstumsprozessen.");
    
        
        // Eingabe vom Benutzer für die Größe des Spielfelds in einem 2D Array
        
        Scanner sc = new Scanner (System.in);
        
        System.out.println("Bitte geben sie die Zeilen anzahl des Spielfeldes ein. ");
        int zeilen = sc.nextInt() ;
        System.out.println("Bitte geben sie die Spalten anzahl des Spielfelds ein.");
        int spalten = sc.nextInt() ;
        
        
        // Array erstellt mit Eingabe vom Benutzer
        
        int Spielfeld [][] = new int [zeilen][spalten] ;
        
        
                    for (zeilen =0; zeilen<Spielfeld.length; zeilen++){         
                    
                        for (spalten =0; spalten <Spielfeld[zeilen].length; spalten++)
                            
                            System.out.print(Spielfeld[zeilen][spalten]);
                            
                                // Zufällig 0 und 1 in array einspeichern
                            
                    
                           for(int zeilen = 0; zeilen<Spielfeld.length; zeilen++){
                              
                               for(int spalten = 0; spalten<Spielfeld[0].length; spalten++){
                                  
                                   Spielfeld[zeilen][spalten] = Math.round(Math.random());
                               }
                           }   
                        
                        
                            
                    
        }
        
      
                    
        
    }

}
 
kneitzel

kneitzel

Top Contributor
Du deklarierst die Variable aber erneut. Du kannst keine zwei lokalen Variablen mit dem gleichen Namen haben.

Wenn Du die Variable von oben erneut verwenden willst, dann, dann lass das int weg. Aber dieses Variablen mehrfach benutzen ist ein Unding, das man nicht machen sollte! Das führt automatisch zu Problemen - so wie bei Dir, denn du hast die Schleifen ja verschachtelt - Du wirst in der inneren Schleife mit "zeile" ja nicht die Schleifenvariable zeile der äußeren Schleife überschreiben wollen ...

Und dann ein Tipp, den Du Dir zu Herzen nehmen solltest: Teile es in Methoden auf! Du verzettelst Dich ganz offensichtlich total. Eine so tiefe Verschachtelung ist einfach unleserlich und wenn erfahrene Entwickler sowas vermeiden: Was meinst Du, das Du einen besseren Überblick hast?
 
Hamudi Bachir

Hamudi Bachir

Mitglied
Du deklarierst die Variable aber erneut. Du kannst keine zwei lokalen Variablen mit dem gleichen Namen haben.

Wenn Du die Variable von oben erneut verwenden willst, dann, dann lass das int weg. Aber dieses Variablen mehrfach benutzen ist ein Unding, das man nicht machen sollte! Das führt automatisch zu Problemen - so wie bei Dir, denn du hast die Schleifen ja verschachtelt - Du wirst in der inneren Schleife mit "zeile" ja nicht die Schleifenvariable zeile der äußeren Schleife überschreiben wollen ...

Und dann ein Tipp, den Du Dir zu Herzen nehmen solltest: Teile es in Methoden auf! Du verzettelst Dich ganz offensichtlich total. Eine so tiefe Verschachtelung ist einfach unleserlich und wenn erfahrene Entwickler sowas vermeiden: Was meinst Du, das Du einen besseren Überblick hast?
Also ich habe gedacht das ich um die arrays mit 0 und 1 zu füllen zufällig wieder die gleiche variable nehmen muss. Könnte ich also eine andere variable deklarien und die dann in das array speichern?

Wie genau ist es gemeint es in Methoden aufzuteilen ? Ich merke es auch das ich mich sehr verzettelte. Danke schonmal für die Hilfe.
 
temi

temi

Top Contributor
Wie genau ist es gemeint es in Methoden aufzuteilen ?
Du könntest z. B. eine Methode ausgeben(int[][] feld) schreiben, die nur für die Ausgabe zuständig ist, also das, was du in den ersten beiden verschachtelten Schleifen gemacht hat. Innerhalb dieser Methoden kannst du, falls erforderlich, die gleichen Bezeichnungen für die Variablen verwenden, weil es sich um andere, lokale Variablen handelt.

Java:
public class Main {

    public static void main(String[] args) {
          
        // code..
      
        // Array erstellt mit Eingabe vom Benutzer
      
        int spielfeld [][] = new int [zeilen][spalten] ;
        ausgeben(spielfeld); // leeres Spielfeld ausgeben
      
        zufaelligFuellen(spielfeld);
      
        ausgeben(spielfeld); // zufällig gefülltes Spielfeld ausgeben
      
        // mehr code..
    }
  
    public static void ausgeben(int[][] feld) {
        // code..
    }
  
    public static void zufaelligFuellen(int[][] feld) {
        // code..
    }

Also ich habe gedacht das ich um die arrays mit 0 und 1 zu füllen zufällig wieder die gleiche variable nehmen muss. Könnte ich also eine andere variable deklarien und die dann in das array speichern?
Welche Variablen möchtest du denn im Array speichern? Ein int-Array kann ja nur int-Werte aufnehmen. Ansonsten kannst du die Variablen für den Zugriff auf den Arrayindex natürlich so nennen wie du willst. Die Benennung sollte halt sinnvoll sein, damit man später noch durchblickt.
 
Zuletzt bearbeitet:
kneitzel

kneitzel

Top Contributor
Also ein wichtiger Schritt ist immer, dass Du Dir überlegst, was Du genau machen willst.

Du willst:
-> Für Jede Zeile des Felder ..
--> Für jedes Spalte der Zeile ...
---> Dann erneut jede Zeile des Feldes ..
----> für jede Spalte des Feldes ...
etwas machen? Das ist so großer Quatsch. Daher: Schreib genau auf, was Du machen willst:

Du willst doch nur:
- Alle Zeilen durchgehen
- dann für jede Zeile alle Spalten/Felder durchgehen
- mit jedem Feld etwas machen ...

Die Methoden werden wichtig, weil Du dann wirklich nichts durcheinander werfen kannst:

Java:
public static int[][] createPlayground(int rowCount, int columnCount) {
    return new int[rowCount][columnCount];
}

// In die main kommt dann nur noch:
int [][] spielfeld = createPlayground(zeilen, spalten);

Das mit dem Füllen wäre dann etwas wie folgt:
Java:
public static void fillPlayground(int[][] playground) {
    for (int row = 0; row < playground.length; row++) {
        for (int column = 0; column < playground[row].length; column++) {
            playground[row][column] = getRandomFieldContent();
        }
    }
}

public static int getRandomFieldContent() {
    return .... // Hier dann deine Zufallszahl generieren ...
}

Das nur um den Ansatz zu zeigen. Die englischen Begriffe kannst Du gerne eindeutschen. Aber Ziel ist, viele kleine Methoden zu bekommen, deren Name genau aussagt, was die Methoden machen. Und dann wird Code deutlich lesbarer. Und wenn Methoden kurz bleiben, dann wird es auch einfach... Das füllen kann man auch noch unterteilen ... Du kannst für jede Zeile ein fillPlaygroundRow(int[] playgroundRow) aufrufen ...

Du musst es nicht übertreiben - aber maximale Verschachtelung von Schleifen sollte 2 sein. Mehr wie 2 Schleifen ineinander darf es nicht geben - da ist die Erfahrung, dass Anfänger da keinen Überblick haben, was da genau passiert.

Das einfach mal als kurze Erläuterung. Ich weiss, dass ich da evtl. jetzt mit neuen Dingen um die Ecke komme, aber das ist etwas, das aus meiner Sicht vieles vereinfacht und ich kann nicht verstehen, dass Leute, die Anderen die Entwicklung von Software beibringen, sowas nicht von Anfang an zumindest immer zeigen!
 
Hamudi Bachir

Hamudi Bachir

Mitglied
Du könntest z. B. eine Methode ausgeben(int[][] feld) schreiben, die nur für die Ausgabe zuständig ist, also das, was du in den ersten beiden verschachtelten Schleifen gemacht hat. Innerhalb dieser Methoden kannst du, falls erforderlich, die gleichen Bezeichnungen für die Variablen verwenden, weil es sich um andere, lokale Variablen handelt.

Java:
public class Main {

    public static void main(String[] args) {
         
        // code..
     
        // Array erstellt mit Eingabe vom Benutzer
     
        int spielfeld [][] = new int [zeilen][spalten] ;
        ausgeben(spielfeld); // leeres Spielfeld ausgeben
     
        zufaelligFuellen(spielfeld);
     
        ausgeben(spielfeld); // zufällig gefülltes Spielfeld ausgeben
     
        // mehr code..
    }
 
    public static void ausgeben(int[][] feld) {
        // code..
    }
 
    public static void zufaelligFuellen(int[][] feld) {
        // code..
    }


Welche Variablen möchtest du denn im Array speichern? Ein int-Array kann ja nur int-Werte aufnehmen. Ansonsten kannst du die Variablen für den Zugriff auf den Arrayindex natürlich so nennen wie du willst. Die Benennung sollte halt sinnvoll sein, damit man später noch durchblickt.
Es geht um das Spiel des Lebens und ich möchte 0/1 zufällig zuerst in das Array speichern damit ich danach mit den Regeln bestimmt wird ob die zelle weiter lebt oder ausstirbt.

Ich werde das mal mit den verschiedenen methoden ausprobieren.
Also ein wichtiger Schritt ist immer, dass Du Dir überlegst, was Du genau machen willst.

Du willst:
-> Für Jede Zeile des Felder ..
--> Für jedes Spalte der Zeile ...
---> Dann erneut jede Zeile des Feldes ..
----> für jede Spalte des Feldes ...
etwas machen? Das ist so großer Quatsch. Daher: Schreib genau auf, was Du machen willst:

Du willst doch nur:
- Alle Zeilen durchgehen
- dann für jede Zeile alle Spalten/Felder durchgehen
- mit jedem Feld etwas machen ...

Die Methoden werden wichtig, weil Du dann wirklich nichts durcheinander werfen kannst:

Java:
public static int[][] createPlayground(int rowCount, int columnCount) {
    return new int[rowCount][columnCount];
}

// In die main kommt dann nur noch:
int [][] spielfeld = createPlayground(zeilen, spalten);

Das mit dem Füllen wäre dann etwas wie folgt:
Java:
public static void fillPlayground(int[][] playground) {
    for (int row = 0; row < playground.length; row++) {
        for (int column = 0; column < playground[row].length; column++) {
            playground[row][column] = getRandomFieldContent();
        }
    }
}

public static int getRandomFieldContent() {
    return .... // Hier dann deine Zufallszahl generieren ...
}

Das nur um den Ansatz zu zeigen. Die englischen Begriffe kannst Du gerne eindeutschen. Aber Ziel ist, viele kleine Methoden zu bekommen, deren Name genau aussagt, was die Methoden machen. Und dann wird Code deutlich lesbarer. Und wenn Methoden kurz bleiben, dann wird es auch einfach... Das füllen kann man auch noch unterteilen ... Du kannst für jede Zeile ein fillPlaygroundRow(int[] playgroundRow) aufrufen ...

Du musst es nicht übertreiben - aber maximale Verschachtelung von Schleifen sollte 2 sein. Mehr wie 2 Schleifen ineinander darf es nicht geben - da ist die Erfahrung, dass Anfänger da keinen Überblick haben, was da genau passiert.

Das einfach mal als kurze Erläuterung. Ich weiss, dass ich da evtl. jetzt mit neuen Dingen um die Ecke komme, aber das ist etwas, das aus meiner Sicht vieles vereinfacht und ich kann nicht verstehen, dass Leute, die Anderen die Entwicklung von Software beibringen, sowas nicht von Anfang an zumindest immer zeigen!
Vielen Dank für die Hilfe. Ja mit den Methoden zu vereinfachen und es übersichtlicher zu gestalten hatten wir bei den Vorlesungen an der Hoschule leider noch nicht. Ich setzt mich ran und versuch mich da durch zu codieren :D
 
Hamudi Bachir

Hamudi Bachir

Mitglied
Also ein wichtiger Schritt ist immer, dass Du Dir überlegst, was Du genau machen willst.

Du willst:
-> Für Jede Zeile des Felder ..
--> Für jedes Spalte der Zeile ...
---> Dann erneut jede Zeile des Feldes ..
----> für jede Spalte des Feldes ...
etwas machen? Das ist so großer Quatsch. Daher: Schreib genau auf, was Du machen willst:

Du willst doch nur:
- Alle Zeilen durchgehen
- dann für jede Zeile alle Spalten/Felder durchgehen
- mit jedem Feld etwas machen ...

Die Methoden werden wichtig, weil Du dann wirklich nichts durcheinander werfen kannst:

Java:
public static int[][] createPlayground(int rowCount, int columnCount) {
    return new int[rowCount][columnCount];
}

// In die main kommt dann nur noch:
int [][] spielfeld = createPlayground(zeilen, spalten);

Das mit dem Füllen wäre dann etwas wie folgt:
Java:
public static void fillPlayground(int[][] playground) {
    for (int row = 0; row < playground.length; row++) {
        for (int column = 0; column < playground[row].length; column++) {
            playground[row][column] = getRandomFieldContent();
        }
    }
}

public static int getRandomFieldContent() {
    return .... // Hier dann deine Zufallszahl generieren ...
}

Das nur um den Ansatz zu zeigen. Die englischen Begriffe kannst Du gerne eindeutschen. Aber Ziel ist, viele kleine Methoden zu bekommen, deren Name genau aussagt, was die Methoden machen. Und dann wird Code deutlich lesbarer. Und wenn Methoden kurz bleiben, dann wird es auch einfach... Das füllen kann man auch noch unterteilen ... Du kannst für jede Zeile ein fillPlaygroundRow(int[] playgroundRow) aufrufen ...

Du musst es nicht übertreiben - aber maximale Verschachtelung von Schleifen sollte 2 sein. Mehr wie 2 Schleifen ineinander darf es nicht geben - da ist die Erfahrung, dass Anfänger da keinen Überblick haben, was da genau passiert.

Das einfach mal als kurze Erläuterung. Ich weiss, dass ich da evtl. jetzt mit neuen Dingen um die Ecke komme, aber das ist etwas, das aus meiner Sicht vieles vereinfacht und ich kann nicht verstehen, dass Leute, die Anderen die Entwicklung von Software beibringen, sowas nicht von Anfang an zumindest immer zeigen!
Also werden die einzelnen bestandteile in verschiedenen Klassen geschrieben und dann in der Main klasse zusammen gefügt sozusagen? oder hab ich es da falsch verstanden ?
 
kneitzel

kneitzel

Top Contributor
Nein, in Methoden einer Klasse. Es ist noch kein Objektorientierter Ansatz. Das dürfte bei dem, was Du da lernst, erst später kommen. Das wäre zwar aus meiner Sicht besser und das würde ich Dir auch gerne aufzeigen, aber da würde ich vermutlich über das Ziel hinaus schießen.

Also nur eine Klasse und in dieser dann viele Methoden. Die Methoden sind dann auch alle "static" - also noch nicht man im Ansatz Objektorientiert (Da wird der klare Ratschlag kommen, das static Schlüsselwort komplett zu verbannen bis auf die public static void main - und ggf. noch Konstanten oder so ...)
 
Hamudi Bachir

Hamudi Bachir

Mitglied
Also ein wichtiger Schritt ist immer, dass Du Dir überlegst, was Du genau machen willst.

Du willst:
-> Für Jede Zeile des Felder ..
--> Für jedes Spalte der Zeile ...
---> Dann erneut jede Zeile des Feldes ..
----> für jede Spalte des Feldes ...
etwas machen? Das ist so großer Quatsch. Daher: Schreib genau auf, was Du machen willst:

Du willst doch nur:
- Alle Zeilen durchgehen
- dann für jede Zeile alle Spalten/Felder durchgehen
- mit jedem Feld etwas machen ...

Die Methoden werden wichtig, weil Du dann wirklich nichts durcheinander werfen kannst:

Java:
public static int[][] createPlayground(int rowCount, int columnCount) {
    return new int[rowCount][columnCount];
}

// In die main kommt dann nur noch:
int [][] spielfeld = createPlayground(zeilen, spalten);

Das mit dem Füllen wäre dann etwas wie folgt:
Java:
public static void fillPlayground(int[][] playground) {
    for (int row = 0; row < playground.length; row++) {
        for (int column = 0; column < playground[row].length; column++) {
            playground[row][column] = getRandomFieldContent();
        }
    }
}

public static int getRandomFieldContent() {
    return .... // Hier dann deine Zufallszahl generieren ...
}

Das nur um den Ansatz zu zeigen. Die englischen Begriffe kannst Du gerne eindeutschen. Aber Ziel ist, viele kleine Methoden zu bekommen, deren Name genau aussagt, was die Methoden machen. Und dann wird Code deutlich lesbarer. Und wenn Methoden kurz bleiben, dann wird es auch einfach... Das füllen kann man auch noch unterteilen ... Du kannst für jede Zeile ein fillPlaygroundRow(int[] playgroundRow) aufrufen ...

Du musst es nicht übertreiben - aber maximale Verschachtelung von Schleifen sollte 2 sein. Mehr wie 2 Schleifen ineinander darf es nicht geben - da ist die Erfahrung, dass Anfänger da keinen Überblick haben, was da genau passiert.

Das einfach mal als kurze Erläuterung. Ich weiss, dass ich da evtl. jetzt mit neuen Dingen um die Ecke komme, aber das ist etwas, das aus meiner Sicht vieles vereinfacht und ich kann nicht verstehen, dass Leute, die Anderen die Entwicklung von Software beibringen, sowas nicht von Anfang an zumindest immer zeigen!
Zu dem Code eine frage. Bei Row und column sind dann die Zeilen und Spalten gemeint oder etwas anderes ? weil in Zeile 6 dann zeilen und spalten aufeinmal geschrieben wurde. Das verstehe ich nicht ganz
 
kneitzel

kneitzel

Top Contributor
Zu dem Code eine frage. Bei Row und column sind dann die Zeilen und Spalten gemeint oder etwas anderes ? weil in Zeile 6 dann zeilen und spalten aufeinmal geschrieben wurde. Das verstehe ich nicht ganz
Ja genau, das wären die eingegebenen zeilen / spalten. Die Variablen hießen in Deinem Code noch i / j. Du kannst die Variablen deutsch lassen (zeilen / spalten) oder auf Englisch schreiben (rows / columns) ... ich bin es auf Englisch gewohnt, denn sonnst passt es nicht mit dem Java Framework. Da ist halt alles auf Englisch.
 
kneitzel

kneitzel

Top Contributor
Das war ein weiteres Beispiel der Unterteilung. Die Methode getRandomFieldContent musst Du natürlich noch schreiben. Den Rahmen hatte ich in dem Code etwas weiter unten schon gezeigt - wobei die eigentliche Funktionalität durch ... ersetzt war. (Da dürfte halt einfach ein Zufallsgenerator rein, der eben zufällig eine 0 oder 1 erzeugt - was Du bereits als Math.round(Math.random()) geschrieben hattest.)
 
Hamudi Bachir

Hamudi Bachir

Mitglied
Das war ein weiteres Beispiel der Unterteilung. Die Methode getRandomFieldContent musst Du natürlich noch schreiben. Den Rahmen hatte ich in dem Code etwas weiter unten schon gezeigt - wobei die eigentliche Funktionalität durch ... ersetzt war. (Da dürfte halt einfach ein Zufallsgenerator rein, der eben zufällig eine 0 oder 1 erzeugt - was Du bereits als Math.round(Math.random()) geschrieben hattest.)
java:
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
    
        
        // Begrüßung
        
        System.out.println("Willkommen bei dem Simulationsspiel Spiel des Lebens.");
        System.out.println("Das Spiel des Lebens ist eine einfache Simulation von Wachstumsprozessen.");
        
        // Spielfeld groeße nach Benutzer Eingabe
        
        Scanner sc = new Scanner(System.in) ;
        
        System.out.println("Bitte geben sie die Zeilen anzahl des Spielfeldes ein. ");
        int zeilen = sc.nextInt() ;
        System.out.println("Bitte geben sie die Spalten anzahl des Spielfelds ein.");
        int spalten = sc.nextInt() ;
        
        
        
        int [][] spielfeld = spielfelderstellen(zeilen , spalten )    ;
        
        sc.close();
        }
    
        
        // Array erstellen
        public static int[][] spielfelderstellen (int zeilen, int spalten ) {
        
        return new int[zeilen][spalten];
        
            }
    
        
        public static void spielfeldfüllen (int [][] spielfeld ) {
            
            for ( int zeilen = 0 ; zeilen < spielfeld.length; zeilen++ ) {
                for ( int spalten = 0 ; spalten < spielfeld.length; spalten++) {
                        spielfeld [zeilen]][spalten] = zufallsgenerator();
                        
                    
                    
                }
            
            }       
            
        }
        public static int zufallsgenarator() {
        
            
            for ( int zeilen=0; zeilen < spielfeld.length ; zeilen++) {
                
                for ( int spalten=0 ; spalten < spielfeld.length, spalten ++  ) {
                    int    spiel [zeilen ][ spalten] = Math.round(math.random()) ;
                    
                    
        return zufallsgenarator() ;
            
                }
            
            }
            
        
            
            
        }
        
        
        
}

Nachdem ich an meinem Code weiter gearbeitet habe und versucht habe eure tipps umzusetzen zeigt er mir in der Methode zufallsgenarator wieder an das Zeilen und Spalten sich doppeln.
 
kneitzel

kneitzel

Top Contributor
Zufallsgenerator soll doch nur eine Zufallszahl generieren und zurück geben. Sonst nichts.

Also keine verschachtelten for Schleifen. Auch kein Zugriff auf irgend ein Array.

Die Syntax ist auch recht dubios:
int spiel [zeilen ][ spalten] = Math.round(math.random()) ;
Das int an erste Stelle bedeutet ja, dass Du eine neue lokale Variable deklarierst. Das willst Du ja auch nicht und wäre so auch nicht korrekt von der Syntax her.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Array bei jeder Eingabe um eins erweitern Java Basics - Anfänger-Themen 3
M String array durch Eingabe begrenzen Java Basics - Anfänger-Themen 7
D Array via Eingabe befüllen Java Basics - Anfänger-Themen 6
K Eingabe in Array speichern und Ausgeben Java Basics - Anfänger-Themen 9
H Leere Eingabe in einem array Java Basics - Anfänger-Themen 11
L Schleifen und Array, nur letzte Eingabe wird ausgegeben Java Basics - Anfänger-Themen 3
C Array eingabe Java Basics - Anfänger-Themen 2
H Die Eingabe von beliebig vielen Zahlen in ein Array - ich kann es nicht Java Basics - Anfänger-Themen 6
M Eingabe in Array speichern Java Basics - Anfänger-Themen 1
H Array eingabe und ausgabe Java Basics - Anfänger-Themen 25
L Array - Eingabe von Werten Java Basics - Anfänger-Themen 2
J 2Dimensionales Array, Größe durch Eingabe bestimmen Java Basics - Anfänger-Themen 9
G Vergleich Eingabe mit Wert in vorhandenem Array Java Basics - Anfänger-Themen 2
M Array auf Primzahlen prüfen Java Basics - Anfänger-Themen 7
sashady 2D-Array mit Zahlenmuster füllen Java Basics - Anfänger-Themen 4
t2im Java Array-Länge ändern? Java Basics - Anfänger-Themen 22
H Array rückwärts auslesen funktioniert nicht Java Basics - Anfänger-Themen 3
K Rekursion: Rechenmauer mit Array erstellen Java Basics - Anfänger-Themen 17
G ImageIcon in Byte-Array ablegen Java Basics - Anfänger-Themen 7
sashady ursprüngliche Array-Werte bei erneutem Aufruf? Java Basics - Anfänger-Themen 7
A Array Ansprache einer Zelle über Punktnotation? Java Basics - Anfänger-Themen 3
A Array einlesen und ausgeben Java Basics - Anfänger-Themen 13
AleXusher Mehrdimensionales Array aus txt.file auslesen Java Basics - Anfänger-Themen 4
moiss002 Umgebungsvariable Kein Zugriff auf ein Array Java Basics - Anfänger-Themen 7
B Häufigkeit einzelner Zahlen in einem Array Java Basics - Anfänger-Themen 6
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
nonickatall Input/Output Zeichenkette in Array zerlegen Java Basics - Anfänger-Themen 2
E In Array Werte einfügen? Java Basics - Anfänger-Themen 5
S Wort einlesen Array ausgeben Java Basics - Anfänger-Themen 4
HighLife Bestimmte Werte aus Array zählen Java Basics - Anfänger-Themen 15
OZAN86 Mehrdimensionales Array Java Basics - Anfänger-Themen 4
Yasemin bahar zweidimensionales Array Java Basics - Anfänger-Themen 5
Zeppi Vergleich von Array-Inhalten Java Basics - Anfänger-Themen 14
H Eingegebene Zahlen mit Array ausgeben Java Basics - Anfänger-Themen 18
L ArrayList<String> --> double[] array Java Basics - Anfänger-Themen 18
javaluke Erste Schritte Array nach Datentyp sortieren Java Basics - Anfänger-Themen 16
D Zufällige Auswahl aus einem angelegten Array? Java Basics - Anfänger-Themen 10
Zeppi OOP Array in Objekten Java Basics - Anfänger-Themen 4
K Wie kontrolliere ich ob ich die Zahl in meinem Array schon hab? Java Basics - Anfänger-Themen 9
O 2d Array einmal Eins Java Basics - Anfänger-Themen 2
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
R Array mit Unter- und Obergrenze ganze Zahlen dazwischen erscheinen nicht Java Basics - Anfänger-Themen 1
T Methode schreiben, die einem Array ein Stringelement hinzufügt, wenn dieses noch nicht enthalten ist. Java Basics - Anfänger-Themen 6
J null exception Array Java Basics - Anfänger-Themen 5
H Array Elemente Java Basics - Anfänger-Themen 17
J Array Actionlistener Java Basics - Anfänger-Themen 9
H Gesamtabweichung mit Array berechnen Java Basics - Anfänger-Themen 2
T Methode um Array mit for-each-Schleife auszulesen Java Basics - Anfänger-Themen 7
T Elemente aus Array zu TableView JavaFX übertragen Java Basics - Anfänger-Themen 2
I Array in umgekehrter Reihenfolge - Erklärung - Java Basics - Anfänger-Themen 3
T Zahl in Array ersetzen Java Basics - Anfänger-Themen 2
O 2D-Array nach einer Spalte sortieren Java Basics - Anfänger-Themen 22
I Letztes, erstes Element vom Array Java Basics - Anfänger-Themen 9
J Array an Combobox übergeben Java Basics - Anfänger-Themen 5
O zweidimensionales array in eine csv-Datei Java Basics - Anfänger-Themen 1
D Doppelte For Schleife / Array Java Basics - Anfänger-Themen 3
KogoroMori21 Array-Ausgabe Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
H Minimum in einem Array bestimmen Java Basics - Anfänger-Themen 7
A Einmaleins 2D Array Java Basics - Anfänger-Themen 1
TimoN11 Array -> Schleife wieder von vorne durchlaufen lassen Java Basics - Anfänger-Themen 1
H Methode mit Array als Rückgabe This method must return a result of Type int[] Java Basics - Anfänger-Themen 2
O System.out array Java Basics - Anfänger-Themen 4
G Erste Schritte Array Mittelwert Methode Programmieren Java Basics - Anfänger-Themen 5
T Variable in for Schleife ansprechen ohne Array ? Java Basics - Anfänger-Themen 25
X Zwei Dimensionales Array prüfen Java Basics - Anfänger-Themen 1
J Array Elemente werden nicht gefunden! Java Basics - Anfänger-Themen 6
K Rahmen erstellen mit mehrdimensionalem Array Java Basics - Anfänger-Themen 1
TimoN11 Array mit unterschiedlichen längen aktualisieren, dann als Methodenwert einsetzen Java Basics - Anfänger-Themen 1
G Bubblesort Array der Größe 10 Java Basics - Anfänger-Themen 1
M Initialen mit Array wiedergeben Java Basics - Anfänger-Themen 3
J Objekt-Array dynamischer Länge aus Benutzereingaben erstellen Java Basics - Anfänger-Themen 6
G Java 2-dimensionalen int-Array Summe Java Basics - Anfänger-Themen 2
G Array Werte addieren Java Basics - Anfänger-Themen 4
C Größte Zahl aus einem Array ermitteln(als statische Methode) Java Basics - Anfänger-Themen 31
G Methoden Methode die aus einem Array ein Index ausgibt? Java Basics - Anfänger-Themen 2
L Array Rotation Java Basics - Anfänger-Themen 4
D Ausgabe von Array Java Basics - Anfänger-Themen 2
R String in char-Array übertragen Java Basics - Anfänger-Themen 5
D Input/Output fehlerhafter Algorithmus zum Ersetzen von Array-Werten nach logischem Schema Java Basics - Anfänger-Themen 1
J Ist es möglich einen int Array wirklich leer zu initialisieren oder zu füllen? Java Basics - Anfänger-Themen 21
P Datentypen Array und String Java Basics - Anfänger-Themen 2
Zeppi Array Java Basics - Anfänger-Themen 2
kazzam94 Methode soll Array von Boolean zurückgeben Java Basics - Anfänger-Themen 5
Zeppi Jagged Array Java Basics - Anfänger-Themen 6
J Buchstabenhäufigkeit mit Array und Ausgabe des häufigsten Buchstaben Java Basics - Anfänger-Themen 25
B Konstruktor mit Array als Parameter Java Basics - Anfänger-Themen 3
U Muster in einem Array erkennen Java Basics - Anfänger-Themen 8
L Array mit Wörtern gestalten Java Basics - Anfänger-Themen 2
Gaudimagspam Nummern generieren Array Java Basics - Anfänger-Themen 4
Eule25 Methode mit Array Java Basics - Anfänger-Themen 4
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
FelixN Array mit verschiedene Datentypen als Rückgabewert? (Long und Double) Java Basics - Anfänger-Themen 3
P Nutzer entscheiden lassen, wie viele Zahlen dieser in ein Array eingeben möchte. Java Basics - Anfänger-Themen 6
J Array; Elemente kopieren Java Basics - Anfänger-Themen 17
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
JD_1998 Random Array sortieren mit Hilfe einer Methode Java Basics - Anfänger-Themen 4
M Objekte in Array speichern und ausgeben Java Basics - Anfänger-Themen 17
C Array-Werte werden gemischt, ohne Logik Java Basics - Anfänger-Themen 2

Ähnliche Java Themen


Oben