Informatik - Programm

Hallo erstmal !
Ich habe in Informatik die Aufgabe bekommen mit Greenfoot ein Programm zu erstellen in dem es 2 Figuren gibt. Die erste Figur (bei mir ‚‚Starfish‘‘) soll über die Tastatur gesteuert werden können und die zweite Figur (bei mir ‚‚Seal‘‘) soll eine Unterklasse von der 1. Figur sein und ein Rechteck (4x4) laufen… allerdings soll diese nicht mit der Tastatur gesteuert werden. Dann soll es so sein, dass sich das Rechteck vom Seal um 1 Kästchen vergrößert bzw. verkleinert, wenn ich z.B. ‚‚g‘‘ für größer und ‚‚k‘‘ für kleiner drücke. Bisher hat alles geklappt außer die letzte Methode! Wenn ich auf ‚‚g‘‘ oder ‚‚k‘‘ drücke reagiert der Computer nicht, d.h. das Rechteck bleibt immer noch in der Größe 4x4.

Hier sind die Befehle für den Starfish:

public int a;
public void act()
{

if (Greenfoot.isKeyDown(„up“)) {oben();}
if (Greenfoot.isKeyDown(„right“)) {rechts();}
if (Greenfoot.isKeyDown(„down“)) {unten();}
if (Greenfoot.isKeyDown(„left“)) {links();}

groesserKleiner();

}

public void oben()

{
setLocation(getX(),getY()-1);
}

public void rechts()

{
setLocation(getX()+1,getY());
}

public void unten()

{
setLocation(getX(),getY()+1);
}

public void links()

{
setLocation(getX()-1,getY());
}

public int groesserKleiner()
{

if (Greenfoot.isKeyDown(„g“)){a=1;}
if (Greenfoot.isKeyDown(„k“)){a=-1;}
return a;
}

}

und hier sind die Befehle für den Seal:

private int phase=1;
public int v=3;

public void act()
{
if (phase==1){oben();}
if (phase==2){rechts();}
if (phase==3){unten();}
if (phase==4){links();}
phase=phase+1;
if (phase==5){phase=1;}

}

public void oben()
{
setLocation(getX(),getY()-v);
}

public void rechts()
{
setLocation(getX()+v,getY());
}

public void unten()
{
setLocation(getX(),getY()+v);
}

public void links()
{
setLocation(getX()-v,getY());
}
}

Ich hoffe, dass mir hier jemand helfen kann :smile:
Danke schonmal im voraus !

LG, Jana

Hey, also ich kenn mich zwar überhaupt nicht mit Greenfoot aus aber
in allen Methoden machst du einen Aufruf an Greenfoot z.B. setLocation.
In der Methode groesserKleiner änderst du aber nur die lokale Variable a.
Woher soll Greenfood also wissen, dass du etwas an der Darstellung ändern möchtest, wenn du keinen Aufruf weiterleitest?
Vielleicht ist es das schon.
Gruß
VoidZer0

Hey !
Meinst Du, dass ich in den Verlauf noch groesserKleiner();
reinschreiben soll ? Also das habe ich schon ausprobiert
aber trotzdem klappt es nicht ):
Oder habe ich das jetzt falsch verstanden?
Trotzdem danke für Deine Antwort !

LG, Jana

Nein, das meinte ich nicht.
Allerdings kenne ich Greenfoot nicht und weis nicht, ob es daran liegt.
Schau dir doch den Code der Methode groesserKleiner() an.
Dort erhöhst du die lokale Variable a um eins, wenn „g“ gedrückt wird und erniedrigst sie um eins, wenn „k“ gedrückt wird.
Aber woher soll das Greenfoot-Framework wissen,

  1. dass sich sie Variable a verändert hat und
  2. was es mit der Variable a anstellen soll
    ?
    alle anderen Methoden machen einen Aufruf wie setLocation(getX(),getY()+1);
    dadurch wird wahrscheinlich dem Greenfoot-Framework mitgeteilt,
    dass sich die Position um eine Y-Position also nach unten verändert.
    Die Variable a wird niemals irgendwo verwendet.
    Wie sollte da auch irgendwas passieren???

Im Code von Seal, steht nichts davon, wie die Variable a verwendet werden soll um das Rechteck zu vergrößern.
act() definiert immer ein konstant großes Rechteck „laufe immer im Kreis“ : oben->rechts->unten->links->oben->…

private int phase=1;
public int v=3;

public void act()
{
if (phase==1){oben();}
if (phase==2){rechts();}
if (phase==3){unten();}
if (phase==4){links();}
phase=phase+1;
if (phase==5){phase=1;}
}

Ein weiteres überflüssiges Ding ist, dass du die Methoden oben(),unten(),rechts(),links() in Starfish und Seal doppelt vorhanden sind.
Wenn Seal von Starfish „erbt“ dann hatt er alle Methoden automatisch auch.
Nur da sich Seal anders verhalten soll, muss act() als einziges überschrieben werden.

Also wenn ich das richtig verstehe, dann gehört die Funktion groesserKleiner(), sowie die Variable a nicht in die Starfish-Klasse sondern in die Seal-Klasse.
Und die dortige Variable v ist überflüssig.
Ich gebe dir mal ein Vorschlag wie ich denke, dass es korrekt funktioniert.

  1. Lösche int a; und groesserKleiner() aus der Starfishklasse und füge es in die Sealklasse ein, setze dabei a auf den Anfangswert 1.
    Dann Ändere die größe des abzulaufenden Rechtecks in act() Abhängigkeit zu a.
    Sozusagen gehe man immer a-Schritte in eine Richtung vor der nächsten Drehung.

Also müsste Seal etwa so aussehen:

class Seal extends Starfish {

 private int phase=1;
 private int a=1;
 private int step=0;

 public void act()
 {
 groesserKleiner();

 if (phase==1){ // gehe a-Schritte hoch
 oben(); step++; 
 if (step\>=a ) { phase=2; step = 0; } // aendere Richtung
 }
 if (phase==2){ // gehe a-Schritte rechts
 rechts(); step++; 
 if (step\>=a ){ phase=3; step = 0; } // aendere Richtung
 }
 if (phase==3){ // gehe a-Schritte hinunter
 unten(); step++; 
 if (step\>=a){ phase=4; step = 0; } // aendere Richtung
 }
 if (phase==4){ // gehe a-Schritte links
 links(); step++; 
 if (step\>=a ){ phase=1; step = 0:wink: // aendere Richtung
 }
 }

 public void groesserKleiner()
 {
 if (Greenfoot.isKeyDown("g")){a=1;}
 if (Greenfoot.isKeyDown("k")){ if (a\>1) a=-1; } 
 // 

Ich hab das schnell runterprogrammiert und hab es nicht getestet,
also verzeih mögliche Tippfehler.

Alles klar? 

Gruß
VoidZer0

Ahhh sorry, in dem Fall muss der Code für die Methode groesserKleiner() so aussehen.

public void groesserKleiner()
 {
 if (Greenfoot.isKeyDown("g")){a++;}
 if (Greenfoot.isKeyDown("k")){ if (a\>1) a--; } 
 // 

bitte entsprechend ersetzen.