# Superhelden - Spiel



## icrystaltm (4. Dez 2019)

Hallo Guten Abend,

Also ich als Java - Newbie bin im ersten Semester meines Studiums, d.h. also ich habe jetzt nicht wirklich Erfahrung was das Programmieren anbelangt.
Ich muss ein Spiel programmieren (nur als Text) in Eclipse und in dem Spiel geht es darum, dass man sich Superhelden erstellen kann maximal 5, die dann einfach einen Abenteuer erleben, indem sie gegen irgendwelche Kreaturen kämpfen.

Mein Problem ist jetzt, dass ich die Methoden für Attack, TakenDamage und alles drum und dran erstellt habe. Außerdem habe ich einen Konstruktor, in der man den Namen, den Heldentypen, das Leben und die Fähigkeiten bestimmen kann.

Bloß ist jetzt da eine Teilaufgabe in der ich eine Methode erstellen soll wo ich dann 3 Superhelden anlege. Auch hat mein ein Menü, wo man dann von da aus Zugriff auf die Superhelden haben sollte. Das Menü würde dann so ausschauen: (Anhang)

So ich bin wirklich am verzweifeln, wir hatten erst heute in der Vorlesung das Thema Arrays, das heißt so allzuviel Wissen habe ich nicht. Ich weiß echt nicht wie ich anfangen soll, wie ich das umsetzen soll. Es wäre wirklich sehr hilfreich, wenn mir mal jemand zu dieser Teilaufgabe einen Ansatz nennen würde.


----------



## MoxxiManagarm (6. Dez 2019)

Du hast eine Klasse 'Superheld'. Das ist gut. Was du jetzt brauchst ist eine Klasse 'Team'. Dieses Team Hat irgendeine Datenstruktur für diese Superhelden.


```
class Team {
  private List<Superheld> superhelden = new ArrayList<>();
}
```

Wenn du nun im Menü von Aufgabe 4 bist, bist du im Scope einer Instanz dieser Klasse. Was du dann brauchst um die einzelnen Punkte von Aufgabe 4 zu erfüllen:
1) Eine Methode 'addSuperheld', die zuerst die gewählte Datenstruktur überrüft, wieviele Superhelden bereits enthalten sind. Wenn es weniger als 5 sind werden die benötigten Daten zur Anlage eines Superhelden von der Konsole abgefragt und anschließend der Superheld erstellt. Der erstellte Superheld wird in der Datenstruktur gespeichert.
2) Am besten ist es du fügst der Klasse Superheld eine Methode 'print' hinzu, welche diese Ausgaben vornimmt. Falls du das nicht darfst kannst du auch mit gettern auf den Superheld zugreifen und du machst diese Logik im Team. Für eine übersichtliche Darstellung empfehle ich eine Tabellenstruktur mit '\t'. Um einen speziellen Superhelden auszuwählen musst du sicherlich auch eine Konsoleneingabe (Index des Superhelden in der Datenstruktur) einfordern.
3) Hier iterierst du über die Superhelden in der Datenstruktur und rufst 'print' des Superhelden auf.
4) Auch hier brauchst du einen Superhelden Index wie bei 2). Diesen Index verwendest du dann um den Superheld einfach aus der Datenstruktur zu entfernen.
5) (ich kenne die Aufgabe 3 nicht)

Das sieht dann etwa so aus im Rahmen:


```
class Team {
  private List<Superheld> superhelden = new ArrayList<>();

  // eventuell eine Methode für das Menü

  public void addSuperheld() {
    // return falls bereits 5 Superhelden im Team sind
    // Daten des neues Superhelden eingeben
    // Superheld erstellen
    // Superheld in superhelden einfügen
  }

  private int selectSuperheld() {
    // listet die Superhelden in Kurzform (Name?) auf
    // erbittet eine Index Eingabe
    // return den eingegebenen Index
  }

  public void printSuperheld() {
    int index = selectSuperheld();
    superhelden.get(index).print();
  }

  public void printSuperhelden() {
    for(superheld : superhelden) {
      superheld.print();
    }
  }

  public void deleteSuperheld() {
    int index = selectSuperheld();
    superhelden.remove(index);
  }

  // irgendwas für dein Abenteuer
}
```


----------



## icrystaltm (6. Dez 2019)

Erstmal vielen Dank für deine sehr hilfreiche Antwort  Könntest du mir vielleicht erklären wie es ausschauen würde, wenn man schon im Voraus bereits drei Superhelden erstellt hat und wie man die dann in das Team einfügen würde?


----------



## mihe7 (6. Dez 2019)

```
superhelden.add(new Superheld("Tick"));
superhelden.add(new Superheld("Trick"));
superhelden.add(new Superheld("Track"));
```


----------



## icrystaltm (7. Dez 2019)

Also ich habe jetzt einiges Mal gemacht und bin auf einige Probleme gestoßen und zwar in der Methode "selectSuperhero()" und "deleteSuperhero()". Ich poste mal erst meinen Code.


```
public class Team {
    private ArrayList<Superhero> superhelden = new ArrayList<>();
    
    Scanner scan = new Scanner(System.in);
    
    public void createdHeroes() {
        Superhero krieger = new Superhero("Thylraz", "Krieger");
        krieger.setLevel(1);
        krieger.setExperiencePoints(0);
        krieger.setHealthPointsMax(50);
        krieger.setHealthPointsCurrent(50);
        krieger.setAlive(true);
        superhelden.add(0, krieger);
        Superhero archer = new Superhero("Artemis", "Bogenschütze");
        archer.setLevel(1);
        archer.setExperiencePoints(0);
        archer.setHealthPointsMax(50);
        archer.setHealthPointsCurrent(50);
        archer.setAlive(true);
        superhelden.add(1, archer);
        Superhero berserk = new Superhero("Adukan", "Berserker");
        berserk.setLevel(1);
        berserk.setExperiencePoints(0);
        berserk.setHealthPointsMax(50);
        berserk.setHealthPointsCurrent(50);
        berserk.setAlive(true);
        superhelden.add(2, berserk);
    }
    
    public void consoleSuperhero() {
        
    }

    public Superhero addSuperhero() { // Parameter abenteuerer hinzufügen
        Superhero held4 = new Superhero("", "");
        if(superhelden.size() <= 4) {
        System.out.println("Hallo Beschwörer! Welche Klasse soll dein Held haben?");
        String heroRole = scan.nextLine();
        System.out.println("Wie möchtest du deinen Held benennen?");
        String heroName = scan.nextLine();
        held4 = new Superhero(heroName, heroRole);
        System.out.println("Dein Held heißt: " + held4.getName());
        System.out.println("Du hast den Helden: " + held4.getName() + ". Rolle: " + heroRole+"\n");
        held4.setLevel(1);
        held4.setExperiencePoints(0);
        held4.setHealthPointsMax(50);
        held4.setHealthPointsCurrent(50);
        held4.setAlive(true);
        superhelden.add(3, held4);
        return held4;
        }
        else {
            System.out.println("\nDu hast schon genug Helden!");
        }
        return held4;
    }

    public int selectSuperhero() {
        int index = 0;
        for(int i = 0; i < superhelden.size(); i++) {
            System.out.println(superhelden.get(index));
            index++;
        }
        index = scan.nextInt();
        return index;
    }

    public void printOneSuperhero() {
        System.out.println("\nVon welchem Superhelden möchtest du die Daten sehen?\n");
        int index = selectSuperhero();
            System.out.println(superhelden.get(index).getName() + " " + superhelden.get(index).getHeroRole() + " "
                    + superhelden.get(index).getLevel() + " " + superhelden.get(index).getHealthPointsCurrent() + " "
                    + superhelden.get(index).isAlive());
    }
    
    public void printAllSuperhero() {
        for(Iterator it = superhelden.iterator(); it.hasNext(); ) {
            System.out.println(superhelden.toString());
            break;
        }
    }
    public void deleteSuperhero() {
        System.out.println("Welchen Superheld möchtest du aus deinem Team entfernen?\n");
        int index = selectSuperhero();
        superhelden.remove(index);
        System.out.println("Der gewünschte Superheld: " + superhelden.get(index) +"wurde aus dem Team entfernt.");
      }
}
```

Und zwar ist es so, dass ich in der Methode: "selectSuperhero()" es nicht schaffe, dass nur der Name und die Rolle angezeigt werden soll. Es werden nämlich auch zusätzlich die HP Anzeige und das Level angezeigt.
Außerdem wenn ich in der Methode: "deleteSuperhero()", mein Index 0 eintippe, welches ja für den Krieger stehen soll, löscht der mir dann aber den "Bogenschützen", welchen ich aber den Index 1 zugewiesen hatte.

Auch komme ich bei der Methode "printAllSuperhero()" nicht weiter. Ich schaffe es irgendwie nicht eine Foreach - Schleife zu erstellen.

Des Weiteren bei der Methode "addSuperhero()" erstellt der mir zwar einen Helden und fügt es auch in die Liste hinzu, aber mein Problem ist, dass wenn ich zum Beispiel im Laufe des Spiels einen neuen Helden hinzufügen sollte, dass der mir dann das überschreibt.

Ich weiß, ist etwas zuviel verlangt, aber ich programmiere wirklich zum ersten Mal an so einem "Projekt".


----------



## kneitzel (7. Dez 2019)

Also bezüglich der Ausgabe: Du nutzt da derzeit einfach die toString Methode. Diese kannst Du ggf. überschreiben oder Du gibst gezielt die Attribute des Superhelden aus, die Du ausgeben möchtest.

Was das Löschen angeht: Er löscht schon den richtigen Helden, aber die Ausgabe danach ist falsch:
Du hast den Krieger auf 0 und den Magier auf 1.
Jetzt löscht Du den Krieger auf 0.
Da die ArrayList aber die Elemente immer mit 0 anfängt durch zu zählen, ist der Magier nun auf 0. Somit gibst Du dann den Superhelden au, der nun an dem index des gelöschten Helden steht.


----------



## icrystaltm (7. Dez 2019)

JustNobody hat gesagt.:


> Also bezüglich der Ausgabe: Du nutzt da derzeit einfach die toString Methode. Diese kannst Du ggf. überschreiben oder Du gibst gezielt die Attribute des Superhelden aus, die Du ausgeben möchtest.
> 
> Was das Löschen angeht: Er löscht schon den richtigen Helden, aber die Ausgabe danach ist falsch:
> Du hast den Krieger auf 0 und den Magier auf 1.
> ...


Verstehe die toString Methode, dass überarbeite ich dann mal.
Weißt du wie ich die Ausgabe am Ende dann überarbeiten müsste?


----------



## temi (7. Dez 2019)

icrystaltm hat gesagt.:


> Weißt du wie ich die Ausgabe am Ende dann überarbeiten müsste?



Du könnest dir, z.B. merken, welcher Superheld an Index 0 steht, bevor du ihn löscht und diesen Merker zur Ausgabe verwenden.


----------



## kneitzel (7. Dez 2019)

icrystaltm hat gesagt.:


> Weißt du wie ich die Ausgabe am Ende dann überarbeiten müsste?



Die Ausgabe beim Löschen?
Du könntest den Superhelden mit dem gewählten Index erst abfragen und in einer Variable speichen.
Dann kannst Du ihn aus der ArrayList löschen und mit Hilfe der Variable dann ausgeben.


----------



## Javinner (7. Dez 2019)

```
public class SuperHeroDemo
{

    public static void main(String[] args)
    {
        SuperHeroTeam team = new SuperHeroTeam();
        SuperHero hero;
        boolean game = false;
        while (!game)
        {
            int x = Menu.decision();
            switch (x)
            {
                case 1:
                    team.addSuperHero(HeroCreator.createHero());
                    break;
                case 2:
                    hero = team.showGalery();
                    team.printSuperHeroData(hero);
                    break;
                case 3:
                    team.printAllSuperHeroData();
                    break;
                case 4:
                    hero = team.showGalery();
                    team.removeSuperHero(hero);
                case 5:
                    System.out.println("Ein Abenteuer bestreiten, siehe Aufgabe 3");
                    break;
                case 6:
                    game = true;
                    break;
            }
        }

    }

}

/** Output */
(1)   Superheld anlegen
(2)   Daten eines Superhelden ausgeben
(3)   Daten aller Superhelden ausgeben
(4)   Superheld aus dem Team nehmen
(5)   Ein Abendteuer bestreiten
(6)   Beenden
1
Superheld Name:
Mario
Heroskills Nr.: 1
Kart fahren
Heroskills Nr.: 2
Pilze jaegen
Heroskills Nr.: 3
Prinzessin retten
Healt:
100
Expirience:
100
(1)   Superheld anlegen
(2)   Daten eines Superhelden ausgeben
(3)   Daten aller Superhelden ausgeben
(4)   Superheld aus dem Team nehmen
(5)   Ein Abendteuer bestreiten
(6)   Beenden
1
Superheld Name:
Weihnachtsmann
Heroskills Nr.: 1
Grosser Sack
Heroskills Nr.: 2
Lederstiefel
Heroskills Nr.: 3
Schornsteinklettern
Healt:
500
Expirience:
500
(1)   Superheld anlegen
(2)   Daten eines Superhelden ausgeben
(3)   Daten aller Superhelden ausgeben
(4)   Superheld aus dem Team nehmen
(5)   Ein Abendteuer bestreiten
(6)   Beenden
1
Superheld Name:
Marie
Heroskills Nr.: 1
Augenblitz
Heroskills Nr.: 2
Dicke Huppen
Heroskills Nr.: 3
Macht der Verfuehrung
Healt:
400
Expirience:
600
(1)   Superheld anlegen
(2)   Daten eines Superhelden ausgeben
(3)   Daten aller Superhelden ausgeben
(4)   Superheld aus dem Team nehmen
(5)   Ein Abendteuer bestreiten
(6)   Beenden
2
(1)Mario
(2)Weihnachtsmann
(3)Marie
3
Name: Marie
(1)Augenblitz
(2)Dicke Huppen
(3)Macht der Verfuehrung
Ready to Fight: true
Alive: : true
   ---   
(1)   Superheld anlegen
(2)   Daten eines Superhelden ausgeben
(3)   Daten aller Superhelden ausgeben
(4)   Superheld aus dem Team nehmen
(5)   Ein Abendteuer bestreiten
(6)   Beenden
3
Name: Mario
(1)Kart fahren
(2)Pilze jaegen
(3)Prinzessin retten
Ready to Fight: true
Alive: : true
   ---   
Name: Weihnachtsmann
(1)Grosser Sack
(2)Lederstiefel
(3)Schornsteinklettern
Ready to Fight: true
Alive: : true
   ---   
Name: Marie
(1)Augenblitz
(2)Dicke Huppen
(3)Macht der Verfuehrung
Ready to Fight: true
Alive: : true
   ---   
(1)   Superheld anlegen
(2)   Daten eines Superhelden ausgeben
(3)   Daten aller Superhelden ausgeben
(4)   Superheld aus dem Team nehmen
(5)   Ein Abendteuer bestreiten
(6)   Beenden
4
(1)Mario
(2)Weihnachtsmann
(3)Marie
1
Ein Abenteuer bestreiten, siehe Aufgabe 3
(1)   Superheld anlegen
(2)   Daten eines Superhelden ausgeben
(3)   Daten aller Superhelden ausgeben
(4)   Superheld aus dem Team nehmen
(5)   Ein Abendteuer bestreiten
(6)   Beenden
3
Name: Weihnachtsmann
(1)Grosser Sack
(2)Lederstiefel
(3)Schornsteinklettern
Ready to Fight: true
Alive: : true
   ---   
Name: Marie
(1)Augenblitz
(2)Dicke Huppen
(3)Macht der Verfuehrung
Ready to Fight: true
Alive: : true
   ---   
(1)   Superheld anlegen
(2)   Daten eines Superhelden ausgeben
(3)   Daten aller Superhelden ausgeben
(4)   Superheld aus dem Team nehmen
(5)   Ein Abendteuer bestreiten
(6)   Beenden
5
Ein Abenteuer bestreiten, siehe Aufgabe 3
(1)   Superheld anlegen
(2)   Daten eines Superhelden ausgeben
(3)   Daten aller Superhelden ausgeben
(4)   Superheld aus dem Team nehmen
(5)   Ein Abendteuer bestreiten
(6)   Beenden
6
```


----------



## Javinner (7. Dez 2019)

icrystaltm hat gesagt.:


> public void createdHeroes


Sollte man nicht dynamisch die Helden erstellen können? Das geht doch klar aus der Aufgabe hervor..


----------



## icrystaltm (7. Dez 2019)

Javinner hat gesagt.:


> Sollte man nicht dynamisch die Helden erstellen können? Das geht doch klar aus der Aufgabe hervor..


Also unsere Dozentin meinte, man soll schon im Voraus drei Superhelden erstellen, die der Nutzer fürs Erste erstmal hat. Nach Wunsch kann der Nutzer dann, die Superhelden aus seinem Team entfernen und ein komplett neues Team basteln. Deswegen stellte sich halt bei mir die Frage, wie ich das dann in der Methode: "addSuperhero()" bearbeiten muss, damit es nicht ständig überschrieben wird, wenn man ein neues Held erstellt.


----------



## Javinner (7. Dez 2019)

icrystaltm hat gesagt.:


> unsere Dozentin meinte


Klar definierte Aufgabenstellung wird eh überbewertet.. 


icrystaltm hat gesagt.:


> addSuperhero()


Warum sollte diese überschrieben werden? Bis auf den Fall, dass du mehrere gleichzeitig hinzufügen willst, aber auch da, sehe ich wenig Sinn. Wie der Name sagt, fügt es deinem Team ein neuen Held hinzu.


----------



## mihe7 (7. Dez 2019)

Javinner hat gesagt.:


> Sollte man nicht dynamisch die Helden erstellen können? Das geht doch klar aus der Aufgabe hervor..





MoxxiManagarm hat gesagt.:


> 5) (ich kenne die Aufgabe 3 nicht)



Ist das nur bei mir sichtbar?!? Ich tipps mal ab:


> Aufgabe 3
> Legen Sie eine Methode an, in der Sie 3 Superhelden anlegen. Mit der Aufgabe 4 werden Sie die 3 Superhelden zu Ihrem Team hinzufügen.


----------



## MoxxiManagarm (9. Dez 2019)

mihe7 hat gesagt.:


> Ist das nur bei mir sichtbar?!? Ich tipps mal ab:


Habe jetzt mal drauf geachtet. Du hast Recht, nur mein Browser hatte einen schwarzen Balken davorgelegt


----------

