Schiffe versenken - Zufallszahlen in einem Array

Shao

Mitglied
Guten Abend, ich bin dabei eine sehr einfache Version von Schiffe versenken zu programmieren bekomme aber immer beim zufälligen belegen meines x*x großen Feldes komische Werte.
Bei einem 10*10 Feld zb. bekomme ich entweder 0,3 oder 10 Felder mit schiffen (10 sollen es seien) aber er zeigt mir immer an das er 10 mal die 1 gesetzt hat. Ich suche schon echt lange rum aber der Fehler kommt mir einfach nicht in den Schädel.

Im Code ist das zufallszeug in der initFeldZwei



Java:
public class SchiffeVersenken {
    public static void main(String[] args) {
        System.out.println("Bitte die Seitenlaenge des Feldes eingeben: ");
        int seitenlaenge = 10;//IO.readInt();
        int maxSchiffe = (seitenlaenge * seitenlaenge) / 10;
        String[][] spielfeldSpielerEins = initFeldEins(seitenlaenge, maxSchiffe);
        String[][] spielfeldSpielerZwei = initFeldZwei(seitenlaenge, maxSchiffe);
        //System.out.println("Bis wieviel wollen sie spielen ? :");
        ausgabe(spielfeldSpielerZwei);
    }

    static String[][] initFeldEins(int seitenlaenge, int schiffe) {
        return new String[seitenlaenge][seitenlaenge];
    }

    static String[][] initFeldZwei(int seitenlaenge, int maxSchiffe) {
        int schiffZaehler = 0;
        String[][] feldZwei = new String[seitenlaenge][seitenlaenge];
        for (int a = 0; a < feldZwei.length; a++) {
            for (int b = 0; b < feldZwei[a].length; b++) {
                feldZwei[a][b] = "";
            }
        }
        while (schiffZaehler < maxSchiffe) {
            for (int a = 0; a < feldZwei.length; a++) {
                for (int b = 0; b < feldZwei[a].length; b++) {
                    if (schiffZaehler < maxSchiffe && !feldZwei[a][b].equals("1") && getZufallsZahl() == 1) {
                        feldZwei[a][b] = "1";
                        schiffZaehler++;
                    }
                    else {
                        feldZwei[a][b] = "0";
                    }
                }
            }
        }
        System.out.println(schiffZaehler);
        return feldZwei;
    }

    static boolean treffer(String feld[][], int x, int y) {
        return feld[x][y].equals("1");
    }

    static int getZufallsZahl() {
        if ((int) (Math.random() * 10) >= 9) {
            return 1;
        } else {
            return 0;
        }
    }

    static void ausgabe(String feld[][]) {
        for (int a = 0; a < feld.length; a++) {
            for (int b = 0; b < feld[a].length; b++) {
                System.out.print(feld[a][b] + "\t");
            }
            System.out.println();
        }
    }
}

Vllt sieht ja einer der erfahrenen Programmier den Fehler sofort 🙂
Mit freundlichen Grüßen
 
Zuletzt bearbeitet:
Ich verstehe gar nicht, wie Du darauf kommst, der Code würde Schiffe bestimmter Größe irgendwie setzen. Letztlich belegst Du die Felder Deines Spielfelds zufällig mit 10 %-iger Wahrscheinlichkeit mit "1"en bzw. mit 90 %-iger Wahrscheinlichkeit mit "0"en.
 
ja in dem fall sind die schiffe nur ein feld groß. 1 = schiff , 0 = kein schiff. Aber er soll das ganze ja solange machen bis er 10 (feldzahl/10) schiffe gesetzt hat. aber er setzt immer 0,3 oder 10 Schiffe
 
Naja, Du überschreibst ja auch ggf. ein bereits gesetztes Feld wieder mit "0".

Nachtrag: hier übrigens eine Ausgabe
Code:
10
0    1    0    0    0    0    0    0    0    0   
0    0    0    0    1    0    0    0    0    0   
0    0    0    0    0    0    0    0    0    0   
0    0    0    0    0    0    0    0    0    0   
0    0    0    0    0    0    0    0    0    0   
0    0    0    0    0    0    0    0    0    0   
0    0    0    0    0    0    0    0    0    0   
0    0    0    0    0    0    0    0    0    0   
0    0    0    0    0    0    0    0    0    0   
0    0    0    0    0    0    0    0    0    0
Hier sind z. B. nur 2 Einsen zu sehen.
 
ahh stimmt ich sehs. Habe jetzt mal die frage ergänzt und nun scheint es zu gehen

Java:
        } else if (feld[a][b].equals("1")) {
                        feld[a][b] = "1";
                    } else {
                        feld[a][b] = "0";
                    }
 
Java:
else if (feld[a][b].isEmpty()) {
    feld[a][b] = "0";
}
sollte reichen.

Nachtrag: noch einfacher wäre es, Du würdest einfach das Spielfeld statt mit leeren Strings gleich mit "0" initialisieren...
 

Zurück
Oben