2D-Array ohne Grenzen

Status
Nicht offen für weitere Antworten.

babuschka

Top Contributor
Hallo,

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?

Code:
for(int i=0;i<hoehe;i++)
{
	for(int j=0;j<breite;j++)
	{	

               symbole[-1][j] = symbole[hoehe-1][j];
               energieFische[-1][j] = energieFische[hoehe-1][j];
               symbole[hoehe][j] = symbole[0][j];
               energieFische[hoehe][j] = energieFische[0][j];
               symbole[i][-1] = symbole[i][breite-1];
               energieFische[i][-1] = energieFische[i][breite-1];
               symbole[i][breite] = symbole[i][0];
               energieFische[i][breite] = energieFische[i][0];


               [...]

Danke & Gruß
DSOA
 
Sowas wie

Code:
if (i >= symbole.length) {
   i = 0;
}
else if (i < 0) {
   i = symbole.length - 1;
}
if (j >= symbole[i].length) {
   j = 0;
}
else if (j < 0) {
   j = symbole[i].length - 1;
}
 
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
Code:
if(symbole[i-1][j] == ' ' || symbole[i][j+1] == ' ' || symbole[i+1][j] == ' ' || symbole[i][j-1] == ' ')
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 🙁
 
Modulo.

Modulo. Modulo. Modulo.

Modulo?

Modulo!!

… Kapiert?! 😎

BTW: Das klingt nach WaTor …

Ark
 
Yo, Wator 😉

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...
 
Mal so ein Tipp:

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 …

Sind jetzt alle Klarheiten beseitigt?! 😀

MfG
Ark
 
Hei cool, also ich hab das Prinzip verstanden aber bekomme es nur zur Hälfte hin, aus folgendem Grund:

Wenn ich nicht wie bisher
Code:
for(int i=0;i<hoehe;i++)
	{
		for(int j=0;j<breite;j++)
		{	
                         symbole[i+1][j]
sondern
Code:
for(int i=0;i<hoehe;i++)
	{
		for(int j=0;j<breite;j++)
		{	
                         symbole[(i+1)%hoehe][j]
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.

Doch was ist z.B. mit
Code:
for(int i=0;i<hoehe;i++)
	{
		for(int j=0;j<breite;j++)
		{	
                         symbole[(i-1)%hoehe][j]
(für i = 0) ??? Dann steht da im Prinzip
Code:
symbole[-1][j]
am Ende und der Modulo hat mir nichts gebracht...

Vielleicht wieder ein Rätsel? 😀 Würde aber auch ne klare Antwort akzeptieren 😉
 
Kann mir denn keiner weiterhelfen?? Also nochma:

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? ^^
 
Schreibe statt:

Code:
symbole[(i-1)%hoehe][j]

Code:
symbole[(i-1+hoehe)%hoehe][j]
 
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!?
 
Wieso sagt der Compiler mir, dass ich in dieser Zeile die Grenze des Arrays überschreite? Ich versteh das nich :bahnhof:
 
Fehler gefunden...

Falsch:
Code:
symbole[i][(j+1%breite)] == ' '
Richtig:
Code:
symbole[i][(j+1)%breite] == ' '

Wie immer, ne Kleinigkeit, die man erst nach stundenlanger Verzweiflung findet :bae:
 
Code:
j+1%breite
:shock:
Versuch's mal mit

Code:
(j+1)%breite
😎
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben