ich schreibe grad ein Programm, bei dem ich ein Spielfeld ohne Grenzen haben möchte. Soll heißen, wenn ich z.B. an die rechte Begrenzung stoße, kommt man von links auf derselben Höhe wieder ins Spielfeld rein. Nur bei mir kommt immer die ArrayOutOfBoundsException.
Ich habe 2 Arrays, die ich in 2 verschachtelten For-Schleifen bearbeite etc.
Den folgenden Abschnitt wollte ich nun dazu benutzen, die Wände "aufzuheben" (2 Arrays x 4 Richtungen = 8 Zeilen)
Wie mach ich sowas?
Nehmen wir mal folgenden Ausschnitt aus meinem Quelltext
Code:
for(int i=0;i<hoehe;i++)
{
for(int j=0;j<breite;j++)
{
//Jede Position wird auf das Vorhandensein eines Fisches untersucht
if(symbole[i][j] == '.')
{
//Es wird geprueft, ob eines der 4 angrenzenden Felder leer ist
if(symbole[i-1][j] == ' ' || symbole[i][j+1] == ' ' || symbole[i+1][j] == ' ' || symbole[i][j-1] == ' ')
{
Ich habe einen Ozean, der mit Fischen gefüllt ist (char symbole[][]). Wenn in diesem Ausschnitt ein Fisch auf einem Feld des Ozeans erkannt wurde, dann wird geguckt, ob eines der 4 Nachbarfelder leer ist, damit der Fisch da evtl. hinwandern kann. Und an diesem Punkt stoße ich immer über die Grenzen des Arrays hinaus.
Das Problem, das ich mit Hobbits Lösungsversuch habe ist, dass ich nicht weiß, wo ich das oder sowas ähnliches hinschreiben könnte. Vor der Zeile
ist ja noch alles in Ordnung und in der Zeile tritt ja die ArrayIndexOutOfBoundsException auf, so dass es nichts bringen wird, es noch nach der zeile hinzuschreiben...
Will doch nur, dass meine Fischis vom Rand des Ozeans auf die gegenüberliegende Seite kommen
Also Wildcard hatte ja auch schon Modulo gesagt nur ich kann mir einfach nich vorstellen, wie ich da Modulo anwenden soll... vielleicht ists eben auch nur ne Denkblockade und ich steh etwas geistig im Nebel ^^ helft mir bitte, wie muss ich das mit Modulo schreiben, dass es geht...
Stell Dir vor, die Uhr zeige nicht Stunden von 1 bis 12, sondern Stunden von 0 bis 11. Die Zeit kann verstreichen, wie sie will (also etwa zeit++); die Uhr würde, egal wie spät es ist, immer die Zeit modulo 12 anzeigen …
schreibe, dann klappt das (für i = hoehe-1), dass anstelle eines Wertes, der irgendwann mal um eins zu hoch ist, durch den Modulo nun 0 erscheint, also genau gegenüber des Feldrandes.
Wenn ich nen 2D-Array als Ozean nehme und meine Fische nach links oder oben gegen die "Wand" gegenstoßen, das sie dann auf der gegenüberliegenden Seite wieder in den Ozean reinkommen... Wie mach ich das?
rechts und unten klappt ja schon, da schreib ich z.B. für unten:
Code:
symbole[(i+1)%20][j]
(symbole[][] enthält meine Fische und in dem Bsp. hat der Ozean die Höhe 20)
Aber bei links und oben klappt das mit dem Modulo nich oder bin ich einfach nur blind? ^^
Durch einen anderen Fehler konnte ich erst jetzt testen ob es funktioniert... Nunja, ich habe jetzt
Code:
//Es wird geprueft, ob eines der 4 angrenzenden Felder leer ist
if(symbole[(i-1+hoehe)%hoehe][j] == ' ' || symbole[i][(j+1%breite)] == ' ' || symbole[(i+1)%hoehe][j] == ' ' || symbole[i][(j-1+breite)%breite] == ' ')
geschrieben und rein mathematisch gesehen kommt man ja so von einem Rand des 2D-Arrays auf die gegenüberliegende Seite, wenn man den Rand überschreiten sollte aber es kommt trotzdem mal wieder eine ArrayIndexOutOfBoundsException und zwar genau wieder in dieser Zeile... Ich versteh einfach nich warum, das passt doch eigentlich alles super oder!?