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
 

njans

Top Contributor
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:

malihini

Mitglied
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;
}
...
 

malihini

Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Hangman-Spiel-zufälliges Wort ermitteln Java Basics - Anfänger-Themen 4
L Zufälliges 2d array befüllen Java Basics - Anfänger-Themen 27
O zufälliges Wort aus einer Datei einlesen Java Basics - Anfänger-Themen 32
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
Curtis_MC Collections Zufälliges Element aus Stack Java Basics - Anfänger-Themen 2
A Zufälliges Objekt basierend auf Wahrscheinlichkeiten bekommen. Java Basics - Anfänger-Themen 4
P Zufälliges Wort direkt aus einer Liste ausgeben Java Basics - Anfänger-Themen 9
StrikeTom Zufälliges Alphabet erzeugen Java Basics - Anfänger-Themen 6
M Zufälliges Auswählen von Textfields Java Basics - Anfänger-Themen 5
H zufälliges Array in ein 2D Array schreiben Java Basics - Anfänger-Themen 4
C Anker Punkt setzen. Java Basics - Anfänger-Themen 1
J neues Object (JLabel) vorab zum Layout hinzufügen , Location setzen, etc? Java Basics - Anfänger-Themen 2
H Ein übergegebenes Objekt auf null setzen Java Basics - Anfänger-Themen 9
B Semaphoren in Abhängigkeit an Bedingungen richtig setzen Java Basics - Anfänger-Themen 3
L Methode in setText() setzen Java Basics - Anfänger-Themen 6
L Anzahl der benachbarten Minen berechnen und setzen Java Basics - Anfänger-Themen 15
S NIO lesbares und beschreibbares Attribut setzen Java Basics - Anfänger-Themen 1
C Array-Eintrag wieder auf Null setzen Java Basics - Anfänger-Themen 3
D Abstrakte Klasse, Konstruktorkette, Attribute setzen Java Basics - Anfänger-Themen 12
D Best Practice Konvention - Klassenmembers auf null setzen? Java Basics - Anfänger-Themen 2
F In Eclipse Haltepunkt bei Event setzen? Java Basics - Anfänger-Themen 1
das_leon JOptionPane Titel setzen Java Basics - Anfänger-Themen 1
P Cursor in JTextField setzen Java Basics - Anfänger-Themen 11
N wert für progress auf 100% setzen Java Basics - Anfänger-Themen 5
M Binären Baum Kinder setzen Java Basics - Anfänger-Themen 12
F Koordinaten nach 360° auf 0° setzen Java Basics - Anfänger-Themen 2
I Prozessname setzen Java Basics - Anfänger-Themen 8
S Das Anführungszeichen(") Zeichen in einen String setzen Java Basics - Anfänger-Themen 1
R Property Value als null setzen Java Basics - Anfänger-Themen 1
C Klassen Positionszähler auf Buchstaben setzen Java Basics - Anfänger-Themen 14
M Umgebungsvariable JDK/JRE? PATH setzen Java Basics - Anfänger-Themen 5
N Server Zeit zur lokalen Zeit setzen. Java Basics - Anfänger-Themen 0
S Classpath Findet die Klasse nicht classpath setzen? Java Basics - Anfänger-Themen 8
F Erste Schritte Label Text vor Methodenaufruf setzen Java Basics - Anfänger-Themen 17
I Date zu 01.01.<year> setzen Java Basics - Anfänger-Themen 1
C [Greasmonkey] Maus Coursor position setzen Java Basics - Anfänger-Themen 1
K Selbst renderndes Object auf null setzen Java Basics - Anfänger-Themen 1
M Umgebungsvariable JFileChooser#setCurrentDirectory via Properties setzen? Java Basics - Anfänger-Themen 5
M Wann PATH und wann JAVA_HOME in Windows System 7 setzen? Java Basics - Anfänger-Themen 2
M Die Breite bei der Gui richtig setzen. Java Basics - Anfänger-Themen 1
X Vererbung Setzen auf Null bei Subklassen Java Basics - Anfänger-Themen 2
N Fokus setzen nachdem JFrame in Vordergrund geholt wurde Java Basics - Anfänger-Themen 7
I Variablen Wie initialisiert man in Java eine Variable ohne das Setzen von 0 oder einer anderen Zahl? Java Basics - Anfänger-Themen 8
H JPanel Hintergrund transparent setzen? Java Basics - Anfänger-Themen 10
R Classpath Setzen von class Verzeichnissen Java Basics - Anfänger-Themen 2
H KeyListener auf ganzes Fenster setzen Java Basics - Anfänger-Themen 14
Ernesto95 BufferedImage Teilbereich wieder transparent setzen Java Basics - Anfänger-Themen 16
Jagson Dotcom Spiel - Dots Random setzen Java Basics - Anfänger-Themen 8
S Ermitteln und Setzen der Attribute eines Objektes Java Basics - Anfänger-Themen 6
N Erste Schritte Tausender Trennzeichen setzen Java Basics - Anfänger-Themen 5
J JRadioButton in JTable setzen Java Basics - Anfänger-Themen 4
A JLabel erst auf null dann auf einen Wert setzen Java Basics - Anfänger-Themen 7
H Panel in Variable setzen möglich? Java Basics - Anfänger-Themen 10
Helgon Focus setzen Java Basics - Anfänger-Themen 6
E Erste Schritte AbstractTableModel Werte setzen mit setValueAt Java Basics - Anfänger-Themen 10
B eclipse Oberfläche zurück setzen Java Basics - Anfänger-Themen 2
C Leerzeichen im char Array setzen Java Basics - Anfänger-Themen 33
L Methoden In einer Klasse ein Attribut aus einer anderen Klasse setzen Java Basics - Anfänger-Themen 8
M TableColumn Breite setzen Java Basics - Anfänger-Themen 9
M Monat setzen Java Basics - Anfänger-Themen 18
Fab1 Buttons auf ein Hintergrundbild(JFrame) setzen Java Basics - Anfänger-Themen 24
U Passwort auf JButton setzen. Java Basics - Anfänger-Themen 2
M JAVA_HOME setzen xubuntu Java Basics - Anfänger-Themen 2
S Input/Output Neuen InputStream System.in setzen Java Basics - Anfänger-Themen 11
K JTable AbstractTableModel Header setzen Java Basics - Anfänger-Themen 6
L Applet: Parameter setzen Java Basics - Anfänger-Themen 12
M Image Metadaten setzen Java Basics - Anfänger-Themen 2
M HttpPut mimeType setzen Java Basics - Anfänger-Themen 2
E Titel und Größe vom JFrame setzen Java Basics - Anfänger-Themen 6
Z Fokus auf anderes Programm setzen Java Basics - Anfänger-Themen 3
S import - Anweisung; Setzen der Classpath Java Basics - Anfänger-Themen 2
N Objectnamen neu setzen? Java Basics - Anfänger-Themen 20
G Verzeiflung bei JDateChooser Datum setzen Java Basics - Anfänger-Themen 3
J Elegante Art mehrere Label mit einem icon zu setzen Java Basics - Anfänger-Themen 13
J JAVA_HOME und path setzen bei windows 7 Java Basics - Anfänger-Themen 5
radiac Datentypen RANDOM-punkt setzen INNERHALB eines BEREICHes Java Basics - Anfänger-Themen 2
D Classpath setzen Java Basics - Anfänger-Themen 4
W Koordinaten mit System.in.read() setzen Java Basics - Anfänger-Themen 2
J jComboBox auf default setzen wie? Java Basics - Anfänger-Themen 3
C Schach(matt) setzen Java Basics - Anfänger-Themen 13
D JFrame Icon setzen? Java Basics - Anfänger-Themen 8
L Lucene Classpath unter linux setzen Java Basics - Anfänger-Themen 8
H Farbe setzen Java Basics - Anfänger-Themen 5
J Klassen richtig in Relation setzen Java Basics - Anfänger-Themen 3
B Classpath setzen - UNTER MAC OS X Java Basics - Anfänger-Themen 2
R jLabel lässt sich nicht public setzen?? Java Basics - Anfänger-Themen 15
S JRadioButton - Wert setzen aus Datenbank Java Basics - Anfänger-Themen 4
N Exception richtig setzen Java Basics - Anfänger-Themen 2
S Schleife und farbwerte setzen Java Basics - Anfänger-Themen 8
S setrgb () setzen von farbwerte Java Basics - Anfänger-Themen 4
R Enum und dann setter Setzen? Java Basics - Anfänger-Themen 44
S Pixel auf Screen setzen Java Basics - Anfänger-Themen 4
J Dateipfade systemunabhängig setzen Java Basics - Anfänger-Themen 3
F JAVA_HOME automatisch setzen? Java Basics - Anfänger-Themen 2
M Offenes JFrame auf visible setzen? Java Basics - Anfänger-Themen 6
schroedi JAVA_HOME setzen unter Debian Java Basics - Anfänger-Themen 8
H Probleme, TableColumn-Breite zu setzen Java Basics - Anfänger-Themen 4
S log4j pfad per umgebungsvariable setzen? Java Basics - Anfänger-Themen 2
L Windows-Umgebungsvariablen mit Java setzen? Java Basics - Anfänger-Themen 11
S BBCodes in einen String setzen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben