# Felder kontrollieren



## VdA (15. Nov 2006)

Beim Schiffe versenken dürfen die Schiffe nicht direkt nebeneinander
gesetzt werden das habe ich für den Computer so geschrieben:

```
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!


----------



## AlArenal (15. Nov 2006)

Ich glaub ich bin blind!!!


----------



## SlaterB (15. Nov 2006)

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 (15. Nov 2006)

da muss eine endlosschleife drin sein!
so funzt es nämlich nur sind die Schife zt direkt nebeneinander

```
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;
		
	}
```


----------



## SlaterB (15. Nov 2006)

> 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


----------



## VdA (15. Nov 2006)

aber ich habe 100 Felder und nur 17 davon sollen belegt werden


----------



## SlaterB (15. Nov 2006)

hochinteressant


----------



## VdA (15. Nov 2006)

und?


----------



## SlaterB (15. Nov 2006)

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)


----------

