public boolean move() {
        game_area.updateDirection();
        Point next_field = getHead().add(direction);
        /* Wenn sich neuer Punkt im Spielfeld befindet,
         * fuege den Punkt der Schlange hinzu und ueberpruefe
         * anschliessend, ob Schlange zu lang ist. Wenn ja, loesche
         * letzten Punkt */
        if (isPossible(next_field)) {
            if (bytes.containsByte(next_field)) {
                int byte_type = bytes.getType(next_field);
                if (byte_type == Config.BYTE_BLUE) {
                    count_sm += Config.DURATION_SPECIAL_MODE;
                    special_mode = true;
                } else if (byte_type == Config.BYTE_RED) {
                    if (isSpecialMode()) {
                        changeLength(5);
                    } else {
                        changeLength(-5);
                        accelerate();
                    }
                } else {
                    changeLength(1);
                }
                if (length < 1)
                    return false;
                bytes.removeByte(next_field);
                body.add(next_field);
                bytes.addByte();
            } else {
                body.add(next_field);
            }
            if (count_sm > 0)
                count_sm--;
            else
                special_mode = false;
            while (body.size() > length)
                body.remove(0);
            return true;
        } else {
            /* Game Over */
            return false;
        }
    }