zufälliges Setzen von Schiffen in while klappt nicht immer

malihini

Mitglied
Hallo an Alle,
ich möchte Schiffe mit einer while setzen. Das klappt auch meistens.
Manchmal wird mir ein Schiff nicht gesetzt, obwohl ich einen kompletten Durchlauf erzwinge(denke ich jedenfalls).
---------------------------------------------------------------------------------------------
if ((int)((Math.random()*50)%2) == 1) { //zufällige Ausrichtung der Schiffe
ink = feldbreite; //senkrechtes Inkrement
isSenkrecht = true;
}
int zs = 0; //zs = ZelleSchiff
while(!isSchiffGesetzt && versuche++ < (200+spielfeldGröße-1)){ //solange versuchen, bis Platz für Schiff gefunden
isSchiffGesetzt = true;
if(versuche <= 200) {
zs = (int)(Math.random()*spielfeldGröße);
}
if(versuche > 200){
zs = versuche-200;
isSenkrecht = !isSenkrecht;
}
int x = 0; //Zähler für Schiffsteile
while (isSchiffGesetzt && x < schiffLaenge) {
if(zs < spielfeldGröße){
if(spielfeld[zs] == 0){
zellenSchiff[x] = zs;
if(x > 0 && (zs % feldbreite == 0)){//über rechten Rand
isSchiffGesetzt = false;
}
if(zs < spielfeldGröße && spielfeld[zs] != 0){
isSchiffGesetzt = false; //prüfen, ob nächste Zellen frei sind
}
zellenSchiff[x++] = zs;
zs = (zs+ink);
} else isSchiffGesetzt = false;
​
} else isSchiffGesetzt = false;
​
}
}

----------------------------------------------------------------------------------------------
zuerst wird die Ausrichtung der Schiffe zufällig gesetzt
in der äußeren while wird das erste Startfeld zufällig bestimmt und bei mehr als 200 Versuchen soll der Durchlauf des gesamten Feldes erzwungen werden (ich sehe ja bei der Ausgabe des Spielfeldes noch viel freien Platz - Platzmangel herrscht also nicht).
Das Problem ist, es werden manchmal nicht alle Schiffe gesetzt.
Ich hab' mit in der zweiten while schon die "zs" ausgeben lassen , es geht ordentlich alle Werte durch, setzt aber kein Schiff.
Woran kann das liegen? Weiß jemand Hilfe oder Rat?

Ich hoffe, ich konnte mein Problem deutlich machen.
Für jede Anregung und Hilfe bin ich dankbar.
liebe Grüße
 
Java™ Quelltext ist bitte in
Java:
-Tags zu schreiben: [code=Java]hier Java Code einfügen

Java:
if ((int)((Math.random()*50)%2) == 1) { //zufällige Ausrichtung der Schiffe
  ink = feldbreite; //senkrechtes Inkrement
  isSenkrecht = true;
}
int zs = 0; //zs = ZelleSchiff
while(!isSchiffGesetzt && versuche++ < (200+spielfeldGröße-1)){ //solange versuchen, bis Platz für Schiff gefunden
  isSchiffGesetzt = true;
  if(versuche <= 200) {
    zs = (int)(Math.random()*spielfeldGröße);
  }
  if(versuche > 200){
    zs = versuche-200;
    isSenkrecht = !isSenkrecht;
  }
  int x = 0; //Zähler für Schiffsteile
  while (isSchiffGesetzt && x < schiffLaenge) {
    if(zs < spielfeldGröße){
      if(spielfeld[zs] == 0){
        zellenSchiff[x] = zs;
        if(x > 0 && (zs % feldbreite == 0)){//über rechten Rand
          isSchiffGesetzt = false;
       }
       if(zs < spielfeldGröße && spielfeld[zs] != 0){
         isSchiffGesetzt = false; //prüfen, ob nächste Zellen frei sind
       }
       zellenSchiff[x++] = zs;
       zs = (zs+ink);
     } else isSchiffGesetzt = false;
   } else isSchiffGesetzt = false;
}
}

Der Code ist grausig:
- inkonsistente Variablennamen: Deutsch/Englisch, Abkürzungen/Ausgeschrieben
- Einrückung ist unleserlich
- Unnötig lang geschrieben

Random zu verwenden sorgt für nicht diskretes Verhalten
 
Zuletzt bearbeitet:
Danke für die ordentliche Darstellung des Quelltextes.

Noch etwas ist mir aufgefallen:
Wenn ich das "Erzwingen" von zs in die äußere while schreibe, wird ein Wert für das Schiff genommen, aber nicht weitergezählt. Das Schiff dann z.B. die Koordinaten (12,12,12), also immer nur der erste Wert.
Java:
while(!isSchiffGesetzt && versuche++ < (200+spielfeldGröße-1)){
...
if(versuche > 200){
    	zs = versuche-200;
	isSenkrecht = !isSenkrecht;
}
...
 
Danke für die ordentliche Darstellung des Quelltextes.

Noch etwas ist mir aufgefallen:
Wenn ich das "Erzwingen" von zs in die äußere while schreibe, wird ein Wert für das Schiff genommen, aber nicht weitergezählt. Das Schiff dann z.B. die Koordinaten (12,12,12), also immer nur der erste Wert.
Java:
while(!isSchiffGesetzt && versuche++ < (200+spielfeldGröße-1)){
...
if(versuche > 200){
    	zs = versuche-200;
	isSenkrecht = !isSenkrecht;
}
...

Weiß da jemand Rat?
Danke schon im Voraus
 

Neue Themen


Zurück
Oben