Arrays übergeben, Mehrdimensionale Arrays Zeilenabtrennung in schleifen

Fynx_HD

Mitglied
Jo, blutiger Anfänger hier. Ich sitze heute seit exakt 4 Stunden an einer Aufgabe. Ich komm in der Aufgabe nicht weiter. Daher meine alltime Zeit ,die ich in diese ultra simple Aufgabe gesteckt habe circa. 12 Stunden betragen, wollte ich mal nach Hilfe fragen und mich erkundigen ob das normal ist das man so lange fürs reine verständis braucht. ^^ Nun zur Aufgabe: Zusammengefasst soll man ein Spielfeld in einem 2 dimensionalen Array erstellen und in diesem 3x3 Array 9 Zahlen einlesen lassen und dann abgleichen lassen ob die Zahlen in einer Reihe die selbe sind. Ich bitte aber am besten nur um kleine Tipps und um keine Komplettlösung daher ich mir die Aufgabe sonst von Anfang an schenken hätte können. x)


Java:
import java.util.Scanner;

public class Aufgabe13 {

    public static void main(String[] args) {
        int[][] Spielfeld = new int[3][3];
        int[] row = new int[3];
        Scanner Scanni = new Scanner(System.in);
      
            System.out.println("Bitte gebe alle Zahlen des Spielfelds nacheinander ein : ");
      
      
          
            for(int i = 0; i < Spielfeld.length; i++) {
                for(int j = 0; j < Spielfeld.length; j++) {
                    Spielfeld[i][j] = Scanni.nextInt();    }    }       
            for(int i = 0; i < Spielfeld.length; i++) {
                for(int j = 0; j < Spielfeld.length; j++) {
                        three(Spielfeld[i][j]);    } }
       
    }
       
               
    public static boolean three(int Spielfeld) {   
    int[][] SpielfeldH = new int[3][3];
        for(int i = 0; i < SpielfeldH.length; i++) {
            for(int j = 0; j < SpielfeldH.length; j++) {
                SpielfeldH[i][j] = Spielfeld;
            }
        }
        System.out.println(SpielfeldH[2][2]);
   
        return false;
        }
}
 
Zuletzt bearbeitet von einem Moderator:
Beste Antwort
Als erstes ein Hinweis zum Posten von Code: Diesen bitte immer in Code Tags posten. Dazu einfach den Knop </> links oberhalb des Eingabebereiches nutzen. (Ansonsten werden paar Textelemente interpretiert z.B ein [i] wertet das Forum as Befehl, kursiven Text zu starten.)

Also ein erster Hinweis zu den verschachtelten Schleifen: Da das Kursive erst bei der Zuweisung startet, hast Du sowohl bei den Schleifen mit i als auch bei j die Länge des äußeren Arrays. Das funktioniert hier, aber wenn das Spielfeld nicht quadratisch wäre, würde es ein Problem ergeben. 2D Arrays sind Arrays von Arrays. Die innere Schleife nimmt also die Länge von Spielfeld[i].length

Dann zu der Aufgabe:
Was musst Du den prüfen, wenn Du wissen...
Als erstes ein Hinweis zum Posten von Code: Diesen bitte immer in Code Tags posten. Dazu einfach den Knop </> links oberhalb des Eingabebereiches nutzen. (Ansonsten werden paar Textelemente interpretiert z.B ein [i] wertet das Forum as Befehl, kursiven Text zu starten.)

Also ein erster Hinweis zu den verschachtelten Schleifen: Da das Kursive erst bei der Zuweisung startet, hast Du sowohl bei den Schleifen mit i als auch bei j die Länge des äußeren Arrays. Das funktioniert hier, aber wenn das Spielfeld nicht quadratisch wäre, würde es ein Problem ergeben. 2D Arrays sind Arrays von Arrays. Die innere Schleife nimmt also die Länge von Spielfeld[i].length

Dann zu der Aufgabe:
Was musst Du den prüfen, wenn Du wissen willst, ob die Zahlen in einer Reihe gleich sind?

Das kannst Du mit dem festen Spielfeld direkt in Worten sagen: Ist 1. Zahl = 2. Zahl und 2. Zahl = 3. Zahl?
Mit de Hinweis "Arrays von Arrays" solltest Du an die Arrays jeder Reihe heran kommen können um dann diese Prüfung durchzuführen.

Wenn es nun für beliebig große Reihen funktionieren soll:
Überlege Dir, was sich ändert beim Vergrößern. Schreib die Prüfungen auf für 3 Zahlen, für 4 Zahlen, für 5 Zahlen ... Siehst Du eine Gesetzmäßigkeit? Kannst Du in Worten formulieren, was zu tun ist? Also es so formulieren, dass jeder die Prüfung machen kann, auch wenn Du ihm nicht die Aufgabe selbst erklärst. Wenn Du sowas hast, dann kannst Du es in Code umsetzen.

Und ein weiterer Hinweis teile es auf:
  • Kannst Du eine Methode schreiben, die nur die Reihe prüft? Es kommt also als Parameter ein eindimensionales Array und du prüfst nur, ob alle Zahlen gleich sind.
  • Dann kannst Du eine Methode schreiben, die bei einem 2D Array alle Reihen prüft und die andere Methode dazu nutzt.
==> So unterteilte Aufgaben sind dann später in der Regel einfacher anzupassen.
 
Beste Antwort
Danke für die Antwort. ^^ Zur Überprüfung ist mir gestern tatsächlich noch folgendes eingefallen:

Java:
if(Spielfeld[0][1] == Spielfeld[0][2] && Spielfeld[0][1] == Spielfeld[0][0] && Spielfeld[0][2] == Spielfeld[0][0]) {
                System.out.println("true"); }
                else { System.out.println("false");    }
                if(Spielfeld[1][1] == Spielfeld[1][2] && Spielfeld[1][1] == Spielfeld[1][0] && Spielfeld[1][2] == Spielfeld[1][0]) {
                     System.out.println("true");    }
                    else { System.out.println("false");    }
                    if(Spielfeld[0][1] == Spielfeld[2][2] && Spielfeld[2][1] == Spielfeld[2][0] && Spielfeld[2][2] == Spielfeld[2][0]) {
                        System.out.println("true");    }
                        else { System.out.println("false");    }

Leider steht auch in der Aufgabe das ich es mit einer Methode überprüfen lassen soll, was mich wieder zu dem Problem zurückwirft das ich nicht weiß wie ich arrays irgendeiner Art übergeben soll..

-"Also ein erster Hinweis zu den verschachtelten Schleifen: Da das Kursive erst bei der Zuweisung startet, hast Du sowohl bei den Schleifen mit i als auch bei j die Länge des äußeren Arrays. Das funktioniert hier, aber wenn das Spielfeld nicht quadratisch wäre, würde es ein Problem ergeben. 2D Arrays sind Arrays von Arrays. Die innere Schleife nimmt also die Länge von Spielfeld.length"

Was damit gemeint ist hab ich leider auch nicht so ganz verstanden, werde aber noch ein wenig über den Teil mit arrays von arrays nachdenken.
Danke nochmal! 🙂
Edit: Ultra wichtig fürs verständnis: Habe gelernt das Arrays immer bei 0 beginnen, und daher das 3. Element als 2. angesprochen wird. Nur bei mir muss ich ein array erstellen welches [3][3] groß ist um ein 3x3 spielfeld zu haben. Müsste das spielfeld bei [2][2] nicht 3x3 sein?
 
Zuletzt bearbeitet:
Du willst testen ob alle werte einere Reihe gleich sind.
Dann hole dir doch vor der innrren Scheife den ersten Wert speichere ihn in einer Variablen. Inder Schleife prüft du ob die variable und der nechste wert gleich ist.
Wenn nein bist du schon am ende und kanst die Schleife verlassen.
Vorher machst du deine Ausgabe.
Dann geht es ja in die äußere Schleife zurück und die nechste Zeile ist dran.

Die äußere Schleife zählt die zeilen die innere die spalten.
So nun überlege wo deine Schleife starten musd damit du kein overFlow bekommst. Denn den ersten wert hast du scho in der Variablen.

Male es dir mit Stift und Papier auf.
 
Zuletzt bearbeitet:
Hii @Fynx_HD ich glaube auch gena wie bei mir, brauchst du auch zwei3 Schleifen um zu zehen ob in einer Spalte nur gleiche Zahlen stehen. Vielleicht brauchst du auch drei, wenn die Reihen hauch noch geprüft werden.
 
...

Leider steht auch in der Aufgabe das ich es mit einer Methode überprüfen lassen soll, was mich wieder zu dem Problem zurückwirft das ich nicht weiß wie ich arrays irgendeiner Art übergeben soll..

...
Weißt Du denn, wie Du einen einfachen Datentyp einer Methode übergeben kannst, zum Beispiel eine Integervariable?
Ansonsten gucke mal in Deine Main-Methode, dort wird auch ein Array übergeben für den Datentyp String.
 
Danke für die ganzen Kommentare! Das Endergebnis sieht jetzt so aus und funktioniert auch tatsächlich.
Java:
import java.util.Scanner;

public class Aufgabe13 {

    public static void main(String[] args) {
        int[][] Spielfeld = new int[3][3];
        Scanner Scanni = new Scanner(System.in);
            System.out.println("Bitte gebe alle Zahlen des Spielfelds nacheinander ein : ");
    
            for(int i = 0; i < Spielfeld.length; i++) {
                for(int j = 0; j < Spielfeld.length; j++) {
                    Spielfeld[i][j] = Scanni.nextInt();}    }       
                
            
                        System.out.println(three(Spielfeld));
    }
                        
    public static boolean three(int[][] spielfeld) {   
    int iff = 0;
        for(int i = 0; i < 3;) {
    if(spielfeld[i][1] == spielfeld[i][2] && spielfeld[i][1] == spielfeld[i][0] && spielfeld[i][2] == spielfeld[i][0]) {
        iff = 1; }    i++;}
            
            if(iff == 1)
            { return true;}
            else { return false;
        }
        
        }
}
[3][3] heißt das es 3x3 gross ist.
Zugriff ist von 0,1,2 als auch drei
Bei Zugriff mit [3], würdest du eine fehlermelung bekommen.

[2][2] ist das ende des Arrays
Leider versteh ich das immernoch nicht so richtig. Wenn ich also 3x3 angebe und das in Wahrheit 0 , 1 und 2 ist, gibt es doch das Problem dass falls ich das 1. Element aufrufen möchte das doch 0 und 0 ist statt 1 und 1. Dann komm ich doch bei 3x3 auf 4x4 Elemente oder nicht?
 
Leider versteh ich das immernoch nicht so richtig. Wenn ich also 3x3 angebe und das in Wahrheit 0 , 1 und 2 ist, gibt es doch das Problem dass falls ich das 1. Element aufrufen möchte das doch 0 und 0 ist statt 1 und 1. Dann komm ich doch bei 3x3 auf 4x4 Elemente oder nicht?
Nein, das kommt von der Hardware hoch beziehungsweise wie man Speicher verwaltet.

Java:
int[] arraytest = new int[3];

Allokiert den Speicherbereich fuer drei `int`s. Wenn du nun auf das erste Element willst brauchst du einen Versatz von 0 im Speicher. Nehmen wir mal folgendes Beispiel an Speicher an:

Code:
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00

Unser Speicher hier ist Leer. Nun allokieren wir unser int Array:

Code:
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
   ^ <--  unser int arra
00 00 00 00 00 00 00 00
y hier   --> ^
00 00 00 00 00 00 00 00

Es beginnt auf der "dritten Zeile" unseres Speichers. Wenn du nun das erste Element aus diesem Array haben willst, brauchst du einen Versatz von 0 zur Speicher-Adresse:

Code:
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
   ^----1----^
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00

Willst du das zweite Element aus dem Array, brauchst du einen Versatz von einer Element Laenge (hier vier Bytes):

Code:
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
               ^----2--
00 00 00 00 00 00 00 00
-^
00 00 00 00 00 00 00 00

Und so weiter.
 

Zurück
Oben