ich möchte mir die OOProgrammierung beibringen und möchte dies gerne mit Java machen... Habe mich auch schon was durch das Javabuch und Java ist auch eine Insel gelesen und möchte nun als erste übung ein kleines Sudoku basteln...
So als erstes wollte ich aber erreichen, dass ich einen Spielplan mit 9x9 Feldern erstellt bekomme das einfach nur mit zufallszahlen gefüllt wird... Ohne auf irgendwelche Sudokuregeln zu achten sollen also zahlen ins feld. Dazu habe ich folgenden Code geschrieben:
Code:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Spielfeld spielfeld = new Spielfeld();
for(int i=0; i<=8; i++){
for(int j=0; j<=8; j++){
System.out.println(spielfeld.createSpielfeld());
}
}
}
}
Code:
public class Spielfeld {
int[][] spielfeld;
public Spielfeld(){
spielfeld = new int[8][8];
}
int[][] createSpielfeld(){
for(int i=0; i <= 8; i++){
for(int j=0; j<=8; j++){
spielfeld[i][j] = (int)Math.random() * 10;
}
}
return spielfeld;
}
}
Nun bekomme ich folgenden Fehler:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
at Spielfeld.createSpielfeld(Spielfeld.java:13)
at Main.main(Main.java:13)
Was mache ich falsch? Und was genau bedeutet der Fehler?
Den wirste wohl noch ein bis zwei-, naja vielleicht sogar drei Tausend mal sehen...
ArrayIndexOutOfBoundsException:
-Array is ja klar
-Index bezeichnet die Nummer eines "Faches" vom Array, eben von 0 bis length-1
-OutOfBounds = engl. für "ausserhalb der Grenzen", d.h. du hast mit einem Index aufs Array
zugegriffen, den es nicht gibt.
-Exception will sagen: FATALER MEGA SUPER TURBO FEHLER, DU DRECKS ANFÄNGER!
..und auch etwas, das du demnächst wohl öfters sehen wirst:
Achja, es werden außerdem keine zufallszahlen ausgegeben sondern nur "[[I@42e816" wenn ihr schon dabei seid den überschaubaren code zu studieren, könnt ihr mir dabei sicherlich auch behilflich sein...
Naja wenn du bei 0 anfängst und bei einschliesslich 8 aufhörst, hast du halt 9.
0 1 2 3 4 5 6 7 8. Das sind neun
Und was du ausdruckst, das ist das Objekt "spielfeld", und das ist ein 2d-Array mit einer
gewissen Bezeichnung, die Java dem Objekt gegeben hat. Wenn du den Inhalt eines Arrays
willst, bleibt dir nix anderes über, als wieder mit einer for-Schleife drüberzugehen und jeweils
Achja, es werden außerdem keine zufallszahlen ausgegeben sondern nur "[[I@42e816" wenn ihr schon dabei seid den überschaubaren code zu studieren, könnt ihr mir dabei sicherlich auch behilflich sein...
mhn spielfeld = new int[8][8]; das ist die größe 8, da musst du aber 9 hinschreiben.
warum "[[I@42e816" ausgebeben wird? weil du nicht die zufallszahl ausgibst sondern dein generierstes arrray, aja und du generierst dein array 64 mal 8*8 warum?
Vorallem speicherst du diese ganzen Spielfelder ja nicht mal irgendwo ab.
Das ganze geht einfach so:
Code:
Spielfeld spielfeld = new Spielfeld();
// zufallszahlen erzeugen
spielfeld.createSpielfeld();
// zufallszahlen ausdrucken
for(int i = 0;i<8;i++){
for(int j = 0;j<8;j++){
System.out.println("An Stelle ["+i+"]["+j+"] steht die Zahl: "+spielfeld.spielfeld[i][j]);
}
}
...du willst doch nicht wirklich 64 Spielfelder mit je 64 Zahlen drin, oder doch?
Wenn ja, musst du 64 neue Instanzen der Klasse Spielfeld erstellen, nicht nur eine:
Code:
for(int i=0; i<=64; i++){ // 2 verschachtelte Schleifen machen ja hier keinen Sinn...
Spielfeld feld = new Spielfeld();
feld.createSpielfeld();
// jetzt noch dieses Spielfeld in einer Liste von Spielfeldern abspeichern
}
*räusper* Ein Soudoku-Feld ist 9x9 groß. Das Problem war also weniger das ...i<=8, sondern vielmehr das new int[8][8], was ein [9][9] sein müßte.
Aber wenn es um OOP geht: Du solltest (und für den Anfang kannst du diese (ansonsten etwas zu pasuchale) Regel mal so hinnehmen) NIE NIE NIE einen Array, der als Instanzvariable in einer Klasse liegt, nach draußen geben. Überleg' dir, was man mit einem Sudoku-Feld machen können muss:
Code:
interface SudokuField
{
void set(int x, int y, int number);
int get(int x, int y);
}
... Hmja. Viel mehr ist es eigentlich (erstmal!!!) nicht. Und das kann man jetzt implementieren.