Hallo, wir müssen an der Universität Conways Game of Life programmieren. In dem Abgabesystem werden Tests durchgeführt und mein Programm besteht dort einen Test nicht. Jedoch finde ich den Fehler nicht. Ich hoffe ihr könnt mir helfen.
Die Klasse in der der Fehler auftritt soll das Laden von und das Speicher in ein einfaches Textformat unterstützen und implementiert daher eine weitere Klasse mit dem Namen WorldLoader. Der Fehler der mir ausgegeben wird (siehe unten) besagt, dass das nicht funktioniert allerdings weiß ich nicht warum.
Hier der fehler
Und hier der Code:
Die Klasse in der der Fehler auftritt soll das Laden von und das Speicher in ein einfaches Textformat unterstützen und implementiert daher eine weitere Klasse mit dem Namen WorldLoader. Der Fehler der mir ausgegeben wird (siehe unten) besagt, dass das nicht funktioniert allerdings weiß ich nicht warum.
Hier der fehler
Java:
/tmp/3e39b3b7-425b-404b-bb71-c8b6a300c68a2218498732353754867/src/test/java/test/io/StandardWorldLoaderTest.java:85: error: incompatible types: StandardWorldLoader cannot be converted to WorldLoader
testSavedWorld(loader, expected, WORLD_SMALL_LEGAL);
^
/tmp/3e39b3b7-425b-404b-bb71-c8b6a300c68a2218498732353754867/src/test/java/test/io/StandardWorldLoaderTest.java:132: error: incompatible types: StandardWorldLoader cannot be converted to WorldLoader
testSavedWorld(loader, expected, big_world);
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
2 errors
FAILED
Und hier der Code:
Java:
package jpp.gol.io;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Scanner;
import jpp.gol.model.CellState;
import jpp.gol.model.World;
/**
*
* @author Jan Friedrich
* @description Die Klasse StandardWorldLoader ermoeglicht es eine Spielwelt
* einzulesen, auszugeben und zu speichern.
*
*/
public class StandardWorldLoader {
/**
* Bildet die Schnittstelle zwischen den verschiedenen Formaten.
*/
public World load(InputStream in) throws IOException {
if (in == null) {
throw new IOException("Der InputStream ist leer!");
}
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder builder = new StringBuilder();
String line = "";
while ((line = reader.readLine()) != null) {
builder.append(line + "\n");
}
reader.close();
String finalText = builder.toString();
@SuppressWarnings("resource")
Scanner scanner = new Scanner(finalText);
if (scanner.hasNext() == false) {
throw new IOException("Fehler! Der InputStream ist leer!");
}
// ueberpruefen, ob Header wirklich aus zwei Zahlen besteht
if (scanner.hasNext() == false || !scanner.hasNext("\\d+x\\d+")) {
throw new IOException("Der Header muss aus zwei Zahlen bestehen!");
}
String[] finalTextsplit = finalText.split("\n");
// Herausgeben der Zahlen im Header
String digitsHeader = finalTextsplit[0];
String[] digitsHeadersplit = digitsHeader.split("x");
// firstdigit=Breitenangabe
int firstdigit = Integer.parseInt(digitsHeadersplit[0]);
// seconddigit=Hoehenangabe
int seconddigit = Integer.parseInt(digitsHeadersplit[1]);
int zahlHoehe = 0;
// ueberpruefung, ob Hoehe im Header mit der tatsaechlichen Spielfeldhoehe
// uebereinstimmt.
for (int i = 0; i < finalTextsplit.length; i++) {
zahlHoehe = i;
}
if (zahlHoehe != seconddigit) {
throw new IOException("Vorsicht! Die Hoehe stimmt nicht ueberein! ");
}
// ueberpruefen, ob Breite im Header mit der tatsaechlichen Spielfeldbreite
// uebereinstimmt.
for (int i = 1; i < finalTextsplit.length; i++) {
if (finalTextsplit[i].length() != firstdigit) {
throw new IOException(
"Vorsicht! Die Laenge stimmt nicht ueberein! ");
}
}
// chechkfeld=String mit Zeilenumbruch, um mit Scanner zu ueberpruefen, ob
// nur 1 und 0 vorkommt
String checkfeld = "";
// feldset=String, zum hinzufuegen der Welt.
String feldset = "";
for (int i = 1; i < finalTextsplit.length; i++) {
checkfeld += finalTextsplit[i].toString() + "\n";
feldset += finalTextsplit[i].toString();
}
// Pruefen ob checkfeld aus 1ern und 0ern besteht
@SuppressWarnings("resource")
Scanner sc2 = new Scanner(checkfeld).useDelimiter("\n");
if (!sc2.hasNext("[0-1]*")) {
throw new IOException(
"Vorsicht! Das Feld darf nur aus 1er und 0er bestehen!");
}
// Hinzufuegen von feldset zur Welt
World w = new World(firstdigit, seconddigit);
char[] array = feldset.toCharArray();
int counter = 0;
for (int i = 0; i < seconddigit; i++) {
for (int j = 0; j < firstdigit; j++) {
if ((int) array[counter] - 48 == 0) {
w.set(j, i, CellState.DEAD);
} else {
w.set(j, i, CellState.ALIVE);
}
counter++;
}
}
return w;
}
/**
* Testet ob die ausgegebene Welt leer ist.
* @throwsIOException
*/
public void save(World world, OutputStream out) throws IOException {
if (world == null || out == null) {
throw new IOException(
"Vorsicht! Die uebergebene World oder der uebergebene Outputstream sind leer!");
}
try {
String output = world.getWidth() + "x" + world.getHeight() + "\n"
+ world.toString();
out.write(output.getBytes());
} catch (Exception e) {
throw new IOException();
} finally {
out.flush();
}
}
/**
* Main Methode.
*
*/
public static void main(String[] args) throws IOException {
StandardWorldLoader w = new StandardWorldLoader();
World world = new World();
String input = "4x3\n0100\n0110\n1111\n";
InputStream is = new ByteArrayInputStream(input.getBytes());
world = w.load(is);
System.out.println(world.toString());
}
}