# Problem mit Game Of Life



## JanFausO (1. Mrz 2017)

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

```
/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:


```
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());
  }
}
```


----------



## Joose (1. Mrz 2017)

Deine Klasse heißt einfach "StandardWorldLoader" erweitert aber nicht die Klasse "WorldLoader", ich nehme an dir fehlt einfach die Ableitung


----------



## JanFausO (1. Mrz 2017)

Oh, vielen herzlichen Dank!! Hat funktioniert


----------



## Java20134 (1. Mrz 2017)

Aber mal noch einen kleinen Hinweis! Es ist nicht ratsam alles in eine Methode zu schreiben! Definiere also mehrere aussagekräftige Methoden. Damit wird es auch für andere Menschen lesbarer!


----------

