Werte aus verschiedene Objekten ausgeben?

2 Antworten

Ave!

Ohne die Struktur zu kennen ist es schwierig die Frage zu beantworten.

Generell muss das Objekt iteriert und die Ergebnisse miteinander abgeglichen werden.

Hätten wir die Struktur könnten wir dir sagen, wie genau das geht.


Quentinbran 
Beitragsersteller
 21.06.2021, 23:16

Jo habe grade noch kurz Bilder hochgeladen müssen gleich Online sein. Bin noch relativ am Anfang deswegen Versuch ich erstmal mit den einfachsten Mitteln zu arbeiten

0

Zunächst ein Verweis auf Code Conventions. Ich weiß nicht, welches schlechte Tutorial dies vermittelt (es scheint ein Tutorial zu sein, da ich es immer häufiger bei Anfängern sehe), doch Klassennamen beginnen sinnvollerweise mit einem Großbuchstaben. Oft stellen sie Objekte dar (Bsp.: Würfel, Spieler) und des Weiteren können sie so besser von anderen Elementen unterschieden werden.

Negativbeispiel:

wuerfel wuerfel = new wuerfel();
wuerfel.ermittleZahl();

Ist die Methode in Zeile 2 nun objekt- oder klassengebunden? Am bloßen Aufruf sieht man es nicht mehr.

Klarer:

Wuerfel wuerfel = new Wuerfel();
wuerfel.ermittleZahl();

Was ich ebenso nicht empfehlen kann, ist das Vermischen von verschiedenen Sprachen bei den Bezeichnern, denn es stört den Lesefluss (das Gehirn muss immer wieder den Kontext wechseln). Entweder du verwendest stets deutsche Bezeichner oder durchgehend englische Namen. Letztere Sprache bietet sich natürlich stets am ehesten an, da auch andere Bezeichner aus externen Bibliotheken oder der SE in englischer Sprache gehalten sind.

Zu deinem Problem: Nach logischem (und objektorientierten) System wäre der Würfel nur für das Würfeln zuständig, also bspw. die Generation einer Zufallszahl. Vergleichen tut er nichts (es sei denn, du hast sprechende Würfel bei dir zu Hause 😉).

Insofern sehe ich nicht einmal, wieso dein Programm überhaupt ein Würfelobjekt bräuchte, denn die Zahlenwerte kommen doch vom Spieler (bzw. seiner Eingabe).

So wie ich es bisher verstehe, bräuchtest du nur eine Methode, die eine Nutzereingabe einliest und dazu ein Array (oder eine Liste), bei der der Wert an einen bestimmten Index eingeordnet wird. Die letztendliche Überprüfung, wer den nun gewonnen hat, kann ebenso in der Klasse Spiel definiert werden.

Trotzdem noch eine kurze Erklärung (anhand eines Beispiels), wie man Werte an andere Objekte übergeben kann:

class CardSoldier {
  public void paintUp(Rose rose) {
    rose.setColor(Color.red);
  }
}

class Rose {
  private Color color;

  public void setColor(Color color) {
    this.color = color;
  }
}

// main:
Rose rose = new Rose();
CardSoldier soldier = new CardSoldier();
soldier.paintUp(rose);

In diesem Beispiel wird eine Rose rot angemalt. Ganz nach dem Prinzip der Kapselung (ein Prinzip der objektorientierten Programmierung) wird der Wert des color-Felds über eine Methode gesetzt (setColor). Diese Methode ist nach außen hin sichtbar, kann also auch in anderen Methoden aufgerufen werden (sofern ein Objekt existiert, über welches die Methode aufgerufen werden kann).

Die Methode paintUp bekommt ein Objekt vom Typ Rose als Parameter hineingereicht, kann somit also auch dessen Methode setColor aufrufen.

In der main-Methode wird es nun konkreter. Dort wird das konkrete Rose-Objekt erstellt (welches angemalt werden soll) und auch ein Objekt für den Maler. Das Rose-Objekt wird an paintUp übergeben, sodass diese ihre Arbeit verrichten kann.

Zusammengefasst ist die Übertragung des Werts / Objekts an einen Parameter einer Methode der entscheidende Kern des Ganzen.

Abseits davon gibt es noch andere Möglichkeiten, um Werte zwischen Objekten zu teilen (die allerdings auch Fehlerquellen begünstigen / gegen das Konzept der OOP laufen können, bspw. der Missbrauch klassengebundener Elemente als globale Variablen). Auf diese werde ich hier nicht weiter eingehen.

PS.: Vermeide es, main direkt aufzurufen. Würdest du dein Programm um Konsolenparameter erweitern wollen, hättest du da schon die erste Stelle, die ebenfalls mit angepasst werden müsste. Auch der Lesbarkeit halber würde ich auf eine Rekursion verzichten.

Wenn du den Ablauf des Spiels wiederholen möchtest, verwende eher eine Schleife. Die ist klarer.

Beispiel:

public static void main (String[] args) {
  boolean repeat = false;

  do {
    // play game ...
    
    repeat = /* should repeat? true or false ... */
  }
  while (repeat);
}

Quentinbran 
Beitragsersteller
 22.06.2021, 20:18

Danke für deine ausführliche Antwort. Sie hat mir echt weiter geholfen und ich konnte mehr Struktur in meinen Code bringen. 👌🏼

0