Hallo liebes Javaforum,
seit einiger Zeit lese ich mit, lerne und probiere mich in verschiedenen Dingen aus, was die Programierwelt angeht. Seit Oktober studiere ich Medieninformatik
. Und endlich! schreibe ich meinen ersten Beitrag in diesem Forum, von hoffentlich vielen.
Also, es geht um eine Aufgabe aus der Uni in der wir Conways Game of Life erstellen sollen. Dies sollen wir nur mit den Mitteln tun die wir bereits in den Vorlesungen hatten. Also: Keine verwendung der bereits in Java implementierten Klassen wie z.b. ArrayList<> usw... das nur zum verständniss. Das komplette Spiel wird in der Console gespielt und ich (versuche) stelle das Spiel als 2D Array dar welches ich mit char ' ' & char 'x' (für die Steine // Lebewesen) fülle. Das Array soll dann im Spiel nach jeder "Runde" (der Benutzer kann angeben, dass die nächste Generation berechnet werden soll) die neue Spielsteinverteilung prüfen und eventuell ein größeres Array erstellen. Beim erstellen eines neues Arrays habe ich das erste Problem:
Zuerst wird geschaut ob in den jeweiligen Randfeldern Steine sitzen, falls das der Fall ist wird ein größeres Spielfeld erstellt, der Problem liegt im letzten Teil, wo das Feld befüllt wird welches vergößert wurde. In einem Probedurchlauf wo er das Feld von 5*5 auf 7*7 vergößert bekomme ich eine outofbounds 5 exception. Ich verstehe absolut nicht woran es liegt... das i und j müsste ja von 0 bis maximal 4 gehen (7-2 = 5 i muss darunter sein). Sieht vllt jemand meinen Fehler ?
Das zweite was ich nicht verstehe ist bei der Überprüfung der einzelnen Felder auf Nachbarn, hier nur ein kleiner Teil wo auf jeden Fall ein Fehler liegt:
Danach kommen noch für alle Randfelder ähnliche Abfragen... dieser Codeteil bezieht sich auf den oberen Rand, nach meiner Logik müsste er nach der Abfrage für das Feld 0/0 im Array einen Nachbarn haben wenn auf 1/1 ein Stein liegt genauso wie in Feld 1/0 und 2/0, er speichert aber für alle diese Felder 0 Nachbarn. Erkennt vllt jemand den Logikfehler den ich hier gemacht habe ? Würde es wirklich gerne verstehen
Da ich verschiedene andere Dinge eh abändern muss (Habe im "Interface" Labels genutzt was wir für nicht tun sollten...) werde ich sowieso noch einen anderen Ansatz probieren und die hier gestellten Fragen entfallen für die Uni eventuell, ich möchte aber verstehen wieso bestimmte Dinge nicht funktionieren. Denn ich finde meine Denkfehler nicht will diese aber unbedingt nachvollziehen...
Ansonsten verbleibe ich mit vielen Grüßen
Shardic
seit einiger Zeit lese ich mit, lerne und probiere mich in verschiedenen Dingen aus, was die Programierwelt angeht. Seit Oktober studiere ich Medieninformatik
Also, es geht um eine Aufgabe aus der Uni in der wir Conways Game of Life erstellen sollen. Dies sollen wir nur mit den Mitteln tun die wir bereits in den Vorlesungen hatten. Also: Keine verwendung der bereits in Java implementierten Klassen wie z.b. ArrayList<> usw... das nur zum verständniss. Das komplette Spiel wird in der Console gespielt und ich (versuche) stelle das Spiel als 2D Array dar welches ich mit char ' ' & char 'x' (für die Steine // Lebewesen) fülle. Das Array soll dann im Spiel nach jeder "Runde" (der Benutzer kann angeben, dass die nächste Generation berechnet werden soll) die neue Spielsteinverteilung prüfen und eventuell ein größeres Array erstellen. Beim erstellen eines neues Arrays habe ich das erste Problem:
Java:
public void wachstumPruefen() {
int einMehr = 0;
for (int k = 0; k < naechsteGeneration.length; k++) {
if (naechsteGeneration[0][k].hatStein() == 'x') {
einMehr = 1;
}
if (naechsteGeneration[k][0].hatStein() == 'x') {
einMehr = 1;
}
if (naechsteGeneration[k][naechsteGeneration.length-1].hatStein() == 'x') {
einMehr = 1;
}
if (naechsteGeneration[naechsteGeneration.length-1][k].hatStein() == 'x') {
einMehr = 1;
}
}
if (einMehr != 0) {
dasFeld = new Spielsteine[dasFeld.length+2][dasFeld.length+2];
initialisieren();
}
if (einMehr == 0) {
for (int i = 0; i < dasFeld.length; i++) {
for (int j = 0; j < dasFeld.length; i++) {
dasFeld[i][j] = naechsteGeneration[i][j];
}
}
} else if (einMehr != 0) {
for (int i = 0; i < dasFeld.length-2; i++) {
for (int j = 0; j < dasFeld.length-2; i++) {
dasFeld[i+1][j+1] = naechsteGeneration[i][j];
}
}
}
}
Zuerst wird geschaut ob in den jeweiligen Randfeldern Steine sitzen, falls das der Fall ist wird ein größeres Spielfeld erstellt, der Problem liegt im letzten Teil, wo das Feld befüllt wird welches vergößert wurde. In einem Probedurchlauf wo er das Feld von 5*5 auf 7*7 vergößert bekomme ich eine outofbounds 5 exception. Ich verstehe absolut nicht woran es liegt... das i und j müsste ja von 0 bis maximal 4 gehen (7-2 = 5 i muss darunter sein). Sieht vllt jemand meinen Fehler ?
Das zweite was ich nicht verstehe ist bei der Überprüfung der einzelnen Felder auf Nachbarn, hier nur ein kleiner Teil wo auf jeden Fall ein Fehler liegt:
Java:
private Spielsteine[][] hatNachbarn(Spielsteine[][] formalesFeld) {
int nachbarn = 0;
for (int i = 0;i < formalesFeld.length; i++) {
for (int k = 0; k < formalesFeld[i].length; k++) {
if (i == 0) {
if (k != 0 && k != formalesFeld.length-1) {
if (formalesFeld[i][k-1].hatStein() == 'x') {
nachbarn++;
}
if (formalesFeld[i+1][k-1].hatStein() == 'x') {
nachbarn++;
}
if (formalesFeld[i][k+1].hatStein() == 'x') {
nachbarn++;
}
if (formalesFeld[i+1][k+1].hatStein() == 'x') {
nachbarn++;
}
}
Danach kommen noch für alle Randfelder ähnliche Abfragen... dieser Codeteil bezieht sich auf den oberen Rand, nach meiner Logik müsste er nach der Abfrage für das Feld 0/0 im Array einen Nachbarn haben wenn auf 1/1 ein Stein liegt genauso wie in Feld 1/0 und 2/0, er speichert aber für alle diese Felder 0 Nachbarn. Erkennt vllt jemand den Logikfehler den ich hier gemacht habe ? Würde es wirklich gerne verstehen
Da ich verschiedene andere Dinge eh abändern muss (Habe im "Interface" Labels genutzt was wir für nicht tun sollten...) werde ich sowieso noch einen anderen Ansatz probieren und die hier gestellten Fragen entfallen für die Uni eventuell, ich möchte aber verstehen wieso bestimmte Dinge nicht funktionieren. Denn ich finde meine Denkfehler nicht will diese aber unbedingt nachvollziehen...
Ansonsten verbleibe ich mit vielen Grüßen
Shardic