import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;

/**
 * Die Schlange, die vom Spieler gesteuert wird
 * 
 * @author Rainer Helfrich
 * @version April 2020
 */
public class Snake extends Actor
{
    /**
     * Die Queue, die die Körperelemente enthält
     */
    private Queue<SnakeElement> theQueue;
    
    /**
     * Die aktuelle Bewegungsrichtung der Schlange
     */
    private char richtung;
    
    /**
     * Konstanten für die vier Bewegungsrichtungen
     */
    private final char OBEN = 'w';
    private final char UNTEN = 's';
    private final char LINKS = 'a';
    private final char RECHTS = 'd';

    /**
     * Erzeugt eine neue Schlange und platziert sie in der Welt.
     */
    public Snake(World w)
    {
        //# TODO: Erzeugen Sie eine neue Queue

        //# Ende TODO
        if (theQueue != null)
        {
            SnakeElement el = new SnakeElement();
            w.addObject(el, 15, 10);
            theQueue.enqueue(el);
            el = new SnakeElement();
            w.addObject(el, 14, 10);
            theQueue.enqueue(el);
        }
        richtung = RECHTS;
    }

    /**
     * Prüft, ob die Taste zum Buchstaben c gedrückt ist
     * @param c Die Taste, die überprüft wird
     * @return true, wenn die Taste gedrückt ist; false sonst
     */
    private boolean isKeyDown(char c)
    {
        return Greenfoot.isKeyDown(""+c);
    }

    /**
     * Wird in jedem Zeitschritt aufgerufen
     */
    public void act() 
    {
        if (isKeyDown(OBEN) && richtung != UNTEN)
        {
            richtung = OBEN;
        }
        else if (isKeyDown(UNTEN) && richtung != OBEN)
        {
            richtung = UNTEN;
        }
        else if (isKeyDown(LINKS) && richtung != RECHTS)
        {
            richtung = LINKS;
        }
        else if (isKeyDown(RECHTS) && richtung != LINKS)
        {
            richtung = RECHTS;
        }
        SnakeWorld sw = (SnakeWorld)getWorld();

        int x = getX();
        int y = getY();
        //# TODO
        //# Bestimmen Sie die neue Position (x,y) der Schlange
        //# Achtung: Was passiert, wenn die Schlange aus dem Spielfeld herausfährt?

        //# Finden Sie heraus, ob sich an der Position des Kopfes ein Apfel befindet
		
        //# Wenn ja, entfernen Sie den Apfel aus der Welt und platzieren Sie einen neuen Apfel in der Welt.

        //# Wenn nein: Befindet sich ein Körperteil der Schlange an der Position des Kopfes? Wenn ja, ist das Spiel verloren.
		
        //# Wenn auch das nicht der Fall ist, wird nur der letzte Teil des Schwanzes entfernt.

        //# In jedem Fall wird an der neuen Position ein neuer Kopf erzeugt und in die Schlange eingefügt.
        //# Ende TODO

        setLocation(x, y);
    }    
}
