# Attribut von Objekt ändern



## Ostkreuz (19. Dez 2022)

Wie kann ich dem Captain, dem Quartiermeister und dem Rest der Crew in einer neuen Klasse Dukaten hinzufügen?
Habe absolut keinen Ansatz dafür.
Das sind meine jetzigen Klassen.

```
public class Pirate {

    private String firstName;
    private String lastName;
    private int yearOfBirth;
    private String pet = null;
    private int ducats;

    public Pirate(String firstName, String lastName, int yearOfBirth) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.yearOfBirth = yearOfBirth;
    }

    public Pirate() {
    }

    public void setPet(String pet) {
        this.pet = pet;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public int getYearOfBirth() {
        return yearOfBirth;
    }

    public String getPet() {
        return pet;
    }

    public int getDucats() {
        return ducats;
    }

    public void addDucats(int amount) {
        this.ducats += amount;
    }

    public String print() {
        return "Pirat "  + firstName +  " " + lastName + ". (" + ducats + " Dukaten)";
    }
}

public class Ship {
    private String shipName;
    private int treasury;
    private Pirate captain;
    private Pirate quartermaster;
    private Pirate[] crew = new Pirate[10];

    public Ship(String shipName) {
        this.shipName = shipName;
    }

    public String getShipName() {
        return shipName;
    }

    public int getTreasury() {
        return treasury;
    }

    public void setTreasury(int treasury) {
        this.treasury = treasury;
    }

    public void addDucats(int amount){
        this.treasury += amount;
    };

    public Pirate getCaptain() {
        return captain;
    }

    public Pirate getQuartermaster() {
        return quartermaster;
    }

    public Pirate[] getCrew() {
        return crew;
    }

    public void setCaptain(Pirate captain) {
        this.captain = captain;
    }

    public void setQuartermaster(Pirate quartermaster) {
        this.quartermaster = quartermaster;
    }

    public void addPirate(Pirate pirate) {
        for (int i = 0; i < this.crew.length; i++) {
            if (crew[i] == null) {
                crew[i] = pirate;
                break;
            }
        }
    }

    public void deletePirate(String firstName, String lastName) {
        for (int i = 0; i < this.crew.length; i++) {
            Pirate pirate = crew[i];
            if (pirate.getFirstName().equals(firstName) && pirate.getLastName().equals(lastName)) {
                crew[i] = null;
                break;
            }
        }
    }
    public int countPirate() {
        int counter = 0;
            for (int i = 0; i < crew.length; i ++) {
                if (crew[i] != null)
                    counter ++;  
            }

        return counter;  
    }
}
```


----------



## mihe7 (19. Dez 2022)

Ostkreuz hat gesagt.:


> Wie kann ich dem Captain, dem Quartiermeister und dem Rest der Crew in einer neuen Klasse Dukaten hinzufügen?


Du hast doch in Pirate schon ducats. Was willst Du da noch hinzufügen?


----------



## Jw456 (19. Dez 2022)

Wo und wie erstellst denn einen neuern Priraten. Ich sehe nichts in deinen Code von new Pirat.


Dann rufe doch captain.addDucats(10);  auf

Bei einem  Piraten dann musst du denn halt in der Liste suchen und auf die gefundene Instanz auch die add Methode aufrufen.


----------



## Ostkreuz (19. Dez 2022)

mihe7 hat gesagt.:


> Du hast doch in Pirate schon ducats. Was willst Du da noch hinzufügen?


Das ist die Aufgabe:
 Schreiben Sie eine Methode *public void simuliereSaison()*, in der 10 Kaperfahrten durchgeführt werden. Am Ende jede Kaperfahrt wird die Beute der Schatzkammer des Schiffes hinzugefügt. Berechnen Sie anschließend den Beuteanteil für jeden Piraten und fügen Sie diesen dem Geldbeutel des Piraten mittels *addDucats* hinzu. Geben Sie anschließend jeden Piraten der Besatzung mit seinem jeweiligen Vermögen aus.

```
public class Kaperfahrt {
        public void simuliereSaison()  {
        for (int x=0; x < 10; x++) {
            beginneKaperfahrt();
            int beute = beginneKaperfahrt();
            int counter = ship.countPirate();
            int anteil = berechneAnteile(beute, counter);
        }   
        }
```
Ich verstehe nur nicht was ich jetzt schreiben muss um auf die Dukaten von dem captain und quartermeister zuzugreifen


----------



## Ostkreuz (19. Dez 2022)

Ostkreuz hat gesagt.:


> Das ist die Aufgabe:
> Schreiben Sie eine Methode *public void simuliereSaison()*, in der 10 Kaperfahrten durchgeführt werden. Am Ende jede Kaperfahrt wird die Beute der Schatzkammer des Schiffes hinzugefügt. Berechnen Sie anschließend den Beuteanteil für jeden Piraten und fügen Sie diesen dem Geldbeutel des Piraten mittels *addDucats* hinzu. Geben Sie anschließend jeden Piraten der Besatzung mit seinem jeweiligen Vermögen aus.
> 
> ```
> ...


----------



## Jw456 (19. Dez 2022)

Du brauchst in der Klasse natürlich eine Instanz von dem Schief.
Das Objekt Schiff was du der Kalssse mitgeben musst.


----------



## mihe7 (19. Dez 2022)

Ostkreuz hat gesagt.:


> Ich verstehe nur nicht was ich jetzt schreiben muss um auf die Dukaten von dem captain und quartermeister zuzugreifen


Um auf den Kapitän oder Quartiermeister oder die Piraten des Schiffs Zugriff zu haben, muss Ship entsprechende Methoden anbieten. Ggf. musst Du halt welche hinzufügen.


----------



## Jw456 (19. Dez 2022)

```
// in der Klasse Ship
public void addDucatsProPirat(int ducats) {
        for (int i = 0; i < this.crew.length; i++) {
                Pirate pirate = crew[i];
                pirrate.addDucats(ducats);
                  
            }
        }
```


----------



## Jw456 (19. Dez 2022)

```
// Kaperfahrt
ship.getCaptain().addDucats( xxxx );
```


----------



## Ostkreuz (19. Dez 2022)

Jw456 hat gesagt.:


> ```
> // in der Klasse Ship
> public void addDucatsProPirat(int ducats) {
> for (int i = 0; i < this.crew.length; i++) {
> ...


Danke habe es jetzt so

```
public void simuliereSaison()  {
        for (int x=0; x < 10; x++) {
            beginneKaperfahrt();
            int beute = beginneKaperfahrt();
            int counter = ship.countPirate();
            int anteil = berechneAnteile(beute, counter);
            double anteilquartermaster = berechneAnteile(beute, counter)*1.5;
            int anteilquartermaster1 = (int)anteilquartermaster;
            ship.getCaptain().addDucats(anteil*2);
            ship.getQuartermaster().addDucats(anteilquartermaster1);
            ship.addDucatsProPirat(anteil);
        }
    }
```


----------



## temi (20. Dez 2022)

Du rufst die Methode beginneKaperfahrt() zweimal auf. Das hat an dieser Stelle keine negative Auswirkung, aber ist überflüssig.


```
for (int x=0; x < 10; x++) {
            beginneKaperfahrt(); // hier rufst du die Methode auf und verwirfst das Ergebnis
            int beute = beginneKaperfahrt(); // hier nochmal und du speicherst das Ergebnis
```

Es gibt durchaus Fälle, wo es einen Fehler darstellen würde, z. B. der Aufruf einer (fiktiven) Methode getLineFromFile(). Damit würde nur jede zweite Zeile verarbeitet werden...


----------



## mihe7 (20. Dez 2022)

temi hat gesagt.:


> Es gibt durchaus Fälle, wo es einen Fehler darstellen würde


Ja, ich würde sagen, das ist genau dann der Fall, wenn die Methode nicht idempotent ist, d. h. bei jedem Aufruf zu einer Zustandsänderung führt (wobei hier mit Zustand nicht nur der innere Zustand gemeint ist).


----------

