# Greenfoot "Little Crab" Spiel Erweiterungen



## JannisKiesow (23. Feb 2012)

Hallo! 
Ich habe folgendes Problem:
Wie oben angedeutet habe ich mir mit Hilfe des Buches "Einführung in Java mit Greenfoot" und dem genannten Programm mein erstes kleines Spiel entwickelt. Bis jetzt konnte ich immer unter Anleitung des Buches arbeiten. Am Ende des Kapitels wurden weitere Ideen zum Ausbau des Spiels vorgeschlagen, darunter auch, dass für jeden gefressenen Wurm ein neuer erscheint. Das möchte ich erreichen und hätte es jetzt theoretisch so gelöst:


```
public void wurmFressen()
    {
        if(canSee(Worm.class))
        {
            eat(Worm.class);
            Greenfoot.playSound("slurp.wav");
            wormsEaten = wormsEaten + 1;
            if(wormsEaten==8)
            {
                Greenfoot.playSound("fanfare.wav");
                Greenfoot.stop();
            }
           
            /**
             * Hier möchte ich den neuen Wurm erzeugen lassen
             */
            
           CrabWorld.addObject(new Worm(),Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
        }
    }
```

Wenn ich die Klasse Crab jetzt kompilieren will, erhalte ich allerdings den Error: non-static method addObject(greenfoot.Actor,int,int) cannot be referenced from a static context.

Ich hoffe ich habe mein Problem ausführlich genug beschrieben.. Vielen Dank schonmal für die Hilfe!

Mfg


----------



## Fu3L (23. Feb 2012)

Du musst anscheinend erst eine Instanz der Klasse CrabWorld erstellen. Dann diese nicht statischen Methoden auf diesen Instanzen aufrufen.

Ich weiß OO ist schwer, das hatte ich anfangs auch, aber Objektorientierte Programmierung musst du noch mehr verinnerlichen.


----------



## JannisKiesow (23. Feb 2012)

Kannst du mir vielleicht zeigen wie das geht? Im Moment sieht meine CrabWorld Klasse so aus:


```
import greenfoot.*;  // (Actor, World, Greenfoot, GreenfootImage)

public class CrabWorld extends World
{
    /**
     * Erzeugt die Krabbenwelt (den Strand). Unsere Welt hat eine Größe 
     * von 560x560 Zellen, wobei jede Zelle nur ein Pixel groß ist.
     */
    public CrabWorld() 
    {
        super(560, 560, 1);
        populateWorld();
        addWorm();
        
    }
    
    public void populateWorld()
    {
        addObject(new Crab(),150,100);
        addObject(new Lobster(),50,50);
        addObject(new Lobster(), Greenfoot.getRandomNumber(300),Greenfoot.getRandomNumber(350));
        addObject(new Lobster(), 500,500);
     }
    
     
     public void addWorm()
     {
         addObject(new Worm(), Greenfoot.getRandomNumber(560), Greenfoot.getRandomNumber(560));
        }
    
    
}
```


----------



## Fu3L (23. Feb 2012)

In deiner Klasse wo die Würmer gefressen werden können, sollte eine Variable:


```
CrabWorld crabWorld = new CrabWorld();
```

definiert sein. Das kann auch geteilt passieren, also am Anfang deklariert und später initialisiert.

Dann kannste in wurmFressen() per crabWorld.addObject(...) drauf zugreifen.

Aber wie gesagt: Bitte nochma genauer im Buch nachlesen... Dadurch und durch Ausprobieren, machts schon irgendwann Klick^^


----------



## JannisKiesow (23. Feb 2012)

Vieln Dank dafür!


----------



## JannisKiesow (24. Feb 2012)

Hmm ich habe das "erledigt" Zeichen zu früh gesetzt :/ Ich habe das Problem versucht folgender Maßen zu lösen:


```
public void wurmFressen()
    {
        

        if(canSee(Worm.class))
        {
            eat(Worm.class);
            Greenfoot.playSound("slurp.wav");
            wormsEaten = wormsEaten + 1;
            CrabWorld crabWorld = new CrabWorld();
            crabWorld.addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
            
            if(wormsEaten==8)
            {
                Greenfoot.playSound("fanfare.wav");
                Greenfoot.stop();
            }
            
           
            
            

        }
```

Ich wollte dann mit


```
CrabWorld crabWorld = new CrabWorld();
            crabWorld.addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
```

die Variable erstellen und mit ihr auf die Klasse CrabWorld zugreifen.. Er spuckt mir auch keine Fehler aus, nur wenn ich einen Wurm fresse erscheint kein neuer (was ja aber der Fall sein soll).
Hoffe du oder jemand anders kann mir an dieser Stelle nochmal helfen..


----------



## Fu3L (24. Feb 2012)

Du erstellst ja eine neue CrabWorld... Du musst in deinem ganzen Programm, so würde ich vermuten, nur eine einzige Instanz nutzen. Sie müsste wie gesagt eine Klassen- oder Instanzvariable (besser letzteres) deiner kontrollierenden Klasse sein... Nur aus der einen Methode kann man natürlich nicht genau ersehen, wie es dann auszusehen hat.

Jedenfalls kurz: Wenn du deine angezeigte/ausgegebene CrabWorld ändern willst, darfst du nicht die Änderungen an einer gerade neu erstellten world durchführen.


----------

