This site requires JavaScript, please enable it in your browser!
Greenfoot back
d1cM4c
d1cM4c wrote ...

2022/12/8

Wie kann ich ein boolean wert von einer anderen classe in eine if schleife zur anderen klasse machen?

d1cM4c d1cM4c

2022/12/8

#
Ich will ein programm schreiben dass eine ampel den wahrheitswert flase bekommt wenn diese rot wird und ich kann mit meinem auto nur fahren wenn die ampel grün wird was muss ich machen?
//code von Ampel
public class Ampel extends Actor
{
    public int i=1;
    public void act() 
    {        
        boolean ampelAnWahr;
        if(i<=10){
            setImage("images/ampelGrün.png");
        ampelAnWahr = true;
        }
        else{
            setImage("images/ampelRot.png");
            ampelAnWahr = false;            
        }
       i++;
       if(i==21)
          i=1;
    }    
}
ich will hier beim auto so machen dass er überprüft ob eine Ampel vorhanden ist und wenn ja dann ob die AmpelAn bze grün ist wenn ja soll das Auto fahren wenn nicht dann nicht
public void act() {
        tastenBelegung();
    }
    public void tastenBelegung() {
        if(Greenfoot.isKeyDown("w")) {
// hier will ich überprüfen ob die ampel an ist wenn ja soll er fahren aber ich weiss nicht wie
            setLocation(getX(), getY() - 1);
        }
        if(Greenfoot.isKeyDown("a")) {
            setLocation(getX() - 1, getY());
        }
        if(Greenfoot.isKeyDown("s")) {
            setLocation(getX(), getY() + 1);
        }
        if(Greenfoot.isKeyDown("d")) {
            setLocation(getX() + 1, getY());
        }
    }
anderer Code
public boolean AmpelVorhanden(String richtung)
    {
        int rot = getRotation();

        if (richtung=="vorne" && rot==0 || richtung=="rechts" && rot==270 || richtung=="links" && rot==90)
        {
            if(getOneObjectAtOffset(1,0,Ampel.class)!=null )
            {
                return true;
            }
        }

        if (richtung=="vorne" && rot==180 || richtung=="rechts" && rot==90 || richtung=="links" && rot==270)
        {
            if(getOneObjectAtOffset(-1,0,Ampel.class)!=null )
            {
                return true;
            }
        }

        if (richtung=="vorne" && rot==90 || richtung=="rechts" && rot==0 || richtung=="links" && rot==180)
        {
            if(getOneObjectAtOffset(0,1,Ampel.class)!=null)
            {
                return true;
            }

        }

        if (richtung=="vorne" && rot==270 || richtung=="rechts" && rot==180 || richtung=="links" && rot==0)
        {
            if(getOneObjectAtOffset(0,-1,Ampel.class)!=null) 
            {
                return true;
            }

        }

        return false;
    }
Spock47 Spock47

2022/12/9

#
=== German version === (english version see below) 1. Um auf den Wert zugreifen zu können, sollte es ein Attribute statt einer lokalen Variable sein (eine Variable auf Objekt-Ebene statt Methoden-Ebene):
public class Ampel extends Actor
{
    public int i=1;
    boolean ampelAnWahr; // hier...
    public void act() 
    {        
        // ...statt hier
        if(i<=10){
        ...
Damit kann nun ein beliebiges Ampel-Objekt nach dem Wert gefragt werden:
ampel.ampelAnWahr
Also los: 2. I schlage vor, die Method "AmpelVorhanden" zu ändern so dass sie direkt zurückliefert, ob die Ampel rot ist: "ampelIstRot". In der Methode kannst Du jetzt sobald Du ein Ampel-Objekt findest, dieses fragen, ob es rot ist:
public boolean ampelIstRot(String richtung)
    {
        int rot = getRotation();
 
        if ("vorne".equals(richtung) && rot==0 || "rechts".equals(richtung) && rot==270 || "links".equals(richtung) && rot==90)
        {
            final Ampel ampel = getOneObjectAtOffset(1,0,Ampel.class)
            if (ampel != null && ampel.ampelAnWahr) // hier kann man sehen wie die Ampel nach dem Wert gefragt werden kann.
            {
                return true;
            }
        }
        ...
(Bitte beachte, dass String-Vergleiche mit equals gemacht werden sollten - da mehrere String-Variablen mit dem selben Wert existieren können.) 3. Die Methode kannst Du dann in der "tastenBelegung"-Methode aufrufen:
        if (Greenfoot.isKeyDown("w") && ampelIstRot("vorne")) {
Lebe lange und in Frieden, Spock47 === English version === 1. To access the value, it needs to be an attribute instead of a local variable (a variable on object scope instead of method scope):
public class Ampel extends Actor
{
    public int i=1;
    boolean ampelAnWahr; // here...
    public void act() 
    {        
        // ...instead of here
        if(i<=10){
Now, if one knows the ampel object, one can ask it for the value:
ampel.ampelAnWahr
So let's do that: 2. I suggest to change the method "AmpelVorhanden" so that it directly returns whether the ampel is red: "ampelIstRot". In the method, if you find an ampel object, just ask it whether it is red:
public boolean ampelIstRot(String richtung)
    {
        int rot = getRotation();

        if ("vorne".equals(richtung) && rot==0 || "rechts".equals(richtung) && rot==270 || "links".equals(richtung) && rot==90)
        {
            final Ampel ampel = getOneObjectAtOffset(1,0,Ampel.class)
            if (ampel != null && ampel.ampelAnWahr) // here you can see how to ask the ampel for its state.
            {
                return true;
            }
        }
        ...
(Please note that String comparisons should be done with equals - since multiple string objects could exist that have the same value.) 3. That method can then be called in the "tastenBelegung" method:
        if (Greenfoot.isKeyDown("w") && ampelIstRot("vorne")) {
Live long and prosper, Spock47
danpost danpost

2022/12/9

#
A simple Ampel class might look like this:
import greenfoot.*;

public class Ampel extends Actor
{
    private int t = 20; // cycle time length (probably should be like 800 or so)
    private int i;
    
    public void act()
    {
        i = (i+1)%t;
        if (i%(t/2) == 0)
        {
            setImage((i/(t/2) == 0 ? "ampelGrün" : "ampelRot")+".png");
        }
    }
    
    public boolean istRot()
    {
        return i*2+1 > t;
    }
}
d1cM4c d1cM4c

2022/12/9

#
Spock47 wrote...
=== German version === (english version see below)
ampel.ampelAnWahr
So let's do that: 2. I suggest to change the method "AmpelVorhanden" so that it directly returns whether the ampel is red: "ampelIstRot". In the method, if you find an ampel object, just ask it whether it is red:
public boolean ampelIstRot(String richtung)
    {
        int rot = getRotation();

        if ("vorne".equals(richtung) && rot==0 || "rechts".equals(richtung) && rot==270 || "links".equals(richtung) && rot==90)
        {
            final Ampel ampel = getOneObjectAtOffset(1,0,Ampel.class)
            if (ampel != null && ampel.ampelAnWahr) // here you can see how to ask the ampel for its state.
            {
                return true;
            }
        }
        ...
Wenn ich
final Ampel ampel = 
getOneObjectAtOffset(1,0,Ampel.class)
eingebe soll ich ";" eingeben und danach kommt das:
imcompatible types:greenfoot.Actorcannot be converted to Ampel
Spock47 Spock47

2022/12/9

#
=== German version === (english version below) Oh ja, mein Fehler, Entschuldigung. Der Rückgabetyp von getOneObjectAtOffset ist Object, also müssen wir dem Compiler vor dem Aufruf der Methode klar machen, dass es eine Ampel ist ("casten").
final Ampel ampel = (Ampel)getOneObjectAtOffset(1,0,Ampel.class);
=== English version === Oh yes, my fault, sorry. The return type of getOneIntersectingObject is Object. Therefore, he have to give the compiler the info that it is actually an Ampel ("casting"):
final Ampel ampel = (Ampel)getOneObjectAtOffset(1,0,Ampel.class);
d1cM4c d1cM4c

2022/12/9

#
Spock47 wrote...
DANKE!! Aber das Problem jetzt:
if (ampel != null && ampel.ampelAnWahr) // Undeclared variable ampelAnWahr
           {
              return true; 
           }
        }
das wird hier nicht erkannt
Spock47 Spock47

2022/12/9

#
Bitte dann nochmal den aktuellen Quelltext der Ampel-Klasse hier teilen.
d1cM4c d1cM4c

2022/12/9

#
Spock47 wrote...
Bitte dann nochmal den aktuellen Quelltext der Ampel-Klasse hier teilen.
public class Ampel extends Actor
{
    public int i=1;
    public void act() 
    {        
        boolean ampelAnWahr;
        if(i<=10){
            setImage("images/ampelGrün.png");
        }
        else{
            setImage("images/ampelRot.png");   
        }
       i++;
       if(i==21)
          i=1;
    }    
}
Spock47 Spock47

2022/12/9

#
Ok, dann wie oben (Schritt 1 in meiner ersten Antwort) beschrieben: Die Variable muss aus der Methode heraus direkt in den Klassen-Körper verschoben werden. (also Zeile 6 ausschneiden und als Zeile 3 wieder einfügen).
d1cM4c d1cM4c

2022/12/9

#
Stimmt hab mich verguckt Dankeschön.
Spock47 Spock47

2022/12/9

#
Immer gerne.
d1cM4c d1cM4c

2022/12/9

#
AHHHH TUT MIR LEID aber dort steht "missing return statement" ich habe versucht return false in else zu machen aber dennoch geht es nicht :
public boolean ampelIstRot(String richtung) {
        int rot = getRotation();
        
        if("vorne".equals(richtung) && rot==0 || "rechts".equals(richtung) && rot==270 || "links".equals(richtung) && rot==90)
        {
           final  Ampel ampel = (Ampel)getObjectsAtOffset(1,0,Ampel.class);
           if (ampel != null && ampel.ampelAnWahr) 
           {
              return true; 
           }
        }
        else {
            return false;
        }
    }
auch ohne else und return false geht es nicht
Super_Hippo Super_Hippo

2022/12/10

#
Wenn das erste „if” wahr wird, aber das zweite nicht, dann gibt die Funktion nichts zurück. Du brauchst dort ein weiteres „return“.
Spock47 Spock47

2022/12/10

#
Ganz genau. Am besten einfach ans Ende der Methode ein (unbedingtes) "return false;" setzen so wie es im Eröffnungspost war:
public boolean ampelIstRot(String richtung) {
    int rot = getRotation();
         
    if("vorne".equals(richtung) && rot==0 || "rechts".equals(richtung) && rot==270 || "links".equals(richtung) && rot==90)
    {
       final  Ampel ampel = (Ampel)getObjectsAtOffset(1, 0, Ampel.class);
       if (ampel != null && ampel.ampelAnWahr)
       {
           return true; 
       }
    }
    ...
    return false;
}
You need to login to post a reply.