Einen boolischen Wert aus einer Methode in einer anderen Klasse aufrufen?

Hallot Leute, ich muss euch ein zweites mal belästigen ^^ Um mir die Basics und das logische Verständniss für das Programmieren anzueignen, bastel ich derzeit einen Textadventure zusammen. Ich arbeite mit mehreren Klassen, Methode etc. Mein Problem ist wie folgt: Ich habe meine Klasse Dialoge, wo ich eben alle Dialoge die im Verlauf des Spiels geschehen sollen als Methode schreibe, um diese dann in der Main dann nur als Methode aufrufen zu müssen. Der Spieler soll eine Gabe der Feenkönigin erhalten, jedoch kann der Spieler dieses event auch skippen. Nun möchte ich einen boolean am ende des Dialogs einbauen welcher dann, da die Gabe Angriffsboni hat, in der Kampf klasse per if abfrage eben bei wahr mit und bei false eben nicht mit eingerechnet wird.

Ich habe nun seit 3 Stunden herum gelesen und in den meisten fällen ist die Lösung getter und setter, wie ich gelesen habe. Jedoch kann ich nun keine Methode in einer Methode einbauen, oder?
Ich bin nun erstmal traurig schlafen xD und ich danke schonmal für jede Hilfe von euch! 🙂

Hier mal der Code von der Dialog und Kampf Klasse:

[CODE lang="java" title="Der Dialog"]if(choice == 1) {

System.out.println("Held: Das würdet ihr für mich tun, "+fairy.fairyname+"? Ich werde eure Gabe nicht verschwenden!");

scanner.nextLine();

System.out.println("Fee: Kniet euch hin werter Held der Menschen. Ich werde euch nun die Gabe der Königin der Feen verleihen. Auf dass ihr sie weise nutzt.");

scanner.nextLine();

System.out.println("Die Fee fängt an auf einer Sprache zu singen welche ihr nicht versteht. Die Luft ist vor Magie nur so am knistern, man kann es richtig spüren.");

scanner.nextLine();

System.out.println("Ihr spürt wie die vorher noch in der Luft merkbare Magie nun in euren Körper strömt. Es fühlt sich unglaublich an!");

scanner.nextLine();

System.out.println("Fee: "+spieler.name+", das Ritual ist beendet. Erhebt euer Haupt, Held, ihr seid nun ein Verbündeter der Feen. Auf eine gute Zusammenarbeit.");

scanner.nextLine();

System.out.println("Ihr erhaltet: "+gabe.gabe+" Euer Schaden wird erhöht und der erlittene Schaden wird verringert.");

scanner.nextLine();

System.out.println("Fee: Diese Gabe wird euch bei eurem Kampf gegen den Drachen sehr unterstützen. Nun geht, "+spieler.name+", ihr müsst eure Aufgabe erfüllen. Viel Glück!");

scanner.nextLine();

System.out.println("Nachdem "+fairy.fairyname+" dich mit einem Lächeln und einer Winkenden Hand verabschiedete, verschwand sie im Garten");

}[/CODE]

[CODE lang="java" title="Methode fürs ausrechnen vom Schaden"]public void Kampf() { //Bei den Parametern in den If Anweisungen nichts bei denken, war nur am herumexperimentieren ^^

if(amuletErhalten(true) && gabeErhalten(true)) {

spieler.schaden = spieler.schaden + items.amuletdamage + items.angriffGabe;

spieler.absorb = spieler.absorb + schild.schildAbsorb + gabe.angriffGabe + items.amuletdefence;

}

else if(amuletErhalten(true) && gabeErhalten(false)) {

spieler.schaden = spieler.schaden + items.amuletdamage;

spieler.absorb = spieler.absorb + schild.schildAbsorb + items.amuletdefence;

}

else if(amuletErhalten(false) && gabeErhalten(true)) {

spieler.schaden = spieler.schaden + items.angriffGabe;

spieler.absorb = spieler.absorb + schild.schildAbsorb + gabe.angriffGabe;

}

else {

spieler.schaden = spieler.schaden + items.schwertDamage;

spieler.absorb = spieler.absorb + items.schildAbsorb;

}

}[/CODE]
 
Du könntest auch in deiner SpielerKlasse eine, oder mehrere Methoden schreiben der du als Parameter erhaltene Gaben, gefundene Waffen und Items übergibst spieler.addGabe(neueGabe); und in einer Liste speicherst. In einer weiteren Methode kannst du dann den Angriffswert aller deiner Gegenstände/Fähigkeiten berechnen. Dann noch in deinem Getter aufrufen und schon hast du deinen aktuellen Angriffs- bzw. Verteidigungswert.

Als Beispiel, damit du weißt wie ich das meine.
[CODE lang="java" title="Klasse Gabe"]
public class Gabe {

private String name;
private int angriffsBonus;
private int verteidigungsBonus;

public Gabe(String name, int angriffsBonus, int verteidigungsBonus) {
this.name = name;
this.angriffsBonus = angriffsBonus;
this.verteidigungsBonus = verteidigungsBonus;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAngriffsBonus() {
return angriffsBonus;
}

public void setAngriffsBonus(int angriffsBonus) {
this.angriffsBonus = angriffsBonus;
}

public int getVerteidigungsBonus() {
return verteidigungsBonus;
}

public void setVerteidigungsBonus(int verteidigungsBonus) {
this.verteidigungsBonus = verteidigungsBonus;
}
}
[/CODE]

[CODE lang="java" title="Klasse Spieler"]import java.util.ArrayList;
import java.util.List;

public class Spieler {

private String name;
private int angriffsWert;
private int verteidigungsWert;
private List<Gabe> listGabe;
private List<Waffen> listWaffen;
private List<Items> listItems;

public Spieler(String name) {
this.name = name;
this.angriffsWert = 12;
this.verteidigungsWert = 8;
listGabe = new ArrayList<>();
listWaffen = new ArrayList<>();
listItems = new ArrayList<>();
}

public void addGabe(Gabe neueGabe) {
this.listGabe.add(neueGabe);
}

public void addWaffen(Waffen neueWaffen) {
this.listWaffen.add(neueWaffen);
}

public void addItems(Items neueItems) {
this.listItems.add(neueItems);
}

public void berechneAngriffsWert() {
for (Gabe gabe : listGabe) {
this.angriffsWert += gabe.getAngriffsBonus();
}
for (Waffen waffen : listWaffen) {
this.angriffsWert += waffen.getAngriffsBonus();
}
for (Items items : listItems) {
this.angriffsWert += items.getAngriffsBonus();
}
}

public void berechneVerteidigungsWert() {
for (Gabe gabe : listGabe) {
this.verteidigungsWert += gabe.getVerteidigungsBonus();
}
for (Waffen waffen : listWaffen) {
this.verteidigungsWert += waffen.getVerteidigungsBonus();
}
for (Items items : listItems) {
this.verteidigungsWert += items.getVerteidigungsBonus();
}
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAngriffsWert() {
berechneAngriffsWert();
return angriffsWert;
}

public void setAngriffsWert(int angriffsWert) {
this.angriffsWert = angriffsWert;
}

public int getVerteidigungsWert() {
berechneVerteidigungsWert();
return verteidigungsWert;
}

public void setVerteidigungsWert(int verteidigungsWert) {
this.verteidigungsWert = verteidigungsWert;
}

public List<Gabe> getListGabe() {
return listGabe;
}

public void setListGabe(List<Gabe> listGabe) {
this.listGabe = listGabe;
}
}
[/CODE]

[CODE lang="java" title="Main"]
public class Main {

public static void main(String[] args) {

Spieler spieler = new Spieler("Jens");

Gabe odinsKraft = new Gabe("Odins Kraft", 10, 5);
Gabe goettlicherWille = new Gabe("Göttlicher Wille", 20, 20);

Waffen langSchwert = new Waffen("Langschwert", 18, 5);

Items schlangenRing = new Items("Schlangen Ring", 5, 10);

spieler.addGabe(odinsKraft);
spieler.addGabe(goettlicherWille);

spieler.addWaffen(langSchwert);

spieler.addItems(schlangenRing);

System.out.println(spieler.getAngriffsWert());
System.out.println(spieler.getVerteidigungsWert());

}

}
[/CODE]
 
Anstatt void als Wiedergabetyp bei deiner Methode zu verwenden könntest du boolean verwenden und dann am ende der Methode true oder false returnen 🙂
Ich dachte mir schon dass in dem void das Problem liegt, ich wusste nur leider noch nicht dass ich dort auch einen Datentypen nutzen kann. Vielen Dank, wieder etwas gelernt^^
Du könntest auch in deiner SpielerKlasse eine, oder mehrere Methoden schreiben der du als Parameter erhaltene Gaben, gefundene Waffen und Items übergibst spieler.addGabe(neueGabe); und in einer Liste speicherst. In einer weiteren Methode kannst du dann den Angriffswert aller deiner Gegenstände/Fähigkeiten berechnen. Dann noch in deinem Getter aufrufen und schon hast du deinen aktuellen Angriffs- bzw. Verteidigungswert.

Als Beispiel, damit du weißt wie ich das meine.
[CODE lang="java" title="Klasse Gabe"]
public class Gabe {

private String name;
private int angriffsBonus;
private int verteidigungsBonus;

public Gabe(String name, int angriffsBonus, int verteidigungsBonus) {
this.name = name;
this.angriffsBonus = angriffsBonus;
this.verteidigungsBonus = verteidigungsBonus;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAngriffsBonus() {
return angriffsBonus;
}

public void setAngriffsBonus(int angriffsBonus) {
this.angriffsBonus = angriffsBonus;
}

public int getVerteidigungsBonus() {
return verteidigungsBonus;
}

public void setVerteidigungsBonus(int verteidigungsBonus) {
this.verteidigungsBonus = verteidigungsBonus;
}
}
[/CODE]

[CODE lang="java" title="Klasse Spieler"]import java.util.ArrayList;
import java.util.List;

public class Spieler {

private String name;
private int angriffsWert;
private int verteidigungsWert;
private List<Gabe> listGabe;
private List<Waffen> listWaffen;
private List<Items> listItems;

public Spieler(String name) {
this.name = name;
this.angriffsWert = 12;
this.verteidigungsWert = 8;
listGabe = new ArrayList<>();
listWaffen = new ArrayList<>();
listItems = new ArrayList<>();
}

public void addGabe(Gabe neueGabe) {
this.listGabe.add(neueGabe);
}

public void addWaffen(Waffen neueWaffen) {
this.listWaffen.add(neueWaffen);
}

public void addItems(Items neueItems) {
this.listItems.add(neueItems);
}

public void berechneAngriffsWert() {
for (Gabe gabe : listGabe) {
this.angriffsWert += gabe.getAngriffsBonus();
}
for (Waffen waffen : listWaffen) {
this.angriffsWert += waffen.getAngriffsBonus();
}
for (Items items : listItems) {
this.angriffsWert += items.getAngriffsBonus();
}
}

public void berechneVerteidigungsWert() {
for (Gabe gabe : listGabe) {
this.verteidigungsWert += gabe.getVerteidigungsBonus();
}
for (Waffen waffen : listWaffen) {
this.verteidigungsWert += waffen.getVerteidigungsBonus();
}
for (Items items : listItems) {
this.verteidigungsWert += items.getVerteidigungsBonus();
}
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAngriffsWert() {
berechneAngriffsWert();
return angriffsWert;
}

public void setAngriffsWert(int angriffsWert) {
this.angriffsWert = angriffsWert;
}

public int getVerteidigungsWert() {
berechneVerteidigungsWert();
return verteidigungsWert;
}

public void setVerteidigungsWert(int verteidigungsWert) {
this.verteidigungsWert = verteidigungsWert;
}

public List<Gabe> getListGabe() {
return listGabe;
}

public void setListGabe(List<Gabe> listGabe) {
this.listGabe = listGabe;
}
}
[/CODE]

[CODE lang="java" title="Main"]
public class Main {

public static void main(String[] args) {

Spieler spieler = new Spieler("Jens");

Gabe odinsKraft = new Gabe("Odins Kraft", 10, 5);
Gabe goettlicherWille = new Gabe("Göttlicher Wille", 20, 20);

Waffen langSchwert = new Waffen("Langschwert", 18, 5);

Items schlangenRing = new Items("Schlangen Ring", 5, 10);

spieler.addGabe(odinsKraft);
spieler.addGabe(goettlicherWille);

spieler.addWaffen(langSchwert);

spieler.addItems(schlangenRing);

System.out.println(spieler.getAngriffsWert());
System.out.println(spieler.getVerteidigungsWert());

}

}
[/CODE]
Auch dir vielen Dank für die schnelle Hilfe! Das sieht wirklich sehr gut strukturiert aus. Ich werde dies dann so im Programm umschreiben. odinsKraft, geniales Beispiel 😛

Nochmals vielen Dank an euch beiden, die Denkblockade ist damit endlich durchbrochen! ^_^
 
Du könntest auch in deiner SpielerKlasse eine, oder mehrere Methoden schreiben der du als Parameter erhaltene Gaben, gefundene Waffen und Items übergibst spieler.addGabe(neueGabe); und in einer Liste speicherst. In einer weiteren Methode kannst du dann den Angriffswert aller deiner Gegenstände/Fähigkeiten berechnen. Dann noch in deinem Getter aufrufen und schon hast du deinen aktuellen Angriffs- bzw. Verteidigungswert.

Als Beispiel, damit du weißt wie ich das meine.
[CODE lang="java" title="Klasse Gabe"]
public class Gabe {

private String name;
private int angriffsBonus;
private int verteidigungsBonus;

public Gabe(String name, int angriffsBonus, int verteidigungsBonus) {
this.name = name;
this.angriffsBonus = angriffsBonus;
this.verteidigungsBonus = verteidigungsBonus;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAngriffsBonus() {
return angriffsBonus;
}

public void setAngriffsBonus(int angriffsBonus) {
this.angriffsBonus = angriffsBonus;
}

public int getVerteidigungsBonus() {
return verteidigungsBonus;
}

public void setVerteidigungsBonus(int verteidigungsBonus) {
this.verteidigungsBonus = verteidigungsBonus;
}
}
[/CODE]

[CODE lang="java" title="Klasse Spieler"]import java.util.ArrayList;
import java.util.List;

public class Spieler {

private String name;
private int angriffsWert;
private int verteidigungsWert;
private List<Gabe> listGabe;
private List<Waffen> listWaffen;
private List<Items> listItems;

public Spieler(String name) {
this.name = name;
this.angriffsWert = 12;
this.verteidigungsWert = 8;
listGabe = new ArrayList<>();
listWaffen = new ArrayList<>();
listItems = new ArrayList<>();
}

public void addGabe(Gabe neueGabe) {
this.listGabe.add(neueGabe);
}

public void addWaffen(Waffen neueWaffen) {
this.listWaffen.add(neueWaffen);
}

public void addItems(Items neueItems) {
this.listItems.add(neueItems);
}

public void berechneAngriffsWert() {
for (Gabe gabe : listGabe) {
this.angriffsWert += gabe.getAngriffsBonus();
}
for (Waffen waffen : listWaffen) {
this.angriffsWert += waffen.getAngriffsBonus();
}
for (Items items : listItems) {
this.angriffsWert += items.getAngriffsBonus();
}
}

public void berechneVerteidigungsWert() {
for (Gabe gabe : listGabe) {
this.verteidigungsWert += gabe.getVerteidigungsBonus();
}
for (Waffen waffen : listWaffen) {
this.verteidigungsWert += waffen.getVerteidigungsBonus();
}
for (Items items : listItems) {
this.verteidigungsWert += items.getVerteidigungsBonus();
}
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAngriffsWert() {
berechneAngriffsWert();
return angriffsWert;
}

public void setAngriffsWert(int angriffsWert) {
this.angriffsWert = angriffsWert;
}

public int getVerteidigungsWert() {
berechneVerteidigungsWert();
return verteidigungsWert;
}

public void setVerteidigungsWert(int verteidigungsWert) {
this.verteidigungsWert = verteidigungsWert;
}

public List<Gabe> getListGabe() {
return listGabe;
}

public void setListGabe(List<Gabe> listGabe) {
this.listGabe = listGabe;
}
}
[/CODE]

[CODE lang="java" title="Main"]
public class Main {

public static void main(String[] args) {

Spieler spieler = new Spieler("Jens");

Gabe odinsKraft = new Gabe("Odins Kraft", 10, 5);
Gabe goettlicherWille = new Gabe("Göttlicher Wille", 20, 20);

Waffen langSchwert = new Waffen("Langschwert", 18, 5);

Items schlangenRing = new Items("Schlangen Ring", 5, 10);

spieler.addGabe(odinsKraft);
spieler.addGabe(goettlicherWille);

spieler.addWaffen(langSchwert);

spieler.addItems(schlangenRing);

System.out.println(spieler.getAngriffsWert());
System.out.println(spieler.getVerteidigungsWert());

}

}
[/CODE]
Guten Abend Jens, entschuldige die erneute Störung. Ich habe ein zweites Projekt erstellt und deinen Code eingetragen. Habe getter und setter in der Waffen Klasse erstellt und es läuft einwandfrei! Jedoch stellen sich mir dar noch 2 Fragen die ich ohne Erklärung noch nicht ganz verstehe.
Ich frage lieber ein zweites Mal bevor ich es falsch verstehe ^^

1. Wenn ich nun eine neue Waffe, Items etc. erstelle und in der Main auch sofort Parameter zuweise, wird die Main doch auf Dauer sehr voll, oder nicht? Weshalb ich Items in einer eigenen Klasse schreiben wollte. Ich frage aus dem Grund da viele Programmierer schreiben/sagen man solle die Main so klein und komprimiert wie möglich halten damit das Programm flüssiger und schneller läuft.

2. Da ich wie beschrieben noch in den Basics stecke, sehe ich diese "List" commands zum ersten Mal. Wo wird diese Liste denn genau gespeichert bzw., kann man diese irgendwie einsehen und auch bearbeiten?

Falls du dir nochmals die Zeit nimmt, danke ich dir nochmals dafür ^^
Lg
DraconicVisage
 
1. Wenn ich nun eine neue Waffe, Items etc. erstelle und in der Main auch sofort Parameter zuweise, wird die Main doch auf Dauer sehr voll, oder nicht? Weshalb ich Items in einer eigenen Klasse schreiben wollte. Ich frage aus dem Grund da viele Programmierer schreiben/sagen man solle die Main so klein und komprimiert wie möglich halten damit das Programm flüssiger und schneller läuft.
Also dabei geht es eher darum, dass der Code gut gekapselt und lesbar sein soll 🙂

2. Da ich wie beschrieben noch in den Basics stecke, sehe ich diese "List" commands zum ersten Mal. Wo wird diese Liste denn genau gespeichert bzw., kann man diese irgendwie einsehen und auch bearbeiten?
List ist ein Interface und wird zur laufzeit z.B. mit einer Arraylist gefüllt. Das sind Standart Java Datentypen um eben eine Liste an Datentypen zuspeichern. Ebenfalls ist diese Liste dynamisch also nicht wie ein Array 🙂
 
Hallo @DraconicVisage ,

freut mich, dass ich dir mit meinem Vorschlag helfen konnte und das er gut für dein Projekt funktioniert.
Möchte an dieser Stelle aber auch anmerken das ich selber auch noch in den Kinderschuhen, was Java angeht, stecke. Trotzdem möchte ich deine Fragen gerne beantworten (ohne den Anspruch auf 100%tige Richtigkeit)

zu 1. Meine Main diente nur zu Testzwecken. Das mit der Aussage, die Main klein zu halten, habe ich auch schon oft gelesen (alles über 10 Zeilen sei schon zu groß 🙂 ).
Deine Idee eine Klasse zu schreiben nur um in dieser Instanzen einer anderen Klasse zu erzeugen klingt für mich erstmal komisch, sollt aber am besten jemand anders bewerten der mehr Ahnung hat als ich.

zu 2. Im Gegensatz zum Array musst du bei einer ArrayList vorher keine Größe festlegen und kannst Werte mittels add ohne Angabe eines Index hinzufügen. Die Länge einer ArrayList passt sich automatisch an. Es gibt ähnliche Methoden wie beim Array, heißen nur anders. Z.B. arrayList.size(); um die Länge zu erfahren oder arrayList.get(int x); um auf ein bestimmten Index zuzugreifen.
Zusätzlich gibt es noch verschiedene .remove(); Methoden um Werte wieder zu löschen.

Grüße JensXF
 
Deine Idee eine Klasse zu schreiben nur um in dieser Instanzen einer anderen Klasse zu erzeugen klingt für mich erstmal komisch, sollt aber am besten jemand anders bewerten der mehr Ahnung hat als ich.
Die main-Methode ist als Programmeinstiegspunkt die Methode, die sich um den Start der Anwendung kümmert, also um etwas, das sich grundlegend vom Rest der Anwendung unterscheidet. Schon aus dieser Überlegung heraus empfiehlt es sich, eine eigene Klasse dafür zu erstellen.

Hinzu kommt, dass beim Anwendungsstart ggf. verschiedene Klassen benötigt werden. Das ist teilweise selbst in meinen Beispielen im Forum schon so, dass ich für die main-Methode Typen importieren muss, die nichts mit der Beispielklasse zu tun haben. Durch diese Abhängigkeiten führt man eine völlig unnötige Kopplung ein: will ich die Klasse in ein anderes Projekt ziehen, muss ich den ganzen Schlauch mitführen.

Letztlich geht es also - wie immer - um Kopplung und Kohäsion.

Kleines Beispiel:
Java:
public class Person {
    private final String name;
    public Person(String name) { this.name = name; }
    public String toString() { return name; }
}

So, jetzt wollen wir ein Programm, das eine Liste von Personen anhand der Befehlszeile erstellt:
Java:
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<>();
        for (String name : args) {
            persons.add(new Person(name));
        }
        // ...
    }

Wenn ich die main-Methode in Person schiebe (wie ich es hier im Forum mache), gibt es plötzlich eine Abhängigkeit zwischen der Klasse Person und java.util.ArrayList bzw. java.util.List.

Das scheint erstmal harmlos, wenn wir das Beispiel aber etwas ausbauen und vielleicht noch schöne Befehlszeilenargumente haben wollen, dann könnten wir auf die Idee kommen, etwas wie Apache Commons CLI einzusetzen (https://commons.apache.org/proper/commons-cli/usage.html).

Will man jetzt Person woanders verwenden, müsste man auch Commons CLI einbinden, obwohl der interessante Part von Person diese Abhängigkeit gar nicht benötigt.
 
Wenn ich nun eine neue Waffe, Items etc. erstelle und in der Main auch sofort Parameter zuweise, wird die Main doch auf Dauer sehr voll, oder nicht? Weshalb ich Items in einer eigenen Klasse schreiben wollte. Ich frage aus dem Grund da viele Programmierer schreiben/sagen man solle die Main so klein und komprimiert wie möglich halten damit das Programm flüssiger und schneller läuft.
Die Main-Methode ist ja nur ein Startpunkt. Was machst Du denn, wenn Du anfangen willst, ein Spiel zu spielen? Du holst das Spiel aus dem Schrank (Erzeugst also eine Instanz vom Spiel) und dann startest Du das Spielen.

Und da ist dann wichtig: Code immer da platzieren, wo er hingehört!
- Der Ablauf des Spiels: Der wird doch vom Spiel bestimmt.
- Spielfiguren: die sind im Spiel.
Du merkst also: Das zauberst Du (die Main-Methode) nicht aus Deiner Tasche, sondern das ist Sache vom Spiel.

Damit ist dann wirklich die Main in der Regel sehr klein. Denn es wird nur etwas erstellt und dann gestartet. Bei Grafischen Applikationen wird oft ein Hauptfenster erzeugt und angezeigt. Sowas in der Art wäre also auch bei Dir denkbar:
Java:
public class Main {
    public static void main (String[] args) {
        Adventure adventure = new Adventure();
        adventure.start();
    }
}

Adventure weiß dann, was da alles benötigt wird. Unter anderem evtl. auch ganz viele Gegenstände.
Aber statt die alle im Code zu erzeugen, ist es üblich, sowas aus einer Art Datenbank zu lesen.

Das kann zur Not eine einfache Textdatei sein. Wie die genau aussehen soll, kannst Du Dir überlegen. Es gibt spezielle Formate wie JSON, die man dann sehr schön verwenden kann um Objekte mal eben so zu speichern oder zu laden.
==> Dadurch wird dein Code deutlich einfacher und auch kürzer.

Wichtig ist in meinen Augen, dass Du mehr versuchst, auch in Objekten zu denken. Also nicht nur Code auf Klassen aufteilen sondern dabei darauf achten, das da "natürliche Grenzen" eingehalten werden und Du universelle Klassen aufbaust.

Jens hat das schon sehr schön etwas gezeigt. Aber wir können das gerne noch etwas weiter ausbauen:
(ich gehe mal davon aus, dass Du eine Art Adventure bauen willst. Ich habe jetzt z.B. das alte Spiel Nethack etwas vor Augen.):

In dem Spiel hast Du erst einmal Lebewesen. Dies können Spieler und NPCs sein. Das kann man also so erst einmal abbilden in einer Klassenstruktur. Von NPCs können dann auch noch weitere spezielle Klassen abgeleitet werden. NPCs mit speziellem zusätzlichen verhalten oder so ...

Dann gibt es Gegenstände. Diese haben gewisse Eigenschaften (Name, Wert, Können ggf. benutzt oder angelegt werden, ....) Ob man alles in eine Klasse packt oder ob man das unterteilt in mehrere Klassen, das kann man dann sehen.
Wenn ein Gegenstand genutzt wird, dann gibt es einen Effekt, Effekte haben ggf. Bedingungen ("Man muss im Kampf sein, um eine Angriffsrune lesen zu können.", "Man muss verletzt sein, um einen Heiltrank trinken zu können", ...) Und dann haben eine Aktion. Aktionen können Einmalig oder Andauernd sein. Einmalig wäre "Man wird um x geheilt", "Gegner wird für 100 getroffen", ...) Andauernde Effekte wären: "Angriffskraft um 15 erhöht" - Schwert wird halt benutzt ....

Kampf: Ein Kampf findet zwischen zwei Spielern statt (Evtl. hat der Spieler ja einen Hund, der auch für ihn kämpfen kann?) Und dann passieren irgendwelche Dinge, die ich jetzt hier nicht ausbauen möchte. Aber ich will das Nutzen der anderen Klassen hier einmal zeigen:
Im Kampf kommt es zum Schlagabtausch. Dazu gehört dann, dass man z.B. die Gegenstände durchgeht um Effekte auszuwerten. Sprich: Wenn ein Gegenstand in Benutzung ist, dann werden die Effekte mit benutzt.

So kann man sich schon einiges direkt überlegen.

Wenn man das dann umsetzen will, dann überlegt man sich das immer Schritt für Schritt. Was braucht man als erstes? Und dann wird nur das ausgebaut. Erster Schritt ist dann evtl:
- Du hast ein Spielfeld/Raum/wie auch immer du es nennen willst.
- Der Spieler ist da und kann sich bewegen.

Also brauchst du da erst einmal nur sehr wenig Funktionalität. Vieles gibt es noch nicht (Gegenstände, die man nehmen kann oder so).

Zweiter schritt wäre dann evtl. eine Visualisierung: Es soll irgendwie angezeigt werden.

Dritter Schritt: Der Raum bekommt vielleicht erste Hindernisse.

Da kann man dann nach und nach einiges aufbauen. Aber immer langsam erweitern. Das hat den Hintergrund, dass die Änderungen übersichtlich bleiben und auch schnell erledigt sind. Dadurch behält man den Überblick und man hat auch ständig Erfolgserlebnisse.
 
Hallo @DraconicVisage ,

freut mich, dass ich dir mit meinem Vorschlag helfen konnte und das er gut für dein Projekt funktioniert.
Möchte an dieser Stelle aber auch anmerken das ich selber auch noch in den Kinderschuhen, was Java angeht, stecke. Trotzdem möchte ich deine Fragen gerne beantworten (ohne den Anspruch auf 100%tige Richtigkeit)

zu 1. Meine Main diente nur zu Testzwecken. Das mit der Aussage, die Main klein zu halten, habe ich auch schon oft gelesen (alles über 10 Zeilen sei schon zu groß 🙂 ).
Deine Idee eine Klasse zu schreiben nur um in dieser Instanzen einer anderen Klasse zu erzeugen klingt für mich erstmal komisch, sollt aber am besten jemand anders bewerten der mehr Ahnung hat als ich.

zu 2. Im Gegensatz zum Array musst du bei einer ArrayList vorher keine Größe festlegen und kannst Werte mittels add ohne Angabe eines Index hinzufügen. Die Länge einer ArrayList passt sich automatisch an. Es gibt ähnliche Methoden wie beim Array, heißen nur anders. Z.B. arrayList.size(); um die Länge zu erfahren oder arrayList.get(int x); um auf ein bestimmten Index zuzugreifen.
Zusätzlich gibt es noch verschiedene .remove(); Methoden um Werte wieder zu löschen.

Grüße JensXF
Tut mir leid für die späte Danksagung, Kinder, Ehefrau etc daheim. Da hat man wenig Zeit für seine Hobbys ^^ Na wenn du noch in den Kinderschuhen steckst, bin ich noch am krabbeln haha 😛
Aber Ich danke dir, dass sind viele Infos zu denen ich mich nun einlesen kann um das Konzept und den aufbau zu verstehen, dafür bin ich sehr dankbar! Ebenfalls läuft es wirklich sehr gut mit den gettern und settern und der arraylist 🙂 Mach dich nicht schlechter als du bist! Mir has du sehr geholfen 🙂


Die Main-Methode ist ja nur ein Startpunkt. Was machst Du denn, wenn Du anfangen willst, ein Spiel zu spielen? Du holst das Spiel aus dem Schrank (Erzeugst also eine Instanz vom Spiel) und dann startest Du das Spielen.

Und da ist dann wichtig: Code immer da platzieren, wo er hingehört!
- Der Ablauf des Spiels: Der wird doch vom Spiel bestimmt.
- Spielfiguren: die sind im Spiel.
Du merkst also: Das zauberst Du (die Main-Methode) nicht aus Deiner Tasche, sondern das ist Sache vom Spiel.

Damit ist dann wirklich die Main in der Regel sehr klein. Denn es wird nur etwas erstellt und dann gestartet. Bei Grafischen Applikationen wird oft ein Hauptfenster erzeugt und angezeigt. Sowas in der Art wäre also auch bei Dir denkbar:
Java:
public class Main {
    public static void main (String[] args) {
        Adventure adventure = new Adventure();
        adventure.start();
    }
}

Adventure weiß dann, was da alles benötigt wird. Unter anderem evtl. auch ganz viele Gegenstände.
Aber statt die alle im Code zu erzeugen, ist es üblich, sowas aus einer Art Datenbank zu lesen.

Das kann zur Not eine einfache Textdatei sein. Wie die genau aussehen soll, kannst Du Dir überlegen. Es gibt spezielle Formate wie JSON, die man dann sehr schön verwenden kann um Objekte mal eben so zu speichern oder zu laden.
==> Dadurch wird dein Code deutlich einfacher und auch kürzer.

Wichtig ist in meinen Augen, dass Du mehr versuchst, auch in Objekten zu denken. Also nicht nur Code auf Klassen aufteilen sondern dabei darauf achten, das da "natürliche Grenzen" eingehalten werden und Du universelle Klassen aufbaust.

Jens hat das schon sehr schön etwas gezeigt. Aber wir können das gerne noch etwas weiter ausbauen:
(ich gehe mal davon aus, dass Du eine Art Adventure bauen willst. Ich habe jetzt z.B. das alte Spiel Nethack etwas vor Augen.):

In dem Spiel hast Du erst einmal Lebewesen. Dies können Spieler und NPCs sein. Das kann man also so erst einmal abbilden in einer Klassenstruktur. Von NPCs können dann auch noch weitere spezielle Klassen abgeleitet werden. NPCs mit speziellem zusätzlichen verhalten oder so ...

Dann gibt es Gegenstände. Diese haben gewisse Eigenschaften (Name, Wert, Können ggf. benutzt oder angelegt werden, ....) Ob man alles in eine Klasse packt oder ob man das unterteilt in mehrere Klassen, das kann man dann sehen.
Wenn ein Gegenstand genutzt wird, dann gibt es einen Effekt, Effekte haben ggf. Bedingungen ("Man muss im Kampf sein, um eine Angriffsrune lesen zu können.", "Man muss verletzt sein, um einen Heiltrank trinken zu können", ...) Und dann haben eine Aktion. Aktionen können Einmalig oder Andauernd sein. Einmalig wäre "Man wird um x geheilt", "Gegner wird für 100 getroffen", ...) Andauernde Effekte wären: "Angriffskraft um 15 erhöht" - Schwert wird halt benutzt ....

Kampf: Ein Kampf findet zwischen zwei Spielern statt (Evtl. hat der Spieler ja einen Hund, der auch für ihn kämpfen kann?) Und dann passieren irgendwelche Dinge, die ich jetzt hier nicht ausbauen möchte. Aber ich will das Nutzen der anderen Klassen hier einmal zeigen:
Im Kampf kommt es zum Schlagabtausch. Dazu gehört dann, dass man z.B. die Gegenstände durchgeht um Effekte auszuwerten. Sprich: Wenn ein Gegenstand in Benutzung ist, dann werden die Effekte mit benutzt.

So kann man sich schon einiges direkt überlegen.

Wenn man das dann umsetzen will, dann überlegt man sich das immer Schritt für Schritt. Was braucht man als erstes? Und dann wird nur das ausgebaut. Erster Schritt ist dann evtl:
- Du hast ein Spielfeld/Raum/wie auch immer du es nennen willst.
- Der Spieler ist da und kann sich bewegen.

Also brauchst du da erst einmal nur sehr wenig Funktionalität. Vieles gibt es noch nicht (Gegenstände, die man nehmen kann oder so).

Zweiter schritt wäre dann evtl. eine Visualisierung: Es soll irgendwie angezeigt werden.

Dritter Schritt: Der Raum bekommt vielleicht erste Hindernisse.

Da kann man dann nach und nach einiges aufbauen. Aber immer langsam erweitern. Das hat den Hintergrund, dass die Änderungen übersichtlich bleiben und auch schnell erledigt sind. Dadurch behält man den Überblick und man hat auch ständig Erfolgserlebnisse.
Uff das ist so viel Information, da muss ich mir Notizen machen ^^ also bei Spielen habe ich mein Kindheitsspiel Runescape vor Augen. Dort z. B. kann man sich Server und Client downloaden, was ich auch getan habe, um mir mal anzusehen wie es in etwa aufgebaut ist. Dort als Beispiel haben sie ganze Item listen mit item IDs. Mein erstes großes Ziel ist es, mich in solch einen Privatserver auszutoben und ihn so zu gestalten wie Meine Kollegen und Ich dann zusammen spaß hätten(alte Zeiten halt 🙂 )

Viele Programmierer sagen man könnte sich mit einem Text Adventure die ersten Erfahrungen holen und diesen dann ausbauen. Mit Graifken, einer KI, Quests, usw. natürlich 🙂

Mein derzeitiges Ziel ist es ein Text Adventure zu erstellen wo der Spieler wie oben genannt die freie Wahl besitzt, ob er entweder Links oder Rechts geht, ob er kämpft oder nicht und er soll die Möglichkeit haben auch wieder in die vorherigen Abschnitte des Spiels zurückzukehren.

Wenn ich das dann so weit stehen habe, baue ich ihn via Java Swing/FX(Was ist besser zu lernen?) aus um Grafiken, Chatblasen, Inventar etc. einzufügen.

Ich bin sehr Dankbar, dass es hier so viele freundliche Leute gibt die einen nicht blöd kommen, was häufig passiert. Dafür bin ich euch hier allen wirklich Dankbar! ^^ und auch für die vielen Wege und Möglichkeiten. Ich bin nicht hier um eine Lösung zu erhalten, dass kann jeder. Aber ein Denkanstoß wie ihr es tut, ist einfach perfekt und nimmt nicht den Spaß am Lernen! 🙂
 

Zurück
Oben