Array Grenzen-Exception

Schniggor

Mitglied
Halllo zusammen,

ich programmiere momentan an der Bedingung für 4-Gewinnt und mir wird ein Exception auf der Ausgabe erteilt, also eine Länge wird, wohl überschritten. Hat jmd einen Tipp für mich?

Java:
for (int i=0; i<spielfeld.length;i++){
            for(int j=0; j<spielfeld[i].length; j++){
           
                spielfeld[i][j]= (char)(Math.random()*100);
                if(spielfeld[i][j]<50){
                    spielfeld[i][j]='X';
                    for ( int r=0; r<spielfeld.length;i++){
                        for( int t=0; t<spielfeld[r].length; t++){
                           
                            if('X'==spielfeld[r+1][t] & 'X'==spielfeld[r+2][t] & 'X'==spielfeld[r+3][t]|'X'==spielfeld[r][t+1] & 'X'==spielfeld[r][t+1] & 'X'==spielfeld[r][t+3]){
                                System.out.print("Spieler X hat gewonnen. Herzlichen Glückwunsch!");
                                System.exit(0);
                            }
                        }
                    }   
                }
                else{
                    spielfeld[i][j]='O';
                    for (int d=0; d<spielfeld.length;d++){
                        for(int c=0; c<spielfeld[d].length; c++){
                           
                            if('O'==spielfeld[d+1][c] & 'O'==spielfeld[d+2][c] & 'O'==spielfeld[d+3][c]|'O'==spielfeld[d][c+1] & 'O'==spielfeld[d][c+1] & 'O'==spielfeld[d][c+3]){
                                System.out.print("Spieler O hat gewonnen. Herzlichen Glückwunsch!");
                                System.exit(0);
                            }
                        }
                    }   
               
                }
               
                System.out.print(spielfeld[i][j]+" ");
            }
            System.out.println();
 
Das könnte an dem i in folgender Zeile liegen:
Java:
for ( int r=0; r<spielfeld.length;i++){

Außerdem fällt mir auf, dass du überall & statt &&
bzw. | statt || verwendest.
 
danke das exception ist nurnoch bedingt vorhanden, allerdings funktioniert die bedingung auch nicht ganz auf der ausgabe

ich muss nochmal schauen, wo der fehler liegt
 
Hallo

Das hier ist auch eine Ursache:

Java:
spielfeld[d+1]
oder das hier
Java:
spielfeld[d][c+1]
usw.

Wenn du schon d und c solange erhöhst bis die Grenze von
Java:
spielfeld.length
erreicht ist kannst du nicht noch weiter darüber hinaus.

Grüße
 
Wenn du immer 2 Elemente mit einander vergleichen willst musst du das letzte Element nicht mit in der Schleife beachten.
Wenn du nur bis spielfeld.length-1 gehst kannst du problemlos [i+1] schreiben.
 
Ja so kann man das Exception umgehen, allerdings läuft ja dann die Schleife zur Kontrolle nicht komplett durch,

also wenn man mit einer doppelten for-Schleife durchläuft, dann werden die letzten 3 Elemente vertikal nicht überprüft,

also BsP.

4x4 Array
for ( int r=0; r<spielfeld.length-3;r++){
for( int t=0; t<spielfeld[r].length-3; t++)
XOXX
OOXX
XOXX
XOXX
Da r bei -3 in die nächste t Zeile springt, werden die letzten 3 Reihen vertikal nicht geprüft
 
Ja so kann man das Exception umgehen, allerdings läuft ja dann die Schleife zur Kontrolle nicht komplett durch,

also wenn man mit einer doppelten for-Schleife durchläuft, dann werden die letzten 3 Elemente vertikal nicht überprüft,

also BsP.

4x4 Array
for ( int r=0; r<spielfeld.length-3;r++){
for( int t=0; t<spielfeld[r].length-3; t++)
XOXX
OOXX
XOXX
XOXX
Da r bei -3 in die nächste t Zeile springt, werden die letzten 3 Reihen vertikal nicht geprüft
ok schon gut, habe einfach nochmal die for schleifen weiter zerlegt , dass einmal nur vertikal und in einer 2. runde nur horizontal durchlaufen wird
 
ok also an sich funktionieren die Bedingungen jetzt, nun habe ich noch 2 Dinge die ich lösen möchte:
1. Ich versuche das Array erstmal einmal komplett mit - zu befüllen und anschließend sollen alle - mit X oder O befüllt werden, sobald natürlich die Siegerbedingung erfüllt ist, soll das Array nur mit X und O und alle nicht besetzten Felder mit - befüllt sein. Momentan werden nur X und O ausgegeben. Ich vermute es werden die - durch die Math.random() überschrieben.

2. Das Array befüllt sich momentan von oben links nach rechts unten. Ich möchte, aber das array von unten nach oben befüllen. Natürlich muss man dazu die Schleife anders, durchlaufen lassen.

For(int i=0; i<spielfeld.length; i++)
For(int j=0; j<spielfeld.length;j++)

muss ja umgekehrt werden. i++ und j++ wird sicher i -- ind j--. mein Array[j] wird per eingabe gesteuert. d.h der Betreiber legt die Breite und Höhe i und j fest. mit WIDTH und HEIGHT, die bedingung ist ja dass unser i oder j 0 wird=

Meine Überlegung:

Java:
for (int i  =(int) WIDTH; i > 0; i--) {
                    for (int j =(int) HEIGHT; j > 0; j--) {

Allerdings werden, dann wieder Exceptions gesendet...

Der jetztige Code:

Java:
char[][] spielfeld = new char[(int) HEIGHT][(int) WIDTH];
        for (int i = 0; i < spielfeld.length; i++) {
            for (int j = 0; j < spielfeld[i].length; j++) {

                spielfeld[i][j] = '-';
            }
        }   

                for (int i  = 0; i < spielfeld.length ; i++) {
                    for (int j = 0; j < spielfeld[i].length; j++) {

                        spielfeld[i][j] = (char) (Math.random() * 100);
                        if (spielfeld[i][j] < 50) {
                            spielfeld[i][j] = 'X';
                            for (int r = 0; r < spielfeld.length - 3; r++) {
                                for (int t = 0; t < spielfeld[r].length; t++) {

                                    if (spielfeld[r][t] == 'X' && spielfeld[r + 1][t] == 'X'
                                            && spielfeld[r + 2][t] == 'X' && spielfeld[r + 3][t] == 'X') {
                                       
                                        System.out.print(spielfeld[r+1][t]+"\n");
                                        System.out.println("Spieler X hat gewonnen. Herzlichen Glückwunsch!");
                                        System.exit(0);
                                    }

                                }
                            }
                            for (int r = 0; r < spielfeld.length; r++) {
                                for (int t = 0; t < spielfeld[r].length - 3; t++) {

                                    if (spielfeld[r][t] == 'X' && spielfeld[r][t + 1] == 'X'
                                            && spielfeld[r][t + 2] == 'X' && spielfeld[r][t + 3] == 'X') {
                                       
                                        System.out.print(spielfeld[r][t+1]+"\n");
                                        System.out.println("Spieler X hat gewonnen. Herzlichen Glückwunsch!");
                                        System.exit(0);
                                    }

                                }
                            }

                        } else {
                            spielfeld[i][j] = 'O';
                            for (int d = 0; d < spielfeld.length - 3; d++) {
                                for (int c = 0; c < spielfeld[d].length; c++) {

                                    if (spielfeld[d][c] == 'O' && spielfeld[d + 1][c] == 'O'
                                            && spielfeld[d + 2][c] == 'O' && spielfeld[d + 3][c] == 'O') {
                                       
                                        System.out.print(spielfeld[d+3][c]+"\n");
                                        System.out.println("Spieler O hat gewonnen. Herzlichen Glückwunsch!");
                                        System.exit(0);
                                    }

                                }
                            }

                            for (int d = 0; d < spielfeld.length; d++) {
                                for (int c = 0; c < spielfeld[d].length - 3; c++) {

                                    if (spielfeld[d][c] == 'O' && spielfeld[d][c + 1] == 'O'
                                            && spielfeld[d][c + 2] == 'O' && spielfeld[d][c + 3] == 'O') {
                                       
                                        System.out.print(spielfeld[d][c+3]+"\n");
                                        System.out.println("Spieler O hat gewonnen. Herzlichen Glückwunsch!");
                                        System.exit(0);

                                    }

                                }

                            }
                        }
                        System.out.print(spielfeld[i][j] + " ");
                    }
                    System.out.println();
                   
                }
                System.out.print("Alle Felder sind voll und keiner hat 4 gleiche Zeichen horizontal oder vertikal. Unentschieden!");

Freue mich über Anmerkungen
 
Ja und welche Exception bekommst du?

Warum castest du WIDTH und HEIGHT nach int? Was sind das den für typen?

Und was soll das
Java:
spielfeld[i][j] = (char) (Math.random() * 100);
if (spielfeld[i][j] < 50) {
      spielfeld[i][j] = 'X';
...
...
}
bezwecken?

Warum nicht so:
Java:
if((Math.random() * 100) < 50){....}
 
Ja und welche Exception bekommst du?
z.B für die Grenzen 4x4

Java:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at ConnectFour.main(ConnectFour.java:45)

Warum castest du WIDTH und HEIGHT nach int? Was sind das den für typen?

Also WIDTH und HEIGHT sind final double..., aber java lässt nur (int) zu...ich mein das sind ja auch zahlenwerte, die einfach die länge und breite des feldes angeben

Und was soll das
Java:
spielfeld[i][j] = (char) (Math.random() * 100);
if (spielfeld[i][j] < 50) {
      spielfeld[i][j] = 'X';
...
...
}
bezwecken?

Warum nicht so:
Java:
if((Math.random() * 100) < 50){....}

Ja so kann man das sicher auch schreiben, aber dabei liegt ja jetzt nicht der Fehler
 
Hallo.

Sorry aber sowas
Java:
spielfeld[i][j] = (char) (Math.random() * 100);
macht kein Sinn.
Und es macht auch kein Sinn WIDTH und HEIGHT als double und nicht gleich in int zu implementieren.
Eine Array kann nicht 1.2 groß sein. Und die Exception sagt dir doch genau wo die geschmissen wird und warum.

Das Array ist kleiner als 5: Sprich
Java:
array[4]
geht dann natürlich nicht.

Grüße
 

Zurück
Oben