Hab es jetzt so versucht, aber klappt irgendwie trotzdem noch nicht so richtigDie Frage hast du dir schon beantwortet
Java:do { ... } while (!bedingung)
do {
int col1 = (int) (Math.random()*3)+1;
if (fields[col1-1] [col1-1] != TREASURE || fields [col1+1] [col1+1] != TREASURE || fields [col1] [col1] != TREASURE) {
fields [col1] [col1] = TREASURE;
treasurnr++;
}
}
while (!(treasurnr >= 4));
Lässt sich diese Fehlerbeschreibung präzisieren?klappt irgendwie trotzdem noch nicht so richtig
!(treasurnr >= 4)
könnte man auch schreiben treasurnr < 4
. Das ist leichter zu erfassen und zu verstehen, wenn keine zus. Negation dabei ist.Muss auf dieses Spielfeld insgesamt 8 mal das O bekommen und 4 davon sollen aneinander hängen, die anderen 4 sich aber nicht vertikal oder horizontal berühren und es werden mit meinem jetzigen Code nie 4 O's ausgegeben, welche sich nicht vertikal oder horizontal berühren, sondern meistens nur 2Lässt sich diese Fehlerbeschreibung präzisieren?
Anstatt!(treasurnr >= 4)
könnte man auch schreibentreasurnr < 4
. Das ist leichter zu erfassen und zu verstehen, wenn keine zus. Negation dabei ist.
Erweitern Sie den Standardkonstruktor von Board, so dass die vorgegebenen Schätze (4 kleine und 1 großer) auf dem Board platziert werde. Der Konstruktor von Board füllt bisher das Spielfeld nur mit leeren Feldern. Wie Sie sehen, ist das Spielfeld als zweidimensionaler Array realisiert. Der Konstruktor soll nun die Schätze zufällig auf dem Spielfeld platzieren. Die kleinen Schätze sollen dabei genau ein Feld belegen. Der größere Schatz soll 4 zufällig ausgewählte aneinanderhängende Felder belegen (hier müssen mindestens 3 Varianten der Platzierung umgesetzt werden. 2 Varianten sind in Abbildung 1b) und 1c) dargestellt). Achten Sie darauf, dass die Schätze nicht vertikal oder horizontal direkt aneinander angrenzen und der große Schatz nicht aus dem Spielfeld herausragt. Bearbeitungshinweise: - Die Ausgabe Board.print() ist bereits implementiert. Sobald Sie Schätze platzieren, können Sie diese daher automatisch in der Ausgabe sehen. - Beginnen Sie mit einer Funktionalität und setzen Sie diese vollständig um. Erweitern Sie Ihren Code schrittweise. Überprüfen Sie beispielsweise im nächsten Schritt, ob sich ein neu zu platzierender Schatz mit einem bereits platzierten Schatz überschneidet und wählen Sie eine neue Position, falls dies der Fall ist. - Achten Sie darauf, dass Ihr Code immer ausführbar bleibt. Alles auf einmal zu implementieren ist fehleranfällig.Ich kann mal bisschen "rumprobieren" wenn du die gesamte Aufgabenstellung zeigst.
public class Board {
public static final char EMPTY = '.';
public static final char TREASURE = 'O';
public static final char HIT = 'X';
public static final char NO_TREASURE_FOUND = '-';
public static final int TREASURENR = 4;
public static final int BOARD_SIZE = 5;
private final char[][] fields = new char[BOARD_SIZE][BOARD_SIZE];
public Board() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
fields[i][j] = EMPTY;
}
}
}
public void print(boolean hideShips) {
/* print column headers A - J */
System.out.print("# ");
for (int x = 0; x < fields[0].length; x++) {
char column = (char) (x + 65);
System.out.print(" " + column);
}
System.out.println();
for (int y = 0; y < fields.length; y++) {
/* print row number */
int rowNumber = y + 1;
System.out.print(rowNumber + " ");
if (rowNumber < 10) System.out.print(" ");
/* print row */
for (int x = 0; x < fields[y].length; x++) {
char output = fields[x][y];
if (output == TREASURE && hideShips)
output = EMPTY;
System.out.print(output + " ");
}
System.out.println();
}
}
Den großen Schatz hab jetzt bereits mit Variante a hinzugefügt aber dankeBeschäftige Dich doch erst einmal nur mit der Frage nach dem großen Schatz. Wie kann man den festlegen?
Dazu kann man es doch mit Stift und Zettel einfach etwas durchspielen!
Du wirst doch manuell irgend etwas hin kriegen.
Noch einmal: Es ist existenziell, dass man sich die möglichen Schritte einer Lösung überlegt.
Wenn ich mir hier das Problem überlege, dann fallen mir ganz viele Möglichkeiten ein:
a) Es gibt diverse Varianten. Die Varianten erfasse ich einfach in meinem Programm. Und dann wird einfah eine Variante per Zufall ausgesucht, ggf. gedreht und dann zufällig plazziert.
b) Ich lasse es komplett den Zufall entscheiden. Ich erfasse einfach einen ersten Zufallspunkt. Das ist dann der erste Punkt. Und dann ermittel ich immer weiter einen zufälligen Punkt und prüfe, ob dieser an dem Schatz dran ist und noch nicht belegt wurde. Ist das der Fall, dann füge ich den Punkt hinzu. Das mache ich so lange, bis 4 zusammenhängende Punkte gefunden wurden.
c) Ich ermittel einen Startpunkt. Das ist der erste. Per Zufall wird dann eine Richtung ausgewählt. Da kommt dann der nächste Punkt hin so dieser gültig ist (noch nicht belegt und innerhalb des Spielfeldes).
Es gibt also sehr viele Wege.
Wenn der große Schatz einmal belegt ist, dann kann man sich überlegen, wie man die übrigen setzt. Das ist aber dann erst danach. Aber einfach zufällig einen Punkt auswählen und prüfen, ob die Bedingungen erfüllt sind, das sollte ja gehen....
Ok, also dann zu den kleinen Schätzen: hast du da Ideen entwickelt?Den großen Schatz hab jetzt bereits mit Variante a hinzugefügt aber danke
Ja eine Schleife mit kleinem Schatzcounter öffnen die solange läuft und neue Zufallszahlen generiert, welche auf angrenzende Schätze überprüft werden bis 4 kleine Schätze verteilt wurden, also der Counter auf 4 ist, aber kriege das nicht als Code hinOk, also dann zu den kleinen Schätzen: hast du da Ideen entwickelt?
Ich bin gerade gedanklich noch bei dem großen Schatz und Stolper etwas über die Angabe und deine do-While von oben.
TREASURENR = 4
Hast du also irgendwo noch einen "Counter", z.B. int trasurnr=0;
Zeig doch mal deine Lösung für den großen Schatz.![]()
public Board() {
int col = (int) (Math.random()*3)+1;
int row = (int) (Math.random()*5);
int bigtreasure = (int) (Math.random()*7);
int chose =2; //(int) (Math.random()*2);
int treasurenr = 0;
System.out.println(col);
System.out.println(row);
System.out.println(bigtreasure);
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
fields[i][j] = EMPTY;
if (bigtreasure == 0) {
fields [0] [col] = TREASURE;
fields [1] [col] = TREASURE;
fields [2] [col] = TREASURE;
fields [3] [col] = TREASURE;
}
else if (bigtreasure == 1) {
fields [col] [0] = TREASURE;
fields [col] [1] = TREASURE;
fields [col] [2] = TREASURE;
fields [col] [3] = TREASURE;
}
else if (bigtreasure == 2) {
fields [col] [col-1] = TREASURE;
fields [col] [col+1] = TREASURE;
fields [col] [col] = TREASURE;
fields [col-1] [col] = TREASURE;
}
else if (bigtreasure ==3) {
fields [col] [4] = TREASURE;
fields [col] [3] = TREASURE;
fields [col] [2] = TREASURE;
fields [col] [1] = TREASURE;
}
else if (bigtreasure ==4) {
fields [4] [col] = TREASURE;
fields [3] [col] = TREASURE;
fields [2] [col] = TREASURE;
fields [1] [col] = TREASURE;
}
else if (bigtreasure ==5) {
fields [3] [2]= TREASURE;
fields [3] [3]= TREASURE;
fields [2] [3]= TREASURE;
fields [2] [2]= TREASURE;
}
else {
fields [0] [0]= TREASURE;
fields [1] [0]= TREASURE;
fields [2] [0]= TREASURE;
fields [2] [1]= TREASURE;
}
}
}
}
Würd es ja einfach hier reinposten aber aus dem Grund, dass der TE ja noch selber üben will, lieber nicht, ist ja eigentlich nicht meine Aufgabe. Habe die nur auch mal aufgegriffen zu ÜbungszweckenGerne, oder mach einfach parallel deinen Thread auf. Zu einem Themenkomplex hatten wir ja schon öfters mehrere parallele Threads. Die PM hat halt den Nachteil, dass Du damit den anderen die Chance nimmst, Dir mit hilfreichen Kommentaren zur Seite zu stehen.
Kannst es gerne postenWürd es ja einfach hier reinposten aber aus dem Grund, dass der TE ja noch selber üben will, lieber nicht, ist ja eigentlich nicht meine Aufgabe. Habe die nur auch mal aufgegriffen zu ÜbungszweckenKann ich dann ja nachholen, wenn entweder Ostkreuz nicht mehr reagiert oder sagt, dass er durch ist.
import java.util.Arrays;
public class Board {
public static final char EMPTY = '.';
public static final char TREASURE = 'O';
public static final char HIT = 'X';
public static final char NO_TREASURE_FOUND = '-';
public static final int TREASURENR = 4;
public static final int BOARD_SIZE = 5;
private final char[][] fields = new char[BOARD_SIZE][BOARD_SIZE];
public Board() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
fields[i][j] = EMPTY;
}
}
}
public static void main(String[] args) {
Board board = new Board();
board.setTreasures();
board.print();
}
public void print() {
for (int x = 0; x < fields.length; x++) {
System.out.println(Arrays.toString(fields[x]));
}
}
public void setTreasures() {
setBigTreasure();
for (int count = 0; count < 4; count ++) {
setSmallTreasure();
}
}
public boolean isConnectedToTreasure(int x, int y) {
return hasTreasure(x-1, y) || hasTreasure(x+1, y) || hasTreasure(x, y-1) || hasTreasure(x, y+1);
}
private boolean hasTreasure(int x, int y) {
if (x < 0 || x >= fields.length || y < 0 || y >= fields[x].length) {
return false;
}
return fields[x][y] == TREASURE;
}
private void setSmallTreasure() {
int x, y;
do {
x = getRandomX();
y = getRandomY();
} while (hasTreasure(x, y) || isConnectedToTreasure(x,y));
fields[x][y] = TREASURE;
}
private void setBigTreasure() {
int x = getRandomX();
int y = getRandomY();
fields[x][y] = TREASURE;
for (int i=1; i < 4; i++) {
addBigTreasureElement();
}
}
private void addBigTreasureElement() {
int x, y;
do {
x = getRandomX();
y = getRandomY();
} while (hasTreasure(x, y) || !isConnectedToTreasure(x,y));
fields[x][y] = TREASURE;
}
private int getRandomX() {
return (int) (Math.random() * fields.length);
}
private int getRandomY() {
return (int) (Math.random() * fields[0].length);
}
}