Hilfe bei BlueJ Programmieren?

1 Antwort

Bitte poste zukünftig Code in Textform (Bilder sind mobile bspw. gar nicht lesbar) und wenn auch nur den relevanten Teil. Die Information über Methoden, die bspw. die Größe setzten, ist für dieses Problem doch ziemlich unwichtig. Zum Posten kannst du Seiten wie pastebin oder hastebin verwenden.

Was dir fehlt ist zum Einen die Abfrage nach dem Event (Mausklick), welches als Trigger für einen Farbwechsel fehlt, dann eine konkrete Farbe, die die Kugel annehmen soll und die Möglichkeit, die Kugel anders zu zeichnen. Die Methode zeichne zeichnet ja nur, doch die initiale Farbe wird im Konstruktor des Objekts gesetzt und kann danach nicht mehr verändert werden.

Lege dir stattdessen ein neues Attribut an, welches die Farbe erst einmal nur speichert. Dessen Wert wird über den Konstruktor gesetzt, des Weiteren kommt eine Setter-Methode hinzu. Die Zeile, in der du die Stiftfarbe setzt, kommt aus dem Konstruktor raus und wird stattdessen in der Methode zeichne eingefügt.

Gekürzt auf den hier relevanten Teil sieht deine Klasse dann also so aus:

public class Kugel {
  private int farbe;

  public Kugel(/* ... */, int farbe, /* ... */) {
    // ...
    this.farbe = farbe;
    // ...
  }

  public void setzeFarbe(int farbe) {
    this.farbe = farbe;
  }

  public void zeichne() {
    buntstift.setzeFarbe(farbe);
    buntstift.zeichneKreis(groesse);
  }
}

So ist dein Objekt nun flexibler, denn es kann seine Farbe über setzeFarbe jederzeit ändern.

Nun folgt die Implementierung, in der der Trigger ausgelöst wird. Wahrscheinlich soll dieser ausgelöst werden, während sich die Kugeln bewegen. Also innerhalb der do-while-Schleife.

do {
  if (maus.istGedrueckt()) {
    kugel1.setzeFarbe(Farbe.BLAU);
    kugel2.setzeFarbe(Farbe.ROT);
    kugel3.setzeFarbe(Farbe.GRUEN);
  }
  // ...
}
while(!maus.doppelKlick());         

Wenn sich nun nach jedem Klick die Farbe ändern soll, müsstest du natürlich noch herausfinden, wie du beispielsweise eine zufällige Zahl ermittelst. Am einfachsten wäre es natürlich, wenn du eine Zufallszahl erzeugst:

int zufallsfarbe = (int)(Math.random() * 10);

Allerdings weiß ich nicht, ob es für jede Zahl im Bereich bis 10 eine passende Farbe gibt. Entweder, du probierst es einfach mal aus oder du gehst auf Nummer sicher und erstellst eine Liste, aus der du ein Element zufällig herausgreifst. Orientiere dich dabei an dieser Formel, um eine Zahl in einem bestimmten Zahlenraum zu generieren:

Min + (int)(Math.random() * ((Max - Min) + 1))

Beispiel:

int[] farben = new int[] { Farbe.GRUEN, Farbe.BLAU, Farbe.ROT };

do {
  if (maus.istGedrueckt()) {
    int zufallsfarbe1 = farben[(int)(Math.random() * 3)];
    kreis1.setzeFarbe(zufallsfarbe1);
    // ...

Zuletzt noch Anmerkungen zu deinem Code-Stil:

Hast du diesen so in der Schule gelernt? Er ist ehrlich gesagt nicht sonderlich toll. Du hast sicherlich bereits gesehen, dass ich in meinen Beispielen Bezeichner anders aufbaue.

Zum einen drücken bei dir viele Bezeichner etwas völlig anderes aus, als das, wofür sie wirklich stehen. Wenn ich eine Variable wie hatStift lese, dann gehe ich davon aus, dass da ein boolscher Ausdruck enthalten ist, also ein Wahrheitswert, der mir Auskunft darüber gibt, ob es einen Stift gibt oder nicht. Dem ist bei dir aber nicht der Fall, stattdessen zeigt die Variable auf ein Objekt Buntstift. So etwas macht deinen Code schlecht lesbar, Variablen sollten stets eindeutig benannt werden.

Dann stehen bei einigen deiner Bezeichner einzelne Buchstaben davor, ähnlich wie bei der ungarischen Notation. Dies stört den Lesefluss eigentlich auch, Vorsilben sollten in der Regel über 3 Buchstaben lang sein. Typinformationen (wie z für Zahl) werden gar nicht eingebaut, denn sonst muss man wohl den Namen des Bezeichners hinterfragen. Außerdem ist Java eine ziemlich typstrenge Sprache, da sollte die ungarische Notation nicht notwendig sein.

Achte außerdem darauf, Leerzeilen richtig zu setzen, unnötige auszusparen. So etwas:

public void fuehreAus()
{ do
  {

geht gar nicht.

Besser:

public void fuehreAus()
{ 
  do
  {

Eigentlich orientiert man sich bei den Positionen der Klammern ebenso eher nach dem K&R-Stil:

public void fuehreAus() { 
  do {
    // ...
  }
  // ...
}

Doch wenn du diesen so stringent beibehältst, ist das auch ok so.

Zuletzt ist mir noch aufgefallen, dass Methoden wie zeichne ebenfalls öffentlich sichtbar (public) sind. Ist das gewollt? Am besten du ordnest deine Methoden einmal nach Sichtbarkeit, um etwas Struktur in den Code zu bringen.