Programkod från föreläsning 15

OH-bilderna (som jag aldrig lyckades visa under föreläsningen) finns här, programkoden är här:


import se.lth.cs.pt.graphics.basic.*;
import se.lth.cs.pt.turtle.visible.*;
import java.util.Random;

class Walkabout {

    public static void main(String[] args) {
        new Walkabout().run();
    }

    void run() {
        GraphicsWindow w = new GraphicsWindow(500, 500);
        RandomTurtle t1 = new RandomTurtle(w);
        RandomTurtle t2 = new RandomTurtle(w);
        Random rng = new Random();
        while (t1.distanceTo(t2) > 50 &&
               t1.insideWindow() &&
               t2.insideWindow()) {
            t1.randomStep();
            t2.randomStep();
        }
        System.out.println("Antal steg för t1: " + t1.getNbrOfSteps());
    }
}

class GeometricTurtle extends Turtle {

    public GeometricTurtle  (GraphicsWindow w, double x, double y) {
        // anropa superklassens konstruktor, för att 'ärvda' attribut
        // skall få sina startvärden:
        super(w, x, y);
    }

    public double distanceTo(GeometricTurtle other) {
        double dx = getX() - other.getX();
        double dy = getY() - other.getY();
        return Math.sqrt(dx * dx + dy * dy);
    }

    public boolean insideWindow() {
        return
            0 <= getX() && getX() < getWindow().getWidth() &&
            0 <= getY() && getY() < getWindow().getHeight();
    }
}

class RandomTurtle extends GeometricTurtle {

    private Random rng = new Random();

    public RandomTurtle  (GraphicsWindow w) {
        super(w, 0, 0);
        jumpTo(rng.nextInt(w.getWidth()), rng.nextInt(w.getHeight()));
    }

    public void randomStep() {
        left(rng.nextInt(61) - 30);
        forward(rng.nextInt(6) + 1);
    }        
}


class DrawPolygons {

    public static void main(String[] args) {
        new DrawPolygons().run();
    }

    void run() {
        GraphicsWindow w = new GraphicsWindow(500, 500);
        PolygonTurtle t = new PolygonTurtle(w, 200);
        for (int sides = 3; sides <= 10; sides++) {
            w.waitForMouseClick();
            t.jumpTo(w.getMouseX(), w.getMouseY());
            t.drawPolygon(sides);
        }
    }
}

class PolygonTurtle extends Turtle {

    private int circumference;

    public PolygonTurtle  (GraphicsWindow w, int circumference) {
        super(w, w.getWidth()/2, w.getHeight()/2);
        this.circumference = circumference;
        penDown();
        setSpeed(30);
    }

    public void drawPolygon(int sides) {
        for (int k = 1; k <= sides; k++) {
            forward(circumference / sides);
            left(360 / sides);
        }
    }
}


class MilitaryTurtle extends PolygonTurtle {

    public void left() {
        left(90);
    }
}


class Tattoo {

    public static void main(String[] args) {
        new Tattoo().run();
    }

    void run() {
        MilitaryTurtle t = new MilitaryTurtle();
        t.left(78);
        t.left();
        MedicalTurtle mt = new MedicalTurtle();
        mt.left(45);    // vrider 45 grader åt höger...
    }
}

class MedicalTurtle extends Turtle {

    public void left(int angle) {
        super.right(angle);
    }

    public void right(int angle) {
        super.left(angle);
    }
}


class StepCountingTurtle extends Turtle {

    protected int nbrOfSteps;

    public void forward(int steps) {
        nbrOfSteps += steps;
        super.forward(steps);
    }

    public int getNbrOfSteps() {
        return nbrOfSteps;
    }
}