332 lines
8.5 KiB
Java
332 lines
8.5 KiB
Java
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;
|
|
}
|
|
int i = 1;
|
|
fahreZeileDreheHoch();
|
|
for(; 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;
|
|
};
|
|
}
|