Felder kontrollieren

Status
Nicht offen für weitere Antworten.

VdA

Bekanntes Mitglied
Beim Schiffe versenken dürfen die Schiffe nicht direkt nebeneinander
gesetzt werden das habe ich für den Computer so geschrieben:
Code:
	boolean kontrolliereFelder(int anfang_x, int anfang_y, int ende_x, int ende_y, Feld[][] felder)
	{
		boolean frei=true;
		for(int x1=anfang_x;x1<=ende_x;x1++)
		{
			for(int y1=anfang_y;y1<=ende_y;y1++)
			{
				
				
				frei=danebenFrei(x1, y1,felder);
				
				
				if(!frei)
				{
					System.out.println("ende2 "+frei);
					break;
				}
			}
			if(!frei)
			{
				System.out.println("ende1 "+frei);
				break;
			}
		}
		System.out.println("ende "+frei);
		return frei;
		
	}
	boolean danebenFrei(int x, int y, Feld[][] felder)
	{
		boolean frei=false;
		if(!felder[x][y].getShip())
		{
			if(!felder[x][y-1].getShip() || y-1 <= 0)
			{
				if(!felder[x][y+1].getShip() || y+1 >= 11)
				{
					if(!felder[x-1][y].getShip() || x-1<=0)
					{
						if(!felder[x+1][y].getShip() || x+1 >= 11)
						{
							frei=true;
							
							return true;
						}
					}	
				}
			}
			
		}
		return false;
	}
nur leider hängt er sich in einer dieser Methoden auf und macht nix aber volle Cpu auslasten
bitte um Hilfe!
 
S

SlaterB

Gast
if(!felder[x][y-1].getShip() || y-1 <= 0)

das < 0 solltest du vor dem Zugriff auf das Array prüfen, sonst gibts ne Exception,
wieso aber auch = 0 prüfen? ist die 0. Reihe anders als die anderen?

---------

eine Endlosschleife ist auf den ersten Blick nicht sichtbar,
aber versuche doch mal Ausgaben a la

for(int x1=anfang_x;x1<=ende_x;x1++)
{
System.out.println("aeussere Schleife, x1 = "+x1);
...

dann siehst du vielleicht genauer, an welcher Stelle es hakt
 

VdA

Bekanntes Mitglied
da muss eine endlosschleife drin sein!
so funzt es nämlich nur sind die Schife zt direkt nebeneinander
Code:
boolean kontrolliereFelder(int anfang_x, int anfang_y, int ende_x, int ende_y, Feld[][] felder)
	{
		if(true)
		return true;
		boolean frei=true;
		for(int x1=anfang_x;x1<=ende_x;x1++)
		{
			for(int y1=anfang_y;y1<=ende_y;y1++)
			{
				System.out.println("Feld "+x1+" "+y1);
				
				frei=danebenFrei(x1, y1,felder);
				
				
				if(!frei)
				{
					System.out.println("ende2 "+frei);
					break;
				}
			}
			if(!frei)
			{
				System.out.println("ende1 "+frei);
				break;
			}
		}
		System.out.println("ende "+frei);
		return frei;
		
	}
 
S

SlaterB

Gast
> da muss eine endlosschleife drin sein!

das glaube ich dir gerne, vielleicht ist sie aber auch in dem unsichtbaren Code
getShip(),

vielleicht liefert die Operation korrekt false,
nur wird sie weiter außerhalb nicht akzeptiert und ewig nach einer freien Stelle gesucht obwohl alle Felder belegt sind?

wie auch immer, es ist mühsam, in reinen Text nach dem Fehler zu suchen,
die vorgeschlagene Methode mit den System.out.println ist
a)
absolut verlässlich
b)
du kannst sie selber durchführen und musst niemand anderen bemühen
(vielleicht eher als Nachteil zu sehen? ;) )

falls die Ausgaben irgendwann mal zu viele sind (hunderte pro Sekunden),
kann man System.out.println()
noch mit Thread.sleep(200) kombinieren
 
S

SlaterB

Gast
hochinteressant und eigentlich völlig irrevelant,

benutze System.out.println wie angegeben,
dann siehst du wo die Endlosschleife auftritt

(keine neue Infomation in diesem Post)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben