import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) //Comment that the interpreter may never know of public class Rover extends Actor { private Display anzeige; /** * this function is to be implemented by the user * depending on the needed actions */ public Display getDisplay() { return anzeige; } public void act() { S66Nr3(7); } private void fahreUmHuegel(String richtung) { String pri; String sec; if(richtung.equals("Hoch")) { pri = "links"; sec = "rechts"; } else { if (richtung.equals("Runter")) { pri = "rechts"; sec = "links"; } else { nachricht("JUNGE DU SPAST!"); return; } } drehe(pri); fahre(); drehe(sec); fahre(); fahre(); drehe(sec); fahre(); drehe(pri); } private void fahreBisHuegel() { while(!huegelVorhanden("vorne")) { fahre(); } } private void fahreZeileDreheHoch() { fahreBisHuegel(); fahreUmHuegel("Hoch"); fahreBisHuegel(); drehe("um"); fahreBisHuegel(); fahreUmHuegel("Runter"); fahreBisHuegel(); drehe("rechts"); fahre(); drehe("rechts"); } private void fahreZeileDreheRunter(boolean geheInNächsteZeile) { fahreBisHuegel(); fahreUmHuegel("Runter"); fahreBisHuegel(); drehe("um"); fahreBisHuegel(); fahreUmHuegel("Hoch"); fahreBisHuegel(); if(geheInNächsteZeile) { drehe("rechts"); fahre(); drehe("rechts"); } else { drehe("um"); } } private void S66Nr3(int anzahlZeilen) { if(anzahlZeilen < 3) { nachricht("Ich muss mindestens drei Zeilen fahren! :("); return; } fahreZeileDreheHoch(); for(int i = 1; i < anzahlZeilen-1; i++) { fahreZeileDreheRunter(true); } fahreZeileDreheRunter(false); } /** * Der Rover bewegt sich ein Feld in Fahrtrichtung weiter. * Sollte sich in Fahrtrichtung ein Objekt der Klasse Huegel befinden oder er sich an der Grenze der Welt befinden, * dann erscheint eine entsprechende Meldung auf dem Display. */ public void fahre() { int posX = getX(); int posY = getY(); if(huegelVorhanden("vorne")) { nachricht("Zu steil!"); } else if(getRotation()==270 && getY()==1) { nachricht("Ich kann mich nicht bewegen"); } else { move(1); Greenfoot.delay(1); } if(posX==getX()&&posY==getY()&&!huegelVorhanden("vorne")) { nachricht("Ich kann mich nicht bewegen"); } } /** * Der Rover dreht sich um 90 Grad in die Richtung, die mit richtung (ᅵlinksᅵ oder ᅵrechtsᅵ) ᅵbergeben wurde. * Sollte ein anderer Text (String) als "rechts" oder "links" ᅵbergeben werden, dann erscheint eine entsprechende Meldung auf dem Display. */ public void drehe(String richtung) { if(richtung.equals("rechts")){ setRotation(getRotation()+90); }else if(richtung.equals("links")){ setRotation(getRotation()-90); } else if(richtung.equals("um")) { setRotation(getRotation()+180); }else { nachricht("Keinen Korrekte Richtung gegeben!"); } } /** * Der Rover gibt durch einen Wahrheitswert (true oder false )zurᅵck, ob sich auf seiner Position ein Objekt der Klasse Gestein befindet. * Eine entsprechende Meldung erscheint auch auf dem Display. */ public boolean gesteinVorhanden() { if(getOneIntersectingObject(Gestein.class)!=null) { nachricht("Gestein gefunden!"); return true; } return false; } /** * Der Rover ᅵberprᅵft, ob sich in richtung ("rechts", "links", oder "vorne") ein Objekt der Klasse Huegel befindet. * Das Ergebnis wird auf dem Display angezeigt. * Sollte ein anderer Text (String) als "rechts", "links" oder "vorne" ᅵbergeben werden, dann erscheint eine entsprechende Meldung auf dem Display. */ public boolean huegelVorhanden(String richtung) { int rot = getRotation(); if (richtung=="vorne" && rot==0 || richtung=="rechts" && rot==270 || richtung=="links" && rot==90) { if(getOneObjectAtOffset(1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(1,0,Huegel.class)).getSteigung() >30) { return true; } } if (richtung=="vorne" && rot==180 || richtung=="rechts" && rot==90 || richtung=="links" && rot==270) { if(getOneObjectAtOffset(-1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(-1,0,Huegel.class)).getSteigung() >30) { return true; } } if (richtung=="vorne" && rot==90 || richtung=="rechts" && rot==0 || richtung=="links" && rot==180) { if(getOneObjectAtOffset(0,1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,1,Huegel.class)).getSteigung() >30) { return true; } } if (richtung=="vorne" && rot==270 || richtung=="rechts" && rot==180 || richtung=="links" && rot==0) { if(getOneObjectAtOffset(0,-1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,-1,Huegel.class)).getSteigung() >30) { return true; } } if(richtung!="vorne" && richtung!="links" && richtung!="rechts") { nachricht("Befehl nicht korrekt!"); } return false; } /** * Der Rover ermittelt den Wassergehalt des Gesteins auf seiner Position und gibt diesen auf dem Display aus. * Sollte kein Objekt der Klasse Gestein vorhanden sein, dann erscheint eine entsprechende Meldung auf dem Display. */ public void analysiereGestein() { if(gesteinVorhanden()) { nachricht("Gestein untersucht! Wassergehalt ist " + ((Gestein)getOneIntersectingObject(Gestein.class)).getWassergehalt()+"%."); Greenfoot.delay(1); removeTouching(Gestein.class); } else { nachricht("Hier ist kein Gestein"); } } /** * Der Rover erzeugt ein Objekt der Klasse ᅵMarkierungᅵ auf seiner Position. */ public void setzeMarke() { getWorld().addObject(new Marke(), getX(), getY()); } /** * *Der Rover gibt durch einen Wahrheitswert (true oder false )zurᅵck, ob sich auf seiner Position ein Objekt der Marke befindet. * Eine entsprechende Meldung erscheint auch auf dem Display. */ public boolean markeVorhanden() { if(getOneIntersectingObject(Marke.class)!=null) { return true; } return false; } public void entferneMarke() { if(markeVorhanden()) { removeTouching(Marke.class); } } private void nachricht(String pText) { if(anzeige!=null) { anzeige.anzeigen(pText); Greenfoot.delay(1); anzeige.loeschen(); } } private void displayAusschalten() { getWorld().removeObject(anzeige); } protected void addedToWorld(World world) { setImage("images/rover.png"); world = getWorld(); anzeige = new Display(); anzeige.setImage("images/nachricht.png"); world.addObject(anzeige, 7, 0); if(getY()==0) { setLocation(getX(),1); } anzeige.anzeigen("Ich bin bereit"); } class Display extends Actor { GreenfootImage bild; public Display() { bild = getImage(); } public void act() { } public void anzeigen(String pText) { loeschen(); getImage().drawImage(new GreenfootImage(pText, 25, Color.BLACK, new Color(0, 0, 0, 0)),10,10); } public void loeschen() { getImage().clear(); setImage("images/nachricht.png"); } } public class Direction { Direction(int val){ this.value = val; } final int value; }; }