random in mehrdimensionalem array platzieren(java)?


08.05.2020, 22:35

.


08.05.2020, 22:51

.

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Hey, ich verstehe deine Frage nicht so ganz.
Ist das dort schon dein code, oder der vorgegebene aus der Main.java?

Und was möchtest du am Ende erreichen? Vielleicht nochmal etwas verständlicher erklären :)

Woher ich das weiß:Hobby – Fasziniert von der Programmierung, PC's, Gaming und co.
Arman640 
Fragesteller
 08.05.2020, 22:43

der main.java war schon vorgegben und ich muss nur die todos machen. und Am ende will ich ein "schiffeversenken" Spiel erstellen. der benutzer gibt zum beispiel ein koordinate 4-5 und wenn dort ein schiff ist steht dann z.b. "getroffen".

0
thehelpingmon  08.05.2020, 22:46
@Arman640

Und wo sind im Code die TODOS markiert?

War das array und der Code mit dem 7x7 Spielfeld ebenfalls vorgegeben? Das hätte man viel kürzer mit einer loop lösen können

0
Arman640 
Fragesteller
 08.05.2020, 22:44

aber ich nur dass, 3 der 49 felder mit einem random zufällig die zielscheibe werden und der spieler raten muss auf welch dieser felder ein schiff ist.

0
thehelpingmon  08.05.2020, 22:50
@Arman640

du kannst mit der rand.nextInt() methode einen zufälligen Int bekommen. Das musst du zweimal machen um x und y coordinaten zu bekommen.

Int x1 = rand.next(0, 7);
Int y1 = rand.next(0, 7);
spielfeld[x1][y1] = true;

Damit setzt du den wert bei den zufälligen coordinaten auf true (wahr = da ist ein Schiff). Dann musst du aber alle anderen werte von true auf false setzten.

Den Code oben kannst du x beliebig oft ausführen (mit einer loop) und an verschiedenen Orten (zufälligen Orten) schiffe platzieren.

Dann musst du die x und y coordinate des users bekommen. Und prüfst auf dem spielfeld, welchen wert dieser Ort/ Location hat. Wenn true, dann ist dort ein schiff! Ansonsten eben nicht.

Int userX = 5;
Int userY = 3;  
if(spielfeld[userX][userY] == true)
//getroffen!
else
//daneben!
0
Arman640 
Fragesteller
 08.05.2020, 22:53

ich hab die ganze aufgabe eingefügt

0
thehelpingmon  08.05.2020, 22:56
@Arman640

Ich habe dir mit dem Code oben schon gut geholfen, versuch das so umzusetzen, sollte eigentlich kein großes Problem darstellen.

Geh Schritt für Schritt durch.

0
Arman640 
Fragesteller
 08.05.2020, 23:01

es ist bisschen zu schwer für mich. ich versteh nicht genau was du meist, ich will dass einfach einer der arrays eine zielscheibe wird.

0
thehelpingmon  08.05.2020, 23:12
@Arman640

ich kann dir jetzt leider keinen fertigen Copy Paste code liefern, da ich kein Java mehr programmiere und den Sytaxt nicht genau kenne.

Das ist der erste Schritt:

//TODO: place ship
spielfeld[shipX][shipY] = false;

Das das nächste:

//TODO process Input (das erste: X)
int inputX = Integer.parseInt(System.console().readLine());
//TODO process Input (das zweite: Y)
int inputY = Integer.parseInt(System.console().readLine());

//check position...
if(spielfeld[inputX][inputY] == false) {
hitcounter++;
System.out.print("Volltreffer :)!");
} else {
System.out.print("Schiff verfehlt :(!");
}

Zuletzt noch die Sieges Nachricht, die kommt ganz einfach unter die while-loop

while(hitCounter < numOfShips) {
//hier steht der code 
}
System.out.print("Alle schiffen versunken, du hast gewonnen!");

Das solltest du jetzt nahezu 1:1 kopieren können.

0

Du willst also in einem zweidimensionalen 7x7-Array drei verschiedene Elemente zufällig auf true setzen. Das lässt sich folgendermaßen umsetzen:

var field = new boolean[7][7];
var random = ThreadLocalRandom.current();

random.ints(0, 49)
        .distinct()
        .limit(3)
        .forEach(n -> field[n % 7][n / 7] = true);

Alternative ohne Streams:

var field = new boolean[7][7];
var random = ThreadLocalRandom.current();

Set<Integer> randomInts = new HashSet<>();

while (randomInts.size() < 3) {
    randomInts.add(random.nextInt(0, 49));
}

for (int n : randomInts) {
    field[n % 7][n / 7] = true;
}

Funktionsweise:

  • Es werden drei verschiedene Zufallszahlen zwischen 0 und 49 generiert. Um das sicherzustellen, wird entweder die distinct-Methode von Streams oder ein Set genutzt.
  • Aus jeder Zufallszahl wird dann der x- und y-Wert des Elements bestimmt. Stelle dir vor, dass du die erste Zeile von 0 bis 6 nummerierst, die zweite von 7 bis 13 usw.
  • Die jeweiligen Elemente werden auf true gesetzt.

Weitere Alternative, falls dies noch zu kompliziert ist:

var field = new boolean[7][7];
var random = ThreadLocalRandom.current();

int shipsPlaced = 0;

while (shipsPlaced < 3) {
    int x = random.nextInt(0, 7);
    int y = random.nextInt(0, 7);

    if (!field[x][y]) {
        field[x][y] = true;
        ++shipsPlaced;
    }
}