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

2014/12/18

Boolean Question!

1
2
Blackdow97 Blackdow97

2014/12/18

#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public void act()
{
    essen();
    infiziert();
    mensch();
}
public void essen()
{
    if (isTouching(Pmikrobe.class))
    {
        setImage("Ratte.png");
        removeTouching(Pmikrobe.class);
}
}
public boolean infiziert()
{
    
   if(isTouching(Pmikrobe.class))
   {
       infiziert()== true;
   }
   else
   {
       return false;
   }
}
public void mensch()
{
    if(infiziert()==true)
    {
        if(isTouching(Menschen.class))
        {
            removeTouching(Ratten.class);
        }
    }
}
Hey I'm back with a question! The Code before shows my class Ratten, I'm as far as the Pmikrobe dies when they touch the Ratten.class and the Ratten.class changes the Image! Now I want a boolean method for the interaction between Menschen.class and Ratten.class: When the Ratten.class get touched by the mikrobe.class, the method should alway be true! I searched something in the internet but dont find the right answer.... And can someone check if the method mensch() works correctly, the mensch() method should remove the Ratten.class when the boolean method infiziert is true and they touches the Menschen.class :( Sry for my stupid questions :(
Super_Hippo Super_Hippo

2014/12/18

#
Den Namen zu urteilen, gehe ich mal davon aus, dass ich dir auf Deutsch antworten kann. ;) So wie es momentan ist, entfernt du jede Pmikrobe, die die Ratte berührt (essen-Methode). Danach wird die infiziert-Methode aufgerufen, die abfragt, ob eine Mikrobe berührt wird. Das wäre nur möglich, wenn die Ratte zwei dieser Mikroben gleichzeitig berührt, da eine pro Durchlauf des Codes entfernt wird (falls eine da ist). Außerdem rufst du die Methode auf, die ja eine boolean zurückgibt bzw. geben soll und machst nichts damit. Wann genau soll jemand infiziert werden? Soll die Ratte infiziert werden, wenn sie eine Mikrobe frisst? Und was soll passieren, wenn eine infizierte Ratte einen Menschen berührt? Schau dir mal an, was der Code macht. Zuerst wird die essen-Methode aufgerufen, die, wie oben beschrieben, eine Mikrobe entfernt, falls eine da ist. Danach wird die infiziert-Methode aufgerufen, die nichts tut, sondern nur eine Boolean zurückgibt (wie oben beschrieben mit sehr hoher Wahrscheinlichkeit "false", doch damit wird nichts gemacht). (Zeile 20 sollte dieser Logik nach vermutlich einfach nur "return true;" sein. Ich bezweifle irgendwie auch, dass das, was du da hast, überhaupt vom Compiler angenommen wird.) Danach wird die mensch-Methode aufgerufen. Diese fragt zuerst ab, ob die infiziert-Methode wahr ist. Falls du Zeile 20 durch "return true;" ersetzt, wird diese Bedingung nur dann war sein, wenn die Ratte zu diesem Zeitpunkt eine Mikrobe berührt, was wie gesagt nur möglich ist, wenn zwei Mikroben die Ratte gleichzeitig berührt haben. Wenn sich genau zu diesem Zeitpunkt die Ratte auch mit einem Menschen überschneidet, soll eine Ratte entfernt werden, die sich ebenfalls mit dieser Ratte überschneidet. Ich hoffe, du verstehst, dass das, was du da hast, nicht allzu sinnvoll ist. Wenn du möchtest, dass eine Ratte infiziert wird, wenn sie eine Mikrobe frisst, dann solltest du eine boolean haben (keine Methode, die eine boolean zurückgibt, sondern eine Variable des Typs "boolean") und diese auf "true" ändern, wenn die Ratte eine Mikrobe frisst. Dann kannst du später überprüfen, ob diese Variable wahr ist. Nun ist noch die Frage offen, wen genau die mensch-Methode entfernen soll. Wenn du die infizierte Ratte entfernen möchtest, solltest du "getWorld().removeObject(this)" nutzen, damit entfernst du die Ratte, die den Menschen berührt (und diesen Code gerade ausführt) und nicht eine potentielle andere Ratte, die die Ratte berührt, die den Menschen berührt... Das würde dann allerdings so aussehen, dass der Mensch nur infizierte Ratten frisst bzw. infizierte Ratten bei der Begegnung mit Menschen sterben. Zusammenfassung: Du brauchst keine infiziert-Methode, sondern erstellst eine Variable, die speichert, ob die Ratte infiziert ist oder nicht. Klassennamen sollten übrigens im Singular stehen, also "Mensch" und "Ratte". "mensch" ist als Methodenname auch wenig aussagekräftig. ^^
Blackdow97 Blackdow97

2014/12/18

#
Also vom Compiler wir das alles so angenommen. Zur Erklärung: Ich habe eine Klasse Pmikrobe eine Klasse Ratten und eine Klasse Menschen. Wenn die Pmikrobe die Ratte berührt soll die Ratte infiziert werden die stelle ich da, indem die Ratte ihr Bild ändert und die Pmikrobe verschwindet. Methode essen(); Nun wollte ich das die infizierte Ratte wenn sie einen menschen berührt verschwindet und eigentlich sollte auch der Mensch sein Bild dann noch ändern. Dies wollte ich mit einem boolean machen. Klappt aber aus den von die genannten gründen nicht wirklich... Eine hilfs code von dir wäre echt super...ich muss irgendwie vorwärts kommen :( Der Code ist übrigens die Ratten.class
Super_Hippo Super_Hippo

2014/12/18

#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private boolean infiziert = false;
 
public void act()
{
    essen();
    mensch();
}
 
public void essen()
{
    if (isTouching(Pmikrobe.class))
    {
        setImage("Ratte.png");
        infiziert = true;
        removeTouching(Pmikrobe.class);
    }
}
 
public void mensch()
{
    if(!infiziert) return;
    Actor mensch = getOneIntersectingObject(Mensch.class);
    if(mensch != null)
    {
        mensch.setImage(/*das Bild des infizierten Menschen*/);
        getWorld().removeObject(this);
    }
}
Blackdow97 Blackdow97

2014/12/18

#
Danke, man danke danke danke :) Es macht zwar mega Spaß in Greenfoot zu programmieren oder allgemein zu programmieren, aber es ist echt nicht so einfach :D Aber ich danke dir es klapp! :)
Blackdow97 Blackdow97

2014/12/18

#
Another Question! Now my first problem is solved i got the next immendiatly.... :( Got a code like this right now:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void essen()
{
 if (isTouching(Pmikrobe.class))
 {
     setImage("Ratte.png");
     infiziert = true;
     removeTouching(Pmikrobe.class);
 }
}
public void mensch()
{
 if(!infiziert) return;
 Actor mensch = getOneIntersectingObject(Menschen.class);
 if(mensch != null)
 {
     mensch.setImage("Mittelalter.png");
     getWorld().removeObject(this);
 }
}
Now i want to add, if the Rat.class has infiziert = true after a certain amount of time remove this... :( I tried something with counter and int but this dont worked very well... :( Anybody an idea :( Sorry im a big noob at greenfoot!
danpost danpost

2014/12/18

#
You should not just show the code before any attempt at what you are trying to implement; but, you should show what you tried. You will not learn by just asking for code. Let us show you HOW you can fix what you tried or at least let you know why what you tried did not work.
Blackdow97 Blackdow97

2014/12/19

#
You totally right I'm stupid... Firstly i tried this:
1
2
3
4
5
6
7
8
9
public void todnach()
{
  if(!infiziert) return;
   
  else if(infiziert)
    {
     getWorld().removeObject(this);
  }
 }
Which works like expected it removes the Ratte when the Rat get infiziert! Yeah one Goal i reached :D Well I got by myself thank you very much danpost :) Conclusion:
1
2
3
4
5
6
7
8
9
10
11
12
private long initialTime = System.currentTimeMillis();
public void todnach()
{
  long currentTime = System.currentTimeMillis();
  long elapsedTime = currentTime - initialTime;
  if(!infiziert) return;
   
  else if(elapsedTime > 10000)
    {
     getWorld().removeObject(this);
  }
 }
Super_Hippo Super_Hippo

2014/12/19

#
Nun, was genau soll denn diese "todnach" Methode machen? Momentan wird die Ratte einfach entfernt, wenn sie infiziert wird (und sie ein Alter von 10 Sekunden oder mehr hat). Sollte sie nicht nur entfernt werden, wenn sie im infizierten Stadium einen Menschen berührt? Hinter dem "if(!infiziert) return;" brauchst du übrigens kein "else" schreiben. Es würde ohnehin nicht ausgeführt werden, wenn die vorherige Bedingung erfüllt wird. So wie ich es verstanden hatte, wolltest du, dass sich die Ratte infiziert, wenn sie eine Mikrobe frisst und nach einer gewissen Zeit soll die Infektion aufgehoben werden.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private int t_infiziert=0;
 
public void essen()
{
 if (isTouching(Pmikrobe.class))
 {
     setImage("Ratte.png");
     infiziert = true;
     t_infiziert = 600; //entspricht etwa 10 Sekunden, ggf. anpassen
     removeTouching(Pmikrobe.class);
 }
}
 
//in der act Methode und in einer, die von der act Methode aufgerufen wird
if (infiziert)
{
    t_infiziert--;
    if (t_infiziert==0)
    {
        infiziert = false;
        setImage(/*Bild der nicht infizierten Ratte*/);
    }
}
Blackdow97 Blackdow97

2014/12/19

#
Nein ist alles korekt :) Die Ratte soll an der Infektion nach einer bestimmten Zeit zu grunde gehen :)
Super_Hippo Super_Hippo

2014/12/19

#
Ok, dann tausche Zeile 20 und 21 durch "getWorld().removeObject(this)" aus. Bei deinem Code wird geschaut, ob die Ratte infiziert ist und 10 Sekunden lebt. Es sollte aber geschaut werden, ob sie 10 Sekunden lang infiziert ist.
Blackdow97 Blackdow97

2014/12/19

#
Zeile 20 und 21?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class Ratte extends Überträger
{
   public Ratte()
   {
     setImage("Ratte.png");
   }
    private boolean infiziert = false;
    private long initialTime = System.currentTimeMillis();
    /**
     * Act - do whatever the Ratten wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
  
   public void act()
   {
    essen();
    mensch();
    todnach();
   }
   public void essen()
   {
    if (isTouching(Pmikrobe.class))
    {
        setImage("Ratte.png");
        infiziert = true;
        removeTouching(Pmikrobe.class);
    }
   }
   public void mensch()
   {
    if(!infiziert) return;
    Actor mensch = getOneIntersectingObject(Menschen.class);
    if(mensch != null)
    {
        mensch.setImage("Mittelalter.png");
        getWorld().removeObject(this);
    }
   }
   public void todnach()
   {
     long currentTime = System.currentTimeMillis();
     long elapsedTime = currentTime - initialTime;
     if(!infiziert) return;
     if(elapsedTime > 10000)
       {
        getWorld().removeObject(this);
     }
    }
 
   }
Super_Hippo Super_Hippo

2014/12/19

#
Zeile 20 und 21 meines geposteten Codes. Ich dachte mir das also in etwa so (auch wenn mir die Methodennamen nicht wirklich zusagen) ^^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private int t_infiziert=0;
 
public void act()
{
    essen();
    mensch();
}
 
public void essen()
{
    if (isTouching(Pmikrobe.class))
    {
        setImage("Ratte.png");
        infiziert = true;
        removeTouching(Pmikrobe.class);
    }
}
 
public void mensch()
{
    if (infiziert)
    {
        Actor mensch = getOneIntersectingObject(Menschen.class);
        if(mensch != null)
        {
            mensch.setImage("Mittelalter.png");
            getWorld().removeObject(this);
        }
        else //wenn du es so schreibst, wirst du keine Nullpointer Exception bekommen, wenn du einen Menschen berührst
        {
            t_infiziert++;
            if (t_infiziert==600) getWorld().removeObject(this);
        }
    }
}
Blackdow97 Blackdow97

2014/12/19

#
Hm, das macht deutlich mehr Sinn :) Danke für den Tipp..Oh man irgendwann schaff ich auch mal was alleine :D Und ich änder die Methode extra für dich <3
Blackdow97 Blackdow97

2014/12/19

#
Finally I got something on my own! :D Well not really :S I added mRatte(=male Rat) and wRatte(= female Rat) when they touch each other a new Rat spawns! Code looks like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void sex()
{
    if(infiziert) return;
    if(!willig) return;
    int x = getX(), y = getY();
    Actor ratte = getOneIntersectingObject(Ratte.class);
    Ratte1 = new wRatte();
    Ratte2 = new wRatte();
    if(ratte != null)
    {
        getWorld().addObject(Ratte1 , x+10, y+20);
        willig = false;
     }
    t_willig++;
    if (t_willig==1000) willig = true;
     
 }
This method only the female Rat has, because the female decides when you have sex and when not ;) But now they can only spawn a mRatte or a wRatte, i wanted to add a random factor, which decides if the new Rat is a male or a female, which are my opinions? Pls no Code :) Only tips <3
There are more replies on the next page.
1
2