Eine Liste zur Hand hättest, wie erstellt man denn dMn eine Liste von baittypes die man zur Hand hat?Das wäre korrekt, wenn Du bei Erstellung von Fields auch schon eine Liste von baittypes zur Hand hättest.
Eine Liste zur Hand hättest, wie erstellt man denn dMn eine Liste von baittypes die man zur Hand hat?Das wäre korrekt, wenn Du bei Erstellung von Fields auch schon eine Liste von baittypes zur Hand hättest.
Das ist einfache Umgangssprache.Eine Liste zur Hand hättest, wie erstellt man denn dMn eine Liste von baittypes die man zur Hand hat?
Ich habe dem Konstruktor von mir doch die Liste übergeben?Wenn du das Field erzeugt, dann musst du bei dem von dir vorgeschlagenen Konstruktor auch eine Liste mit übergeben.
Informationen vom Server bekomme ich, in dem ich Nachrichten an diesen sende. Wenn ich nach dem Maze frage, bekomme ich eine gesamte Spielfeldbeschreibung. Der Server sendet außerdem Informationen über die sichtbaren Objekte, über die Spieler, ihre Positions und Scores. Und der Server überträgt die Position eines Objekts. Diese Informationen kann ich in meinen Klassen aufnehmen??Nun schau dir die Anforderungen an:
Wie bekommst du welche Informationen vom Server? Was bekommst du, wenn du nach dem Maze fragst? Was kannst du mit diesen Informationen machen?
Nun schau dir die Anforderungen an:
Wie bekommst du welche Informationen vom Server? Was bekommst du, wenn du nach dem Maze fragst? Was kannst du mit diesen Informationen machen?
Ich weiß nicht worauf du hinaus willst, was soll ich mit diesen Informationen machen können. Ich bekomme sie geschickt, sie müssen natürlich in das UI übertragen werden den CommandHandler einem Befehl geben welcher dann GameStatusModel aktualisiert.
Ich hab nicht so ganz verstanden was du mit FieldTyp erreichen willst. Das einzige was den Typ WALL von PATH unterscheidet ist, ob da ein Spieler/Bait
sein kann oder nicht. Das heißt du überprüfst beim Setzen entweder "Ist das eine Mauer? -> Nicht setzen" oder "Ist das ein Weg? -> Setzen". (Oder die Negationen hiervon)
Je nachdem auf welchen Typ du prüfst, ist der andere in meinen Augen unnötig.
Habe doch schon eine Instanz vom FieldType PATH erzeugt. Die Frage war eben ,wie ich die anderen 2 noch erzeuge.Dann setzt du beim erzeugen deinen FieldType entsprechend entweder auf PATH oder auf WALL.
Ich persönlich würde einfach Instanzen vom Typ Wall (oder wie auch immer du es nennen willst) erzeugen die die entsprechende Position erhalten. Dann kannst du beim setzen der Baits trotzdem noch testen ob sich da eine Wand befindet oder nicht.
Ist an der Position (X/Y) ein Objekt Field mit dem Typ "WALL"? -> Ja? -> Nicht setzenDer FieldTyp dient doch genau dazu, damit sind die Abfragen "Ist das eine Mauer" und "Ist das ein Weg?" möglich.
Wäre echt sehr dankbar wenn mich winter aufklärt,Weil ich grade echt nicht mehr weiß, wie ich writer vorgehen soll bzw. warum ich jetzt aufeinmal ein Konstruktor erzeugen soll
Was willst du Mir damit sagen, warum brauche ich eine Instanz vom see Klasse Field oder was meinst du mit "Typ Field"? Und wie Gebe ich jetzt genau einem Feld die Position mit?Den Konstruktor bräuchtest du doch auch ohne FieldType damit du der Instanz vom Typ Field die Position direkt mitgeben kannst.
Du hast doch eine Klasse Field oder nicht? Aus dieser werden die Instanzen (also im Prinzip deine einzelnen Mauern und Wege) erstellt. Jede dieser Mauern/Wege hat einen X Wert und einen Y Wert woraus sich die genau Position in dem Labyrinth ergibt. Position (0|0) wäre demnach oben links in der Ecke.Was willst du Mir damit sagen, warum brauche ich eine Instanz vom see Klasse Field oder was meinst du Mir "Typ Field"? Und wie Gebe ich jetzt genau einem Feld die Position not?
public class Field {
private int PositionX, PositionY;
private String Type;
public Field(int PositionX, int PositionY, String Type) { // <- Das ist der Konstruktor
this.PositionX = PositionX;
this.PositionY = PositionY;
this.Type = Type;
}
}
Field neuesField = new Field(20,20,"WALL");
private Field(FieldType fieldType) {
this.fieldType = fieldType;
this.baittypes = new ArrayList<BaitType>();
}
Du hast doch eine Klasse Field oder nicht? Aus dieser werden die Instanzen (also im Prinzip deine einzelnen Mauern und Wege) erstellt. Jede dieser Mauern/Wege hat einen X Wert und einen Y Wert woraus sich die genau Position in dem Labyrinth ergibt. Position (0|0) wäre demnach oben links in der Ecke.
Außerdem hast du den FieldType. Das kann ein String, oder ein Integer ( 0 für Weg, 1 für Mauer) oder auch irgendwas anderes sein, dass dir gefällt und Sinn macht.
Wenn du also ein neues Field erstellst, kannst du durch den Konstruktor direkt die Parameter mitgeben.
Die Klasse Field sähe dann so aus:
Code:public class Field { private int PositionX, PositionY; private String Type; public Field(int PositionX, int PositionY, String Type) { // <- Das ist der Konstruktor this.PositionX = PositionX; this.PositionY = PositionY; this.Type = Type; } }
Und beim erstellen eines neuen Fields an der Position (20|20) vom Typ WALL gibst du das direkt mit:
Code:Field neuesField = new Field(20,20,"WALL");
Ist an der Position (X/Y) ein Objekt Field mit dem Typ "WALL"? -> Ja? -> Nicht setzen
Ist an der Position (X/Y) ein Objekt Wall? ->Ja? -> Nicht setzen
Macht doch absolut keinen Unterschied, nur dass man sich bei letzterer Variante den FieldType spart.
Allerdings muss ein Feld eigentlich nie seine Position wissen. Wenn es die weiß, hat man die Information doppelt gespeichert, was zu Problemen führen kann und oft auch führt.Den Konstruktor bräuchtest du doch auch ohne FieldType damit du der Instanz vom Typ Field die Position direkt mitgeben kannst.
Stimme ich zu. Habe die Positionen zwar da rein geschrieben aber im Endeffekt nie genutzt. Tatsächlich reicht das 2D-ArrayAllerdings muss ein Feld eigentlich nie seine Position wissen. Wenn es die weiß, hat man die Information doppelt gespeichert, was zu Problemen führen kann und oft auch führt.
1.Wenn Du dann die ersten Field Instanzen erzeugen musst, dann siehst Du, was Du hast: Das kann dann also ein String sein mit der Darstellung des Feldes. Und dann gibt es halt einen Konstruktor, der einfach nur so einen String entgegen nimmt....
Okay, danke gutes Beispiel!Ach ja: Der neue Punkt "Position des Feldes":
Nimm das Beispiel Bücherregal: Ein Buch steht im Bücherregal. Wie in der Bücherei: Platz B46 ist von diesem Buch.
Jetzt kann man das natürlich auch im Buch vermerken. Aber muss man das? Das wäre wichtig, wenn man die Position ständig benötigen würde: Du hast das Buch heraus genommen und nun muss man es zurück stellen. Dann braucht man das.
Aber wenn Du nun Bücher in ein regal stellst: Dann hast Du natürlich auch die Bücher an speziellen Positionen. Über die Position kannst Du auf die Bücher zugreifen. Im Buch muss die Position nicht stehen.
Wenn Du Blätter auf den Schreibtisch legst: Du notierst ja nicht die Position auf den Blättern. Aber wenn Du die Blätter brauchst: Kein Thema: Die Blätter liegen da und da auf dem Schreibtisch. -> zugriff klappt auch ohne dass der Ort vermerkt wird.
So sehe ich das hier auch. Wenn Du z.B. ein 2d Array mit Feldern hast, dann greifst Du darüber auf das jeweilige Feld zu. Aber den Feldern ist es egal, an welcher Position sie sind. Es sind einfach Feld-Instanzen und der Ort ist durch die Referenzierung im 2d Array festgelegt.
Ja, der Server sendet String commands die der CommandHandler in GameStatusModel updatet.Zu 1: schau dir an, wie das Spiel abläuft. Der Client fragt den Server nach dem Maze. Der Server schickt dann das Maze: was genau sendet der Server zurück? Aus dem, was der Server zurück sendet musst du ja deine Daten aufbauen....
Warum den Ablauf ansehen, den habe ich ja schon genau verstanden! Mir geht es jetzt genau um den Konstruktor, ich bekomme Informationen vom CommandHandler aufgrund eines ServerBefehls. Dieser aktualisiert Daten in GameStatusModel, sei es Field oder Player...Zu 2. Du musst dir den Ablauf genau ansehen. Die Kommunikation zwischen Client und Server ist ja genau spezifiziert. Wie läuft denn dann so ein Spiel ab? Geh das einmal in Ruhe durch um eine Vorstellung davon zu bekommen, wann der Client was macht und was für Daten er verarbeiten muss.
Ja, das ist mir alles bewusst, wichtig ist mir wirklich zu wissen wie der Konstruktor jetzt ganz konkret seine Aufgabe erfüllen soll..Zu 3. Der Konstruktor dient der Initialisierung von neuen Instanzen. Für das Erzeugen ist das new verantwortlich. Wenn mit new eine neue Instanz einer Klasse erzeugt wird, wird der angegebene Konstruktor zur Initialisierung aufgerufen.
Dabei können Daten für die neue Instanz übergeben werden.
private FieldType fieldType;
private List<BaitType> baittypes = new ArrayList<BaitType>();
MAZE;20;10
--------------------
-##################-
-#................#-
-#.###.#.###.##.#.#-
-#...###..#..#..#.#-
-#.#.........#..#.#-
-#.#########.#.##.#-
-#................#-
-##################-
--------------------
Was soll das heißen? Wie übergebe ich etwas einem Konstruktor, die Begriffe die du da verwendest geben mir kein Aufschluss darüber?Was soll ich übergeben, was heißt ein Typ "setzen"?Und da es unterschiedliche Felder mit unterschiedlichen Typen gibt: Übergib etwas, so dass Du den Typ setzen kannst.
Ja ich habe doch eine Variable namens vom Typ FieldType in den Konstruktor gesetzt?Du hast den Typ auf einen festen Wert gesetzt. Das ist Quatsch, denn alle Felder sind ja nicht vom gleichen Typ! Und natürlich muss der Typ gesetzt werden, denn ein Feld ist entweder vom Typ UNKNOWN, PATH oder WALL. Also hast Du eine Variable, die gesetzt sein muss: Dann setz diese doch im Konstruktor.
Wie macht man das mit einem Konstruktor, ich kenne nur die einfache Instanziierung von Variablen einer Klasse. Mit new wird ein Konstruktor aufgerufen. Aber wie erstelle ich dann mit einem Konstruktor aus einem Zeichen ein Field. Das ist mir einfach völlig fremdAlso brauchst Du ganz offensichtlich Code, der aus einem Zeichen ein Field erstellt. Das könnte man über einen Konstruktor machen.
public Field(final char character) {
switch (character) {
case '.': fieldType = FieldType.WAY; break;
case '#': fieldType = FieldType.WALL; break;
case '-': fieldType = FieldType.UNKNOWN; break;
default: throw new IllegalArgumentException("Character " + character + " is not valid!");
}
}
public Field(final char character) {
fieldType = FieldType.of(character);
}
public static FieldType of(final char character) { ... }
Warum Schreibst du es Dann erst in den Konstruktor von Field und Dann sagst du die Umwandlung soll in die Methoden von FieldType?diese Umwandlung enthält. Und das entweder mit einem switch wie oben gezeigt oder ggf. wie schon einmal früher exemplarisch gezeigt mit einer for each Schleife und Prüfen eines Wertes, der jedem enum
if (parts[0].equals("PSCO")){
}
@JustNobody
das parts-Array ist das CSV-Array welches die Servernachricht enthält und durch ";" gesplitet wird.Java:if (parts[0].equals("PSCO")){ }
Nun möchte ich der if-Anweisung sagen, wenn parts[0] "PSCO" ist, dann möchte ich dass die Command Klasse "X" angesprochen wird, bzw. ihre Methdoe ausführt?
if (parts[0].equals("PSCO")){
commandMap.get(parts[0]).execute()
}
public class ScoreCommand implements Command {
private int score = parts[2];
@Override
public int execute() {
return score.addToScore();
}
}
try(
LineNumberReader read = new LineNumberReader(new StringReader())){
read.lines()
.filter(line -> read.getLineNumber() = 0)
.forEach(line -> {
String [] parts = str.split(";");
if (parts[0].equals("PSCO")){
commandMap.get(parts[0]).execute();
try(LineNumberReader read = new LineNumberReader(new StringReader())) {
read.lines()
.filter(line -> read.getLineNumber() != 0)
.forEach(line -> verarbeiteZeile(line));
}
if (parts[0].equals("PSCO")){
ScoreCommand psco = new ScoreCommand();
ScoreCommand score = psco