Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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();
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 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.
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!");
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
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.