[JAVA] Wert zurücksetzten

Diskutiere [JAVA] Wert zurücksetzten im Developer Network Forum im Bereich Hardware & Software Forum; Hi Leute, will ne Ameisenklasse in Java programieren, die sich zuerst zum World nullpunkt begibt, und dann schleifen von oben nach unten abläuft...
  • [JAVA] Wert zurücksetzten Beitrag #1
Jessen

Jessen

Bekanntes Mitglied
Dabei seit
01.08.2007
Beiträge
642
Reaktionspunkte
0
Ort
Hamburg
Hi Leute, will ne Ameisenklasse in Java programieren, die sich zuerst zum World nullpunkt begibt, und dann schleifen von oben nach unten abläuft (suchen)

hab den code soweit auch fertig, aber ich bekomme leider die makierten Werte, die ich für die Abfragenkette brauch nich zurückgesetzt (denk ich ma, weil er macht die ersten beiden schritte wie gewünscht, danach gehts ab nach rechts wie im ersten schritt, nur ohne limit)

Code:
import greenfoot.*;  

public class Ant extends Creature
{
    private int direction;
    private int rechtsSchritte;
    private int zumNullpunkt;
    private int vertikaleBewegung;
    private int horizontaleBewegung;


    public Ant()
    {
        this(null);
    }


    public Ant(AntHill home)
    {
        super();
        setHomeHill(home);
        setDirection(0);
        zumNullpunkt = 214;
        vertikaleBewegung = 214;
        horizontaleBewegung = 10;

    }


    public void act()
    {
       if (zumNullpunkt > 0)
       {
            walkNorth();
            walkWest();
            zumNullpunkt--;
       }
       else
       {
            if (horizontaleBewegung > 0)
            {
                walkEast();
                horizontaleBewegung--;
            }
            else
            {
                if (vertikaleBewegung > 0)
                {
                    walkSouth();
                    vertikaleBewegung--;
                }
                else
                {
                    [COLOR="Red"]horizontaleBewegung = 10;[/COLOR]
                    if (horizontaleBewegung > 0)
                    {
                        walkEast();
                        horizontaleBewegung--;
                    }
                    else
                    {
                        [COLOR="Red"]vertikaleBewegung = 214;[/COLOR]
                        if (vertikaleBewegung > 0)
                        {
                            walkNorth();
                            vertikaleBewegung--;
                        }
                        else
                        {
                            [COLOR="Red"]horizontaleBewegung = 10;[/COLOR]
                            [COLOR="Red"]vertikaleBewegung = 214;[/COLOR]
                        }
                    }
                }
            }
       }
            
         
    }
    
 

    

    public void walkEast()
    {
        walkDirection(0);
    }


    public void walkSouth()
    {
        walkDirection(1);
    }
    

    public void walkWest()
    {
        walkDirection(2);
    }


    public void walkNorth()
    {
        walkDirection(3);
    }
    

    public void walkDirection(int direction)
    {
        setDirection(direction);
        walk();
    }    


    public int getDirection()
    {
        return direction;
    }


    private void setDirection(int direction)
    {
        if ((direction >= 0) && (direction <= 3)) {
            this.direction = direction;
        }
        switch(direction) {
            case 0 :
                setSpeed(10, 0);
                setRotation(0);
                break;
            case 1 :
                setSpeed(0, 10);
                setRotation(90);
                break;
            case 2 :
                setSpeed(-10, 0);
                setRotation(180);
                break;
            case 3 :
                setSpeed(0, -10);
                setRotation(270);
                break;
            default :
                break;
        }
    }
}
(is ne vorgefertigte Klasse ausm Info unterricht, also nich wundern wenn da sachen sind ich ich nich brauch....)
 
  • [JAVA] Wert zurücksetzten Beitrag #2
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Da stimmt prinzipiell was nicht.
Die Abfrage (nach der ersten markierten Zeile), ob horizontaleBewegung>0 ist, ist sinnlos, weil der Wert direkt davor auf 10 gesetzt wird. Diese Abfrage wird also immer erfüllt (und darüberhinaus der else-Zweig niemals ausgeführt!). Bei vertikaleBewegung ist es das gleiche Problem.

PS: Soll das so sein, dass die Ameise immer genau 214 Einheiten rechts unterhalb des Hügels startet? Logisch betrachtet läuft sie nämlich beim "Suchen" des Hügels nicht zum Hügel, sondern einfach 214 Einheiten nach links oben; egal ob dort der Hügel ist, oder nicht.

PPS: Ein anständiger Compiler sollte das übrigens bemerken und eine Warnung ausgeben.
 
  • [JAVA] Wert zurücksetzten Beitrag #3
Jessen

Jessen

Bekanntes Mitglied
Dabei seit
01.08.2007
Beiträge
642
Reaktionspunkte
0
Ort
Hamburg
also ich benutze greenfoot ... und der hügel is nich links oben, sonder ich will die world systematisch nach futter untersuchen, damit ich nich auf ein zufallssystem angewiesen bin ... (in meiner neuen welt soll sich automatisch selbst nahrung erschaffen, und joa ... die ameisen sollen sucher und träger haben. die sucher begeben sich erst zum nullpunkt und laufen dann immer nach unten, 10 nach rechts, nach oben, nach rechts, nach undten ... usw


EDIT// OK selbst ne lösung gefunde ;D ... hab einfach 2 neue variablen eingefüg und die dann im letzten else auf ursprung gesetzt jetzt tun ie wass ich will :D
 
Zuletzt bearbeitet:
  • [JAVA] Wert zurücksetzten Beitrag #4
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
greenfoot sagt mir nichts; aber was dein Code tut sieht man. :)
Und der geht jetzt beim Start erstmal wegen zumNullpunkt = 214; im Konstruktor während der ersten 213 Aufrufe von act() je eine Einheit nach Norden und Westen, bevor überhaupt der Teil zum Suchen losgeht. Daher meine Frage, ob die Ameise zum Start tatsächlich den Hügel suchen, oder nur stur die angegebene Anzahl von Einheiten nach Nordwesten gehen soll.

Den prinzipiellen Logik-Fehler in deinem Code habe ich ja bereits erläutert. Allerdings muss ich anmerken, dass mir diese Verschachtelung generell so vorkommt, als wäre sie nicht im Sinne dessen, was ihr lernen sollt.
 
  • [JAVA] Wert zurücksetzten Beitrag #5
Jessen

Jessen

Bekanntes Mitglied
Dabei seit
01.08.2007
Beiträge
642
Reaktionspunkte
0
Ort
Hamburg
die nordwestbewegung soll die ameise zum koordinaten nullpunkt führen (feld is 640*640 und eine ameise geht 3 einheiten pro schritt...) also nich zum hügel, noch immoment zu i welchem futter :D ... das kommt alle pö a pö

PS ma codeuppdate

Code:
import greenfoot.*;  // (World, Actor, GreenfootImage, and Greenfoot)


public class Ant extends Creature
{
    private int direction;
    private int rechtsSchritte;
    private int zumNullpunkt;
    private int runterGehen;
    private int hochGehen;
    private int rechtsGehen;
    private int rechtsGehenb;

    public Ant()
    {
        this(null);
    }

    public Ant(AntHill home)
    {
        super();
        setHomeHill(home);
        setDirection(0);
        zumNullpunkt = 214;
        runterGehen = 214;
        hochGehen = 214;
        rechtsGehen = 10;
        rechtsGehenb = 10;
    }

    public void act()
    {
       if (zumNullpunkt > 0)
       {
            walkDirection(3);
            walkDirection(2);
            zumNullpunkt--;
       }
       else
       {
            if (rechtsGehen > 0)
            {
                walkDirection(0);
                rechtsGehen--;
            }
            else
            {
                if (runterGehen > 0)
                {
                    walkDirection(1);
                    runterGehen--;
                }
                else
                {
                    if (rechtsGehenb > 0)
                    {
                        walkDirection(0);
                        rechtsGehenb--;
                    }
                    else
                    {
                        if (hochGehen > 0)
                        {
                            walkDirection(3);
                            hochGehen--;
                        }
                        else
                        {
                            runterGehen = 214;
                            hochGehen = 214;
                            rechtsGehen = 10;
                            rechtsGehenb = 10;
                             
                        }
                    }
                }
            }
       }
            
         
    }
    
 

    

    public void walkEast()
    {
        walkDirection(0);
    }


    public void walkSouth()
    {
        walkDirection(1);
    }
    
    public void walkWest()
    {
        walkDirection(2);
    }

    public void walkNorth()
    {
        walkDirection(3);
    }
    
    public void walkDirection(int direction)
    {
        setDirection(direction);
        walk();
    }    

    public int getDirection()
    {
        return direction;
    }

   private void setDirection(int direction)
    {
        if ((direction >= 0) && (direction <= 3)) {
            this.direction = direction;
        }
        switch(direction) {
            case 0 :
                setSpeed(10, 0);
                setRotation(0);
                break;
            case 1 :
                setSpeed(0, 10);
                setRotation(90);
                break;
            case 2 :
                setSpeed(-10, 0);
                setRotation(180);
                break;
            case 3 :
                setSpeed(0, -10);
                setRotation(270);
                break;
            default :
                break;
        }
    }
}
die walkbefehle sind die selben, nur eben mit der methoder von der klasse creature aufgerufen damit es nich so viele rechnungen braucht

PPS: hab jetzt das problem das die ameise zwar so läuft wie ich will, aber wenn si unten rechts in der ecke ist, soll sie den wert zumNullpunkt wieder auf 214 setzen ... nur ich bekomm das nich hin ohne das sich das wieder selbst so verschachtelt das es nich geht ... (hatte versucht mit if (getX == 639 && getY == 639) zu arbeiten ... aber das geht nich -.-
 
Zuletzt bearbeitet:
  • [JAVA] Wert zurücksetzten Beitrag #6
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Ich denke, du musst dein Problem mal genauer definieren, damit man helfen kann. Denk mal über folgendes nach:

Wo startet die Ameise, und ist der Punkt immer gleich und bekannt oder zufällig.
Wo ist der Hügel, und ist dessen Position immer gleich und bekannt oder zufällig.
Soll die Ameise von ihrem Startpunkt zum Hügel oder zum Nullpunkt, oder (siehe vorher) ist der Hügel sowieso immer am Nullpunkt (was den Hügel sinnlos machen würde).
Weiß die Ameise in absoluten Koordinaten (Funktion ala getX), wo sie sich befindet? Oder kann sie nur feststellen, ob sie gerade z.B. am Rand steht oder nicht?
Wenn das Feld 640x480 ist, ist dann der Nullpunkt ganz links oben oder in der Mitte, oder ganz woanders?
In welchen Einheiten spielt sich das ganze ab? Sind die 640x480 tatsächlich die Einheiten des Spielfelds, in denen sich die Ameise (um 3 Einheiten pro Schritt) bewegt, oder nur grafische Darstellung?

Insgesamt habe ich den Eindruck, dass du dich in deiner eigenen Verschachtelung verstrickst, die höchstwahrscheinlich genau dem Konzept entgegenläuft, das ihr lernen sollt. Meiner Ansicht nach solltest du überhaupt keine Verschachtelungen verwenden, sondern nur den aktuellen Zustand (was die Ameise gerade tut bzw. als nächsten Schritt vorhat) mittels einer oder mehrerer Variablen definieren und abhängig davon z.B. in einem switch die nächste Aktion festlegen. Bei diesem Konzept finden nie zwei Aktionen direkt hintereinander statt, sondern in jedem Durchlauf nur genau eine einzige.
 
  • [JAVA] Wert zurücksetzten Beitrag #7
Jessen

Jessen

Bekanntes Mitglied
Dabei seit
01.08.2007
Beiträge
642
Reaktionspunkte
0
Ort
Hamburg
also nochma ... der Hügel steht an einer X belibigen stelle ... die ameise könnete - wenn ich das wollte - mittels walkTowardsHome(); direkt nach hause laufen
die armeise kann auch an einer x belibigen stelle starten weil sie durch die variablenabfrage zumNullpunk immer so lange läuft bis sie da is (214 = maximale einheiten anzahl) der nullpunkt is links oben in der ecke rechts unten is(639|639)
das projekt an sich is nur eine von meinen versionen (eigentliche aufgabe war es, die ameisen per randomWalk(); solange durch die kante zu scheuchen bis sie was gefunden haben, dann pheromone zu verspritzen während sie nach hause gehen, denen andere ameisen wieder folgen können wenn ise zum futter wollen
das feld ist 640² einheiten also die ameise braucht 214 schritte um von oben nach unten / rechts nach links zu kommen (halt 640/3)

die armeise soll den linien folgen um später der roten wieder zum anfang zu folgen, um einenneustart hervorzurufen sozusagen
Unbenannt.jpg


und die if verschachtelung kann man ja in ne eigene methode schreieben, dann siehts später im act sauberer aus :D
 
  • [JAVA] Wert zurücksetzten Beitrag #8
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Achso, dann war das ein Missverständnis meinerseits. Ich dachte, die Variable zumNullpunkt bedeutet, dass sie zum Hügel nach Hause laufen soll. Allerdings würdest du dafür keinen Zähler brauchen, sondern eine Möglichkeit, zu erkennen, ob du bei 0 bist. Du führst diesen Teil nämlich unnötigerweise immer 213x aus, was nicht sehr sauber ist. Ich nehme an, die walk()-Funktion erkennt den Rand und geht ohne Rückmeldung einfach nicht mehr weiter in diese Richtung.
Da du ja die Verwendbarkeit der Klasse ohnehin schon dadurch einschränkst, dass das Feld nicht größer als 640x640 ist, könntest du - falls du keine Möglichkeit zum Rausfinden der aktuellen Position oder zum Erkennen des Rands hast - unter der Annahme dieser Feldgröße ganz einfach ausrechnen, wieviele Schleifen sie gehen muss.

Zur Verschachtelung: Ich meine nicht, das einfach in eine Funktion auszulagern. Das ist das gleiche in grün, macht es aber nicht besser.
Ich meine damit, dass du eine(!) status-Variable hast, deren Werte z.B. für folgendes stehen:
0 gehe zum Nullpunkt
1 gehe nach unten
2 gehe unten nach rechts
3 gehe nach oben
4 gehe oben nach rechts
Dann noch einen Schrittzähler, also eine weitere Variable.
Das ganze geht dann im Prinzip so:
Code:
Im Konstruktor wird beides initialisiert:
status=nachnull
steps=214

In der act-Funktion:
	switch(status) {
		case nachnull:
			if(steps>0) {
				gehe nach links oben
				steps--
			} else {
				status=runter
				steps=639
			}
			break;
		case runter:
 			if(steps>0) {
				gehe nach unten
				steps--
			} else {
				status=untenrechts
				steps=10
			}
			break;
		case untenrechts:
			if(steps>0) {
				gehe nach rechts
				steps--
			} else {
				status=rauf
				steps=639
			}
			break;
		case rauf:
 			if(steps>0) {
				gehe nach oben
				steps--
			} else {
				status=obenrechts
				steps=10
			}
			break;
		case obenrechts:
			if(steps>0) {
				gehe nach rechts
				steps--
			} else {
				status=runter
				steps=639
			}
			break;
	}
Wie du siehst wird immer nur ein Teil ausgeführt oder der nächste Schritt festgelegt. Es gibt keine Verschachtelungen.
Das Konzept würde noch offensichtlicher, wenn du nicht manuell die walk-Funktion aufrufen könntest, sondern dies automatisch am Ende der act-Methode genau einmal passieren würde, sodass du ohnehin nur die Richtung festlegen kannst.
Natürlich ist das nur ein Konzept; du brauchst noch einen Zähler für die Anzahl der Schleifen, der z.B. in den beiden rechts-Blöcken erhöht und geprüft wird. Außerdem muss irgendwo noch die Überprüfung auf gefundenes Futter stattfinden.
 
  • [JAVA] Wert zurücksetzten Beitrag #9
Jessen

Jessen

Bekanntes Mitglied
Dabei seit
01.08.2007
Beiträge
642
Reaktionspunkte
0
Ort
Hamburg
ja den code für das futter habich auch schon im kopf das möchte ich mit getOneIntersectinObject(); machen und hmm den schleifenzähler kann man doch wieder über ne variable machen (ich weiß schonwieder - is aber die einzige möglichkeit die ich kenn) und dann meintewegen im else von "case obenrechts:" einfach ein variable++; anheften (ps müssen hierter die ganzen steps-- starus=runter steps=639 nich auch noch semikolons (oder was eben die mehrzahl von semikolon ist)
 
  • [JAVA] Wert zurücksetzten Beitrag #10
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Das ist selbstverständlich nur Pseudecode, damit das Prinzip deutlich wird. Wie das in deiner Sprache genau zu implementieren ist, musst du selber wissen. ;) Jepp, natürlich wird der Zähler für die Schleife auch eine Variable werden. Du weißt ja im Voraus schon, wie oft du nach rechts gehen kannst. Der letzte Satz in meinem letzten Post beschreibt ja schon die Vorgehensweise. Wenn du dir kurz Gedanken machst, ob der letzte Schritt nach rechts oben oder unten stattfindet, dann musst du es auch nicht in beiden Blöcken prüfen.
Die Prüfung auf Futter könnte man z.B. so machen, dass der ganze Switch-Block für den nächsten Schritt in einem if verpackt wird. Also so in der Art:
if(hierIstFutter) {
Pheromon
GoHome
} else {
nächste Aktion mit switch-Block festlegen
}
 
  • [JAVA] Wert zurücksetzten Beitrag #11
Jessen

Jessen

Bekanntes Mitglied
Dabei seit
01.08.2007
Beiträge
642
Reaktionspunkte
0
Ort
Hamburg
so hab jetzt ne unendlich laufende ameise :D

vielen dank schonma dafür

Code:
import greenfoot.*;  // (World, Actor, GreenfootImage, and Greenfoot)

public class Ant extends Creature
{
    private int direction;
    private int rechtsSchritte;
    private int zumNullpunkt;
    private int runterGehen;
    private int hochGehen;
    private int rechtsGehen;
    private int rechtsGehenb;
    private int steps;
    private int status; /* 0 = nachnull, 1 = runter, 2 = untenrechts, 3 = rauf, 4 = obenrechts */ 
    private int zeit; /* ameise bracuht 11 durchgänge um das ganze feld zu überqueren */

    public Ant()
    {
        this(null);
    }

    public Ant(AntHill home)
    {
        super();
        setHomeHill(home);
        setDirection(0);
        zumNullpunkt = 214;
        runterGehen = 214;
        hochGehen = 214;
        rechtsGehen = 10;
        rechtsGehenb = 10;
        steps = 214;
        status = 0;
        zeit = 11;
    }

    public void act()
    {
        switch(status) 
        {
            case 0:
                if(steps>0) 
                {
                    walkNorth();
                    walkWest();
                    steps--;
                }
                else
                {
                    status = 1;
                    steps = 214;
                }
                break;
            case 1:
                if(steps>0) 
                {
                    walkSouth();
                    steps--;
                } 
                else 
                {
                    status = 2;
                    steps = 10;
                }
                break;
		    case 2:
		        if(steps>0) 
		        {
		            walkEast();
		            steps--;
		        }
		        else 
		        {
		            status = 3;
		            steps = 214;
		        }
		        break;
		    case 3:
		        if(steps>0) 
		        {
		            walkNorth();
		            steps--;
		        }
		        else 
		        {
		            status = 4;
		            steps = 10;
		        }
		        break;
		    case 4:
		        if(steps>0) 
		        {
		            walkEast();
		            steps--;
		        }
		        else
		        {
		            if (zeit == 0)
		            {
		                zeit = 11;
		                status = 0;
		                steps = 214;
		            }
		            else
		            {
		                zeit--;
		                status = 1;
		                steps = 214;
		            }
		        }
			break;
	}
        
        
        

            
         
    }
    
 

    
    /** Laeuft nach Osten */
    public void walkEast()
    {
        walkDirection(0);
    }

    /** Laeuft nach S�den */
    public void walkSouth()
    {
        walkDirection(1);
    }
    
    /** Laeuft nach Westen */
    public void walkWest()
    {
        walkDirection(2);
    }

    /** Laeuft nach Norden */
    public void walkNorth()
    {
        walkDirection(3);
    }
    
    /**
     * Laeuft in die angegebene Richtung. Der Parameter 'direction' 
     * muss im Intervall [0..3] liegen.
     */
    public void walkDirection(int direction)
    {
        setDirection(direction);
        walk();
    }    

    /**
     * Liefert die Richtung, in die die Ameise schaut.
     * 0 = Osten, 1 = S�den, 2 = Westen, 3 = Norden
     */
    public int getDirection()
    {
        return direction;
    }

    /**
     * Aendert die Blickrichtung der Ameise. Der Parameter 'direction'
     * muss im Intervall [0..3] liegen.
     */
    private void setDirection(int direction)
    {
        if ((direction >= 0) && (direction <= 3)) {
            this.direction = direction;
        }
        switch(direction) {
            case 0 :
                setSpeed(10, 0);
                setRotation(0);
                break;
            case 1 :
                setSpeed(0, 10);
                setRotation(90);
                break;
            case 2 :
                setSpeed(-10, 0);
                setRotation(180);
                break;
            case 3 :
                setSpeed(0, -10);
                setRotation(270);
                break;
            default :
                break;
        }
    }

    /**
     * Ameise läuft das Spielfeld systematisch ab
     */
    private void walkLoop()
    {
        if (zumNullpunkt > 0)
        {
            walkDirection(3);
            walkDirection(2);
            zumNullpunkt--;
        }
        else
        {
            if (rechtsGehen > 0)
            {
                walkDirection(0);
                rechtsGehen--;
            }
            else
            {
                if (runterGehen > 0)
                {
                    walkDirection(1);
                    runterGehen--;
                }
                else
                {
                    if (rechtsGehenb > 0)
                    {
                        walkDirection(0);
                        rechtsGehenb--;
                    }
                    else
                    {
                        if (hochGehen > 0)
                        {
                            walkDirection(3);
                            hochGehen--;
                        }
                        else
                        {
                            runterGehen = 214;
                            hochGehen = 214;
                            rechtsGehen = 10;
                            rechtsGehenb = 10;
                             
                        }
                    }
                }
            }
        }
    }
}

werd mich jetzt dran setzen, das der ameisenhügel 2 antklassen verwaltet, und die einen im abstand von 30 steps rausgelassen werden, die anderen ganz normal :D muss ja da nurnoch wieder die walkHimmelsrichtung durch walkDirection ersetzten
 
Thema:

[JAVA] Wert zurücksetzten

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben