Benutzer mit den meisten Antworten
Führer Ameise

Frage
-
Hallo Foummitglieder,
seit ca. 3 Wochen arbeiten wir im Informatik Unterricht am unseren Antme-Völkern. Ich persönlich hab mich kaum angestrengt, da mich dieses Projekt wenig gereitzt hat, bis der Lehrer gemeint hat, dass wir die Völker auch gegeneinander antreten lassen können. Nun bin ich Feuer und Flamme!
Jetzt zu Frage: Ich kriege es wehemenst nicht hin, dass meine 8 Kämpfer Ameisen meine Führer Ameise Folgen. Die Überlegung--> Ich lass meine FÜhrer Ameise große Duftmarken aussprüchen damit auch jede Kriegerameise diese richt und hinlaufen soll. Zusammen kriegen sie die Wanzen sicherlich besser hin als alleine( das selbe gilt denk ich mal gegen feindliche Ameisen auch). Mein Problem sobal meine FÜhrer Ameise sein Job verrichtet laufen ALLE Ameisen nach rechts gegen die Wand. Ich versteh dieses Verhalten nicht. Wie kann ich einer duftmarke eine Variable geben, damit z.b nur kriegerameisen auf diese reagieren? bzw. könntet ihr mir ein script vorlegen und ich überleg mir dann wie ich das umsetze.
Danke für jeden Tipp, Vorschlag und Rat und schönen ABend noch!! =D
Antworten
-
Hi,
Sehr gerne poste ich mein Script.
das ist 1:1 das Skript, welches sich zuhauf im Netz findet.Schaut es euch an, bei "riecht Freund" lieg offensichtlich mein Fehler.
eher nicht. Falls Du da auch nur irgendwas selbst geschrieben hast, sollte dir evtl. aufgefallen sein, dass es wohl eher die Methode "DreheInRichtung", alternativ auch "GeheGeradeaus" sein wird, wobei ich bei letzterem drank denken würde, einen Alkotest bei den Ameisen durchführen zu lassen^^
Da Du den Code der Methode DreheInRichtung nicht gepostet hast, kann man da leider auch nicht helfen. Den Aufruf von RiechtFreund und die Übergabe der Parameter könnte man evtl. auch gebrauchen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Robert BreitenhoferModerator Montag, 6. Februar 2012 11:50
-
Hi neinmeinname,
Man könnte bei Richen einen Schalter Abfragen, der Angibt das die Armeise schon beschäftigt ist.
Den setzt du wenn die Aktion der Armeise startet GeheZuZiel(zucker) und nimst ihn wider weg, wenn die Aktion beendet ist.
Ich denke mal dass dürfte dann igrendwan nach GeheZuBau() sein.
MFG
Björn
- Als Antwort vorgeschlagen Stefan FalzModerator Sonntag, 12. Februar 2012 12:06
- Als Antwort markiert Robert BreitenhoferModerator Montag, 13. Februar 2012 08:05
-
Hi neinmeinname,
der Fehler liegt ist in der Funktion:
public override string BestimmeKaste(Dictionary<string, int> anzahl) { if (anzahl["Führer"] < 0) { return "Führer"; } else if (anzahl["Zuckersucher"] < 1) { return "Zuckersucher"; } else if (anzahl["Apfelsucher"] < 1) { return "Apfelsucher"; } else if (anzahl["Apfelsammler"] <0) { return "Apfelsucher"; } else if (anzahl["Kämpfer"] < 0) { return "Kämpfer"; } else return "Zuckersammler"; }
Setzt dir mal eine BreakPoint im Debugger in der Funktion:
public override void ZielErreicht(Obst obst) { if (Kaste == "Apfelsammler") { Nimm(obst); GeheZuBau(); } if (Kaste == "Apfelsucher") { if (AnzahlAmeisenDerSelbenKasteInSichtweite > 1) { GeheWegVon(obst); apfelgefunden = false; } else { apfelgefunden = true; } } }
Am besten direkt am Start. Schau dir an was in den Variablen steht und wieso GeheZuBau nicht aufgerufen wird.
Dann wirst du auch sehen wo Oben in der Funktion der Fehler ist.
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 7. Februar 2012 09:05
-
Wie wäre es, wenn Du mal das Buch dazu studierst?--
Viele Gruesse
Peter- Als Antwort vorgeschlagen Konrad Neitzel Donnerstag, 2. Februar 2012 11:28
- Als Antwort markiert Robert BreitenhoferModerator Montag, 6. Februar 2012 11:50
Alle Antworten
-
Hi,
Ich persönlich hab mich kaum angestrengt, da mich dieses Projekt wenig gereitzt hat
ahhhhh ja., bis der Lehrer gemeint hat, dass wir die Völker auch gegeneinander antreten lassen können. Nun bin ich Feuer und Flamme!
Davon merkt man aber noch nicht viel.Mein Problem sobal meine FÜhrer Ameise sein Job verrichtet laufen ALLE Ameisen nach rechts gegen die Wand. Ich versteh dieses Verhalten nicht.
Wir auch nicht. Wie auch, so ganz ohne Code. Poste doch mal das, was Du bereits gemacht hast und vor allen Dingen die Routine, die Du aufrufst, um die Ameisen in die gewünschte Richtung laufen zu lassen.Wie kann ich einer duftmarke eine Variable geben, damit z.b nur kriegerameisen auf diese reagieren? bzw. könntet ihr mir ein script vorlegen und ich überleg mir dann wie ich das umsetze.
Eher nicht. Poste das, was Du hast und es findet sich hier sicher jemand, der dir ggfs. vorhandene Fehler aufzeigt. Deine Schularbeit macht dir hier aber keiner.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Sehr gerne poste ich mein Script. Schaut es euch an, bei "riecht Freund" lieg offensichtlich mein Fehler. Vorschläge nehm ich gerne an =).
using System;
using System.Collections.Generic;
using AntMe.Deutsch;
// Füge hier hinter AntMe.Spieler einen Punkt und deinen Namen ohne Leerzeichen
// ein! Zum Beispiel "AntMe.Spieler.WolfgangGallo".
namespace AntMe.Spieler
{
// Das Spieler-Attribut erlaubt das Festlegen des Volk-Names und von Vor-
// und Nachname des Spielers. Der Volk-Name muß zugewiesen werden, sonst wird
// das Volk nicht gefunden.
[Spieler(
Volkname = "THE MASTER",
Vorname = "Burak",
Nachname = "yilmaz"
)]
// Das Typ-Attribut erlaubt das Ändern der Ameisen-Eigenschaften. Um den Typ
// zu aktivieren muß ein Name zugewiesen und dieser Name in der Methode
// BestimmeTyp zurückgegeben werden. Das Attribut kann kopiert und mit
// verschiedenen Namen mehrfach verwendet werden.
// Eine genauere Beschreibung gibts in Lektion 6 des Ameisen-Tutorials.
[Kaste(
Name = "Sammler",
GeschwindigkeitModifikator = 2,
DrehgeschwindigkeitModifikator = -1,
LastModifikator = 1,
ReichweiteModifikator = 0,
SichtweiteModifikator = -1,
EnergieModifikator = 0,
AngriffModifikator = -1
)]
[Kaste(
Name = "Kämpfer",
GeschwindigkeitModifikator = 0,
DrehgeschwindigkeitModifikator = 0,
LastModifikator = -1,
ReichweiteModifikator = 0,
SichtweiteModifikator = -1,
EnergieModifikator = 0,
AngriffModifikator = 2
)]
[Kaste(
Name = "Führer",
GeschwindigkeitModifikator = 0,
DrehgeschwindigkeitModifikator = 0,
LastModifikator = -1,
ReichweiteModifikator = 0,
SichtweiteModifikator = -1,
EnergieModifikator = 0,
AngriffModifikator = 2
)]
public class MeineAmeise : Basisameise
{
#region Kaste
/// <summary>
/// Bestimmt die Kaste einer neuen Ameise.
/// </summary>
/// <param name="anzahl">Die Anzahl der von jeder Kaste bereits vorhandenen
/// Ameisen.</param>
/// <returns>Der Name der Kaste der Ameise.</returns>
public override string BestimmeKaste(Dictionary<string, int> anzahl)
{
if (anzahl["Führer"] < 1)
{
return "Führer";
}
else if (anzahl["Kämpfer"] < 1)
{
return "Kämpfer";
}
else
{
return "Sammler";
}
}
#endregion
#region Fortbewegung
/// <summary>
/// Wird wiederholt aufgerufen, wenn der die Ameise nicht weiss wo sie
/// hingehen soll.
/// </summary>
public override void Wartet()
{
GeheGeradeaus();
}
/// <summary>
/// Wird einmal aufgerufen, wenn die Ameise ein Drittel ihrer maximalen
/// Reichweite überschritten hat.
/// </summary>
public override void WirdMüde()
{
}
#endregion
#region Nahrung
/// <summary>
/// Wird wiederholt aufgerufen, wenn die Ameise mindestens einen
/// Zuckerhaufen sieht.
/// </summary>
/// <param name="zucker">Der nächstgelegene Zuckerhaufen.</param>
public override void Sieht(Zucker zucker)
{
if (Kaste == "Sammler")
{
if (AktuelleLast == 0)
{
GeheZuZiel(zucker);
}
int entfernung, richtung;
entfernung = Koordinate.BestimmeEntfernung(this, zucker);
richtung = Koordinate.BestimmeRichtung(this, zucker);
SprüheMarkierung(richtung, entfernung);
}
}
/// <summary>
/// Wird wiederholt aufgerufen, wenn die Ameise mindstens ein
/// Obststück sieht.
/// </summary>
/// <param name="obst">Das nächstgelegene Obststück.</param>
public override void Sieht(Obst obst)
{
if (Kaste == "Sammler")
{
if (AktuelleLast == 0)
{
GeheZuZiel(obst);
}
int entfernung, richtung;
entfernung = Koordinate.BestimmeEntfernung(this, obst);
richtung = Koordinate.BestimmeRichtung(this, obst);
SprüheMarkierung(richtung, entfernung);
}
}
/// <summary>
/// Wird einmal aufgerufen, wenn di e Ameise einen Zuckerhaufen als Ziel
/// hat und bei diesem ankommt.
/// </summary>
/// <param name="zucker">Der Zuckerhaufen.</param>
public override void ZielErreicht(Zucker zucker)
{
Nimm(zucker);
GeheZuBau();
}
/// <summary>
/// Wird einmal aufgerufen, wenn die Ameise ein Obststück als Ziel hat und
/// bei diesem ankommt.
/// </summary>
/// <param name="obst">Das Obstück.</param>
public override void ZielErreicht(Obst obst)
{
Nimm(obst);
GeheZuBau();
}
#endregion
#region Kommunikation
/// <summary>
/// Wird einmal aufgerufen, wenn die Ameise eine Markierung des selben
/// Volkes riecht. Einmal gerochene Markierungen werden nicht erneut
/// gerochen.
/// </summary>
/// <param name="markierung">Die nächste neue Markierung.</param>
public override void RiechtFreund(Markierung markierung)
{
if (Ziel == null)
{
DreheInRichtung(markierung.Information);
GeheGeradeaus();
}
if (Ziel == "1")
{
DreheInRichtung(markierung.Information);
}
}
/// <summary>
/// Wird wiederholt aufgerufen, wenn die Ameise mindstens eine Ameise des
/// selben Volkes sieht.
/// </summary>
/// <param name="ameise">Die nächstgelegene befreundete Ameise.</param>
public override void SiehtFreund(Ameise ameise)
{
}
/// <summary>
/// Wird aufgerufen, wenn die Ameise eine befreundete Ameise eines anderen Teams trifft.
/// </summary>
/// <param name="ameise"></param>
public override void SiehtVerbündeten(Ameise ameise)
{
}
#endregion
#region Kampf
/// <summary>
/// Wird wiederholt aufgerufen, wenn die Ameise mindestens eine Wanze
/// sieht.
/// </summary>
/// <param name="wanze">Die nächstgelegene Wanze.</param>
public override void SiehtFeind(Wanze wanze)
{
}
/// <summary>
/// Wird wiederholt aufgerufen, wenn die Ameise mindestens eine Ameise eines
/// anderen Volkes sieht.
/// </summary>
/// <param name="ameise">Die nächstgelegen feindliche Ameise.</param>
public override void SiehtFeind(Ameise ameise)
{
}
/// <summary>
/// Wird wiederholt aufgerufen, wenn die Ameise von einer Wanze angegriffen
/// wird.
/// </summary>
/// <param name="wanze">Die angreifende Wanze.</param>
public override void WirdAngegriffen(Wanze wanze)
{
}
/// <summary>
/// Wird wiederholt aufgerufen in der die Ameise von einer Ameise eines
/// anderen Volkes Ameise angegriffen wird.
/// </summary>
/// <param name="ameise">Die angreifende feindliche Ameise.</param>
public override void WirdAngegriffen(Ameise ameise)
{
}
#endregion
#region Sonstiges
/// <summary>
/// Wird einmal aufgerufen, wenn die Ameise gestorben ist.
/// </summary>
/// <param name="todesart">Die Todesart der Ameise</param>
public override void IstGestorben(Todesart todesart)
{
}
/// <summary>
/// Wird unabhängig von äußeren Umständen in jeder Runde aufgerufen.
/// </summary>
public override void Tick()
{
if (Kaste == "Sammler")
{
if (Ziel is Bau && AktuelleLast > 0 && GetragenesObst == null)
{
SprüheMarkierung(Richtung + 180);
}
}
if (Kaste == "Führer")
{
SprüheMarkierung(1, 600);
}
#endregion
}
}} -
Hi,
Sehr gerne poste ich mein Script.
das ist 1:1 das Skript, welches sich zuhauf im Netz findet.Schaut es euch an, bei "riecht Freund" lieg offensichtlich mein Fehler.
eher nicht. Falls Du da auch nur irgendwas selbst geschrieben hast, sollte dir evtl. aufgefallen sein, dass es wohl eher die Methode "DreheInRichtung", alternativ auch "GeheGeradeaus" sein wird, wobei ich bei letzterem drank denken würde, einen Alkotest bei den Ameisen durchführen zu lassen^^
Da Du den Code der Methode DreheInRichtung nicht gepostet hast, kann man da leider auch nicht helfen. Den Aufruf von RiechtFreund und die Übergabe der Parameter könnte man evtl. auch gebrauchen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Robert BreitenhoferModerator Montag, 6. Februar 2012 11:50
-
Wie wäre es, wenn Du mal das Buch dazu studierst?--
Viele Gruesse
Peter- Als Antwort vorgeschlagen Konrad Neitzel Donnerstag, 2. Februar 2012 11:28
- Als Antwort markiert Robert BreitenhoferModerator Montag, 6. Februar 2012 11:50
-
Hallo neinmeinname,
Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Hallo, ich hab weiter daran gearbeitet und es hat letzlich doch geklapt *freu*. Nächstes Problem: Wie ich erfreulicherweise feststellen konnte klappt es viel besser wenn ich eine Zuckersucher Ameise vorschicke der sprüht wenn er einen haufen hat und alle Zuckersammler rennen zu ihm. Funktioniert prächtigt. Dann noch nen Zähler in den Tick damit die Ameisen in größeren intervallen am stück laufen können. Das selbe wollt ich dann auf meine Apfelsucher übertragen mit Apfelsammler. Jedoch rennen alle ameisen nun nur noch zu den Äpfeln und bleiben da.Wenn ich die Anzahl der Apfelsammler auf 0 mach dann funktioniert alles sowie vorher , aber ohne Apfelsammler eben, was mich sehr verwirrt. Ich zeig euch jetzt mal nur die, die meiner Meinung nach relevant sind, von meinem Script.(P.s: Die anderen Kasten dürft ihr ignorieren, da diese sowieso auf 0 sind)
public override string BestimmeKaste(Dictionary<string, int> anzahl)
{
if (anzahl["Führer"] < 0)
{
return "Führer";
}
else if (anzahl["Zuckersucher"] < 1)
{
return "Zuckersucher";
}
else if (anzahl["Apfelsucher"] < 1)
{
return "Apfelsucher";
}
else if (anzahl["Apfelsammler"] <0)
{
return "Apfelsucher";
}
else if (anzahl["Kämpfer"] < 0)
{
return "Kämpfer";
}
else return "Zuckersammler";
}public override void Sieht(Zucker zucker)
{
if ((Kaste == "Zuckersammler")||(Kaste=="Zuckersucher"))
{
if (AktuelleLast == 0)
{
GeheZuZiel(zucker);
}public override void Sieht(Obst obst)
{
if ((Kaste == "Apfelsammler")||(Kaste=="Apfelsucher"))
{
if (AktuelleLast == 0)
{
GeheZuZiel(obst);
}public override void ZielErreicht(Zucker zucker)
{
if (Kaste == "Zuckersammler")
{
Nimm(zucker);
GeheZuBau();
}
if (Kaste == "Zuckersucher")
{
if (AnzahlAmeisenDerSelbenKasteInSichtweite > 1)
{
GeheWegVon(zucker);
amziel = false;
}
else
{
amziel = true;
}
}
}public override void ZielErreicht(Obst obst)
{
if (Kaste == "Apfelsammler")
{
Nimm(obst);
GeheZuBau();
}
if (Kaste == "Apfelsucher")
{
if (AnzahlAmeisenDerSelbenKasteInSichtweite > 1)
{
GeheWegVon(obst);
apfelgefunden = false;
}
else
{
apfelgefunden = true;
}
}
}public override void RiechtFreund(Markierung markierung)
{
if (Kaste == "Zuckersammler")
{
if ((markierung.Information ==5000)&& (AktuelleLast==0))
{
GeheZuZiel(markierung);
}
}
if (Kaste == "Apfelsammler")
{
if ((markierung.Information == 7000) && (AktuelleLast == 0))
{
GeheZuZiel(markierung);
}
}
if ((Kaste == "Kämpfer") && (markierung.Information == 9999))
{
GeheZuZiel(markierung);
}
}Die Apfelsucher sprühen die Information 7000 und die Zuckersammler 5000.
Das wars dann auch schon. Warum bleiben die Ameisen bei den Äpfeln stehen?!
-
Hi neinmeinname,
der Fehler liegt ist in der Funktion:
public override string BestimmeKaste(Dictionary<string, int> anzahl) { if (anzahl["Führer"] < 0) { return "Führer"; } else if (anzahl["Zuckersucher"] < 1) { return "Zuckersucher"; } else if (anzahl["Apfelsucher"] < 1) { return "Apfelsucher"; } else if (anzahl["Apfelsammler"] <0) { return "Apfelsucher"; } else if (anzahl["Kämpfer"] < 0) { return "Kämpfer"; } else return "Zuckersammler"; }
Setzt dir mal eine BreakPoint im Debugger in der Funktion:
public override void ZielErreicht(Obst obst) { if (Kaste == "Apfelsammler") { Nimm(obst); GeheZuBau(); } if (Kaste == "Apfelsucher") { if (AnzahlAmeisenDerSelbenKasteInSichtweite > 1) { GeheWegVon(obst); apfelgefunden = false; } else { apfelgefunden = true; } } }
Am besten direkt am Start. Schau dir an was in den Variablen steht und wieso GeheZuBau nicht aufgerufen wird.
Dann wirst du auch sehen wo Oben in der Funktion der Fehler ist.
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 7. Februar 2012 09:05
-
Alles klar problem wieder gelösthmmm also momentan bin ich eig echt zufrienden mit dem wie es läuft komme im schnitt auf ca. 8500. Habt ihr ein Tipp wie man es schaffen kann das die Ameisen sich nur auf ein Ziel konzentrieren und nicht von nem anderen "abgelenkt" werden also , der ZUckersucher sprüht seinen Duft bei einem Zuckerhügel aus, aber wenn ein anderen Zuckersuche bei einem anderen Zuckehügel auch seinen Duft absondert dann halten die Ameisen an und laufen immer wieder zum einen oder anderen oO. gibts dafür ein Befehl alles andere ignoreiren oder wie würdet ihr das lösen?
-
Hi neinmeinname,
Man könnte bei Richen einen Schalter Abfragen, der Angibt das die Armeise schon beschäftigt ist.
Den setzt du wenn die Aktion der Armeise startet GeheZuZiel(zucker) und nimst ihn wider weg, wenn die Aktion beendet ist.
Ich denke mal dass dürfte dann igrendwan nach GeheZuBau() sein.
MFG
Björn
- Als Antwort vorgeschlagen Stefan FalzModerator Sonntag, 12. Februar 2012 12:06
- Als Antwort markiert Robert BreitenhoferModerator Montag, 13. Februar 2012 08:05