FieldType PATH = null;
. Nur weil die Variable PATH heißt, hat die noch nichts mit dem Enum icode]FieldType.PATH[/icode] zu tun.Ein Feld darf also nur Baits enthalten, wenn der FieldType PATH ist?Der FieldType PATH sollte meiner Meinung keinen BaitType kennen aber, sollte wissen, dass sich auf dem FieldType PATH nur Baits verbergen können. Ich meine irgendwie muss man den Feldern ja sagen dass sie entweder Baits enthalten dürfen/oder eben auch nicht. Ansonsten könnten diese ja überall verteilt sein.
Ja, dass ein Spieler darf auch nur den FieldType PATH betreten bzw. macht es auch nur so Sinn, da das ja der Labyrinthweg ist.Ein Feld darf also nur Baits enthalten, wenn der FieldType PATH ist?
Das ist ja das Problem, was ich gerade versuche zu lösen durch die List. Eine List enthält BaitTypes. Wie füge ich diese aber dem FieldType hinzu?Wie fügst du denn aktuell überhaupt Baits zu einem Feld hinzu?
Wie fügst du denn aktuell überhaupt Baits zu einem Feld hinzu?
Wie füge ich [BaitTypes] aber dem FieldType hinzu?
Zwischen Feld/Field und FieldType ist ein sehr großer Unterschied!Ja, aber gemeint ist dasselbe von mir.
import java.util.ArrayList;
import java.util.List;
public class Field {
FieldType fieldType;
List<BaitType> baits = new ArrayList<BaitType>();
}
public boolean addBait(final BaitType bait) {
// Prüfe, ob der Typ passt. Ggf. false zurück geben!
// Füge bait dem feld hinzu
// true zurück geben
}
In der Methode "isplayerAllowed" in der enumeration die du mir auf Seite 5 genannt hast, könnte man dies machen oder? Könnte doch aber auch in der Klasse Field festlegen, ob ein Spieler ein feldtyp betreteten darf oder nicht?Falls Du den FieldType mit gewisser Logik implementiert hast, dann weiß ein Typ, ob ein Spieler ein Feld von dem typ betreten könnte. Das könnte man dann als Logik ebenfalls nutzen statt dem starren beharren auf PATH.
Wie prüfe ich, ob die position des baits der position des PATH entspricht.public boolean addBait(final BaitType bait) { // Prüfe, ob der Typ passt. Ggf. false zurück geben! // Füge bait dem feld hinzu // true zurück geben }
Wenn wir jetzt einfach mal von dem Code von @JustNobody ausgehen:Wie kann man denn einfach mal überprüfen, ob das Feld den Typ PATH hat.
fieldType
. Um zu prüfen, ob diese PATH ist: this.fieldType == FieldType.PATH
.Das ist das erste "große" Projekt, was applikationsspezifisch erstellt werden muss(was jede Aufgabe prinzipiell muss) aber in diesem Rahmen ist es noch schwieriger und erfordert genau und gesetzten Code, um die Aufgabe als solche korrekt zu bearbeiten
Ouhman, habe die Instanzvariable von FieldType gar nicht mehr in Betracht gezogen. DankeDer Typ des Feldes steht in der VariablefieldType
.
Ja deshalb hatte ich meinen Beitrag #117 nochmal bearbeitet, weil das mit den vielen Klassen nicht stimmteGroße Projekte muss man einfach nur in kleine Teile aufteilen. An diesem Problem jetzt grad sind grad mal drei verschiedene Klassen beteiligt, und zwei davon sind schlichte Enums
public class Field {
FieldType fieldType;
List<BaitType> baittypes = new ArrayList<BaitType>();
public boolean addBait(final BaitType bait) {
if (this.fieldType == FieldType.PATH) {
baittypes.add(bait);
} else {
return false;
}
return true;
}
}
Bei mir wird es ja nur der Liste inzugefügt, wie spezifiziere ich das jetzt?// Füge bait dem feld hinzu
Die Liste ist Teil des Feldes.baittypes.add(bait) erfüllt ja nicht genau das was @JustNobody sagte:
Bei mir wird es ja nur der Liste inzugefügt, wie spezifiziere ich das jetzt?// Füge bait dem feld hinzu
Dementsprechend müsste man dies in:List<BaitType> baittypes = new ArrayList<BaitType>();
List<FieldType> fieldTypes = new ArrayList<FieldType>();
List<FieldType> fieldTypes = new ArrayList<FieldType>();
public boolean addBait(final BaitType bait) {
if (this.fieldType == FieldType.PATH) {
fieldTypes.add(bait);
} else {
return false;
}
return true;
Das ist Unsinn..Dementsprechend müsste man dies in:
umändern, oder habe ich das jetzt selbstsicher falsch umgeändert?Java:List<FieldType> fieldTypes = new ArrayList<FieldType>();
Ja stimmt Jetzt weiß ich echt nicht weiter...
Dann muss das ja korrekt sein ??Java:public class Field { FieldType fieldType; List<BaitType> baittypes = new ArrayList<BaitType>(); public boolean addBait(final BaitType bait) { if (this.fieldType == FieldType.PATH) { baittypes.add(bait); } else { return false; } return true; } }
Es heißt ja dass ein feld einen Feld-Typen hat und mehrere Baits.Ein Feld hat einen Feld-Typen und mehrere Baits -> FieldType als eine Variable und eine Liste von Baits als eine andere Variable.
Das hinzufügen der Baits ist korrekt.Dann muss das ja korrekt sein ??
Ich versuche das mal zu ändernAllerdings ist fieldType aktuell immer null
Der FieldType PATH sollte meiner Meinung keinen BaitType kennen aber, sollte wissen, dass sich auf dem FieldType PATH nur Baits verbergen können. Ich meine irgendwie muss man den Feldern ja sagen dass sie entweder Baits enthalten dürfen/oder eben auch nicht. Ansonsten könnten diese ja überall verteilt sein.
Dann sag mir bitte mal wozu du die Position der Baits auf eine Mauer überprüfen musst.Stimmt so nicht, was du sagst. Trotzdem muss man es überprüfen.
Es kann passieren dass man im Client etwas falsch programmiert oder irgendetwas was dafür sorgt dass ein Bait in einer Wand landet.Dann sag mir bitte mal wozu du die Position der Baits auf eine Mauer überprüfen musst.
Defensive Programmierung und kenntlich machen von Constraints wären zwei Punkte dafürDann sag mir bitte mal wozu du die Position der Baits auf eine Mauer überprüfen musst.
Defensive Programmierung und kenntlich machen von Constraints wären zwei Punkte dafür
Ja, gut aber ist jetzt kein Code der Punkte abzieht, kann da ja jeder machen wie er möchte
Um Augenblick verstehe ich nicht, was Dein Problem ist.
Ein Feld hat genau einen FieldType. Den FieldType kannst du im Konstruktor setzen oder über einen Setter.
Wenn du das Maze aufbaust, dann wirst du vermutlich viele Felder erstellen. Und das abhängig von dem Zeichen, das für das jeweilige Feld vorgesehen ist ....
1. Es ging doch jetzt darum in der Klasse Field eine Instanzvariable zu erstellen, da diese ja FieldTypes hat? Diese Variable sollte nicht null sein?Ein Feld hat einen Feld-Typen und mehrere Baits -> FieldType als eine Variable und eine Liste von Baits als eine andere Variable.
Wenn du Field einen Konstruktor gibst, der ein FieldType entgegen nimmt, dann könntest du die Instanzvariable entsprechend setzen.
Also kann ich es jetzt so oder so machen?Oder du übergibst den String, den der Server für das Feld vorgibt, um dann in Abhängigkeit vom String den Typ zu setzen.
Kann man in einer Klasse einen Konstruktor erstellen, der Werte von dem enum entgegen nimmt, wusste ich auch noch nicht.Wenn du Field einen Konstruktor gibst, der ein FieldType entgegen nimmt, dann könntest du die Instanzvariable entsprechend setzen.
Die Instanzvariable kann man doch auch ohne Konstruktor setzen/erstellen ? ^^dann könntest du die Instanzvariable entsprechend setzen.
In Beitrag #113, stimmt's?Und dann hatte ich, so ich mich recht erinnere, auch schon geschrieben, wie man diese Auswahl Logik sogar in den FieldType verlegen kann (so man das möchte).
Das ist weder gegen das explizite im Code erwähnen der Constrainst ein Argument, noch gegen defensive ProgrammierungIndem ein Bait über die zugehörige Klasse erstellt wird, ist dessen Position doch klar definiert. Wenn der Server ein Bait in einer Mauer erstellt, ist es eigentlich ziemlich egal was im Client passiert, da es keine Möglichkeit gibt dem Server mitzuteilen, dass das Bait an einer falschen Position ist.
Es wird durch die Überprüfung lediglich verhindert, dass das Bait gezeichnet wird. Tatsächlich liegt es aber dennoch in der Mauer. Deswegen finde ich die Überprüfung irrelevant. Aber wie Jono schon sagte:
Kann ein Feld ohne Typ existieren? => Nein, also muss es bereits im Konstruktor gesetzt werden.Verstehe jetzt nicht, warum ich da den Konstruktor jetzt einbauen soll usw.
Wie du das jetzt meintest, habe ich nicht verstanden. Wirkt irgendwie zusammenhangslos, deshalb konnte ich es jetzt nicht in dem Kontext verstehen wo das hin soll und was es erfüllt?Desweiteren sind es zwei Zeilen, wo eine direkte Zuweisung ausreichen würde (Also z.B. field[x][y] = new Field(encodedFieldChar); wobei encodedFieldChar ein Zeichen des Maze sein könnte ... ).
private Field(FieldType fieldType, List<BaitType> baittypes) {
this.fieldType = fieldType;
this.baittypes = baittypes;
}
Wie du das jetzt meintest, habe ich nicht verstanden. Wirkt irgendwie zusammenhangslos, deshalb konnte ich es jetzt nicht in dem Kontext verstehen wo das hin soll und was es erfüllt?
Das wäre korrekt, wenn Du bei Erstellung von Fields auch schon eine Liste von baittypes zur Hand hättest. Ist das die Verwendung, die du brauchst? Überleg doch, wie Du Field nutzen willst: Wo werden die wie gespeichert? Wie werden die wann erzeugt?Wäre der Konstruktor so richtig gesetzt?Java:private Field(FieldType fieldType, List<BaitType> baittypes) { this.fieldType = fieldType; this.baittypes = baittypes; }
Fields werden in der Klasse Maze gespeichert in dem Instanzen von dieser Klasse erzeugt.Das wäre korrekt, wenn Du bei Erstellung von Fields auch schon eine Liste von baittypes zur Hand hättest. Ist das die Verwendung, die du brauchst? Überleg doch, wie Du Field nutzen willst: Wo werden die wie gespeichert? Wie werden die wann erzeugt?