Fakten, Erlebnisse, Gedanken und Erkenntnisse
AntMe! – die Ameisensimulation
Im MSDN Bereich von Microsoft ist vor einigen Tagen ein interessantes Projekt vorgestellt worden. Es geht um AntMe! – eine Ameisensimulation. Ich habe die letzten Tage hier und da einen Blick darauf geworfen und finde, daß es für Einsteiger sehr gut geeignet ist, C# oder VB .Net zu lernen. Das Projekt selbst wird in 2 Paketen angeboten – für Einsteiger und Professionelle Entwickler. In der Professional Version ist der komplette Quellcode des Projekts enthalten – nebst GDI+ und Direct3D Darstellung. Der Quellcode selbst ist ist gut dokumentiert und die Hilfe sollte allen ein guter Einstieg sein.
Es macht sichtlich Spaß seinen Ameisen Leben einzuhauchen und diese mit wohlüberlegten Programmcode auszustatten.
Ich stelle einfach mal meinen derzeitigen Stand meiner Ameisen (nach effektiven 2 Stunden Überlegen und Ausprobieren) zur Verfügung. Vielleicht hat ja der eine oder andere Interesse daran sich daran zu versuchen.
Der Quelltext selbst ist noch nicht (bis auf den Inhalt aus der Vorlage) dokumentiert.
[source:csharp]
using System;
using System.Collections.Generic;
using System.Text;
using AntMe;
namespace AntMe.Spieler
{
[Spieler(
Name = "FireFox",
Vorname = "Michael",
Nachname = "Hensel"
)]
// Das Typ-Attribut hier erlaubt das Ändern der Ameisen-Eigenschaften. Um hier Änderungen vorzunehmen muss
// dem neuen Ameisentyp unbedingt ein Name zugewiesen und bei “BestimmeTyp” auch angegeben werden.
// Eine genauere Beschreibung gibts in Lektion 6 des Ameisen-Tutorials
[Typ(
Name = "Sammler",
GeschwindigkeitModifikator = 0,
DrehgeschwindigkeitModifikator = -1,
LastModifikator = 1,
ReichweiteModifikator = 1,
SichtweiteModifikator = 1,
EnergieModifikator = -1,
AngriffModifikator = -1
)]
[Typ(
Name = "Kämpfer",
GeschwindigkeitModifikator = 0,
DrehgeschwindigkeitModifikator = -1,
LastModifikator = -1,
ReichweiteModifikator = 1,
SichtweiteModifikator = 0,
EnergieModifikator = 1,
AngriffModifikator = 0
)]
public class Sammler : Ameise
{
int LetzteNahrung = 0;
Zucker LetzterZucker=null;
///
/// Wird vor jedem Spiel aufgerufen. Statische Variablen müssen hier
/// initialisiert werden!
///
public static void Initialisiere()
{
}
///
///
///
Anzahl der vorhandenen Ameisen pro Typ
///
public static string BestimmeTyp(Dictionary
{
//if (anzahl["Sammler"] < 60)
// return "Sammler";
//else
// return "Kämpfer";
if (anzahl["Sammler"] == 0)
{
return "Sammler";
}
else
{
// Sollte das Verhältnis Kämpfer/Sammler über 1 steigen (also mehr Kämpfer als Sammler) werden Sammler
// produziert, ansonsten Kämpfer
return ((float)anzahl["Kämpfer"] / (float)anzahl["Sammler"] > 1.0f ? “Sammler” : “Kämpfer”);
}
}
///
///
///
Das Volk zu dem die neue Ameise gehört
///
Der Typ der neuen Ameise
public Sammler(Volk volk, int typIndex)
: base(volk, typIndex)
{
}
///
///
public override void Wartet()
{
// Sollte die Ameise außerhalb des Nahrungsmittelradiuses liegen
if (!(this.Ziel is Bau))
{
if (this.EntfernungZuBau > 400)
{
// …soll sie wieder heim gehen
GeheZuBau();
}
else
{
// …ansonsten soll sie sich ein bischen drehen (zufälliger Winkel zwischen -20 und 20 Grad)
// und wieder ein paar Schritte laufen
DreheUmWinkel(Zufall.Zahl(-20, 20));
GeheGeradeaus(20);
}
}
// Wenn die restliche verfügbare Strecke der Ameise (minus einem Puffer von 50 Schritten)
// kleiner als die Entfernung zum Bau ist…
if (this.Reichweite – this.ZurückgelegteStrecke – 50 < this.EntfernungZuBau)
{
// ...soll sie nach Hause gehen um nicht zu sterben
GeheZuBau();
}
}
///
/// Reichweite überschritten hat.
///
public override void WirdMüde()
{
}
///
///
///
Zuckerhaufen
public override void Sieht(Zucker zucker)
{
//Egal welcher Typ – Markierung sprühen
int entfernung, richtung;
entfernung = Koordinate.BestimmeEntfernung(this, zucker);
richtung = Koordinate.BestimmeRichtung(this, zucker);
SprüheMarkierung(2, entfernung);
//Nur Sammler sollen weiteres tun
if ((AktuelleLast == 0)&&(this.Typ == “Sammler”))
{
GeheZuZiel(zucker);
}
}
///
///
///
Obst
public override void Sieht(Obst obst)
{
//Jedes Vieh soll sprühen
int entfernung, richtung;
entfernung = Koordinate.BestimmeEntfernung(this, obst);
richtung = Koordinate.BestimmeRichtung(this, obst);
SprüheMarkierung(1, entfernung);
if ((AktuelleLast == 0) && (BrauchtNochTräger(obst))&&(this.Typ == “Sammler”))
{
GeheZuZiel(obst);
}
}
///
///
///
Käfer
public override void Sieht(Käfer käfer)
{
int entfernung, richtung;
entfernung = Koordinate.BestimmeEntfernung(this, käfer);
richtung = Koordinate.BestimmeRichtung(this, käfer);
SprüheMarkierung(3, entfernung);
if (this.Typ == “Kämpfer”)
{
if (this.AktuelleLast == 0)
{
if (this.AnzahlInSichtweite > 5)
{
GreifeAn(käfer);
}
}
}
else if (this.Typ == “Sammler”)
{
if (this.AnzahlInSichtweite > 5)
{
GreifeAn(käfer);
}
}
}
///
///
///
Markierung
public override void Sieht(Markierung markierung)
{
if (Ziel == null)
{
if (this.Typ == “Kämpfer”)
{
//es ist ein Käfer
if (markierung.Information == 3)
{
if (this.AnzahlInSichtweite > 5)
{
DreheInRichtung(Koordinate.BestimmeRichtung(this, markierung));
GeheGeradeaus();
}
}
}
else if (this.Typ == “Sammler”)
{
//es ist Obst
if (markierung.Information == 1)
{
DreheInRichtung(Koordinate.BestimmeRichtung(this, markierung));
GeheGeradeaus();
}
else if (markierung.Information == 2) //Zucker
{
DreheInRichtung(Koordinate.BestimmeRichtung(this, markierung));
GeheGeradeaus();
}
else if (markierung.Information == 3)
{
if (this.AnzahlInSichtweite > 6)
{
if (this.AktuelleLast == 0)
{
DreheInRichtung(Koordinate.BestimmeRichtung(this, markierung));
GeheGeradeaus();
}
}
}
}
}
}
///
///
///
Käfer
public override void WirdAngegriffen(Käfer käfer)
{
if (this.Typ == “Krieger”)
{
GreifeAn(käfer);
}
else if (this.Typ == “Sammler”) // Sammler ergreifen die Flucht
{
if (this.GetragenesObst != null)
{
LasseNahrungFallen();
}
GeheZuBau();
}
}
///
///
///
Zuckerhaufen
public override void ZielErreicht(Zucker zucker)
{
int entfernung, richtung;
entfernung = Koordinate.BestimmeEntfernung(this, zucker);
richtung = Koordinate.BestimmeRichtung(this, zucker);
SprüheMarkierung(2, entfernung);
Nimm(zucker);
LetzterZucker = zucker;
GeheZuBau();
}
///
///
///
Obst
public override void ZielErreicht(Obst obst)
{
int entfernung, richtung;
entfernung = Koordinate.BestimmeEntfernung(this, obst);
richtung = Koordinate.BestimmeRichtung(this, obst);
SprüheMarkierung(1, entfernung);
if (BrauchtNochTräger(obst))
{
Nimm(obst);
GeheZuBau();
}
else
{
GeheGeradeaus(5);
}
}
///
///
///
Die Todesart der Ameise
public override void IstGestorben(TodesArt todesArt)
{
System.Diagnostics.Debug.WriteLine(todesArt.ToString());
}
///
///
public override void Tick()
{
if (Ziel is Bau && AktuelleLast > 0 && GetragenesObst == null)
SprüheMarkierung(Richtung + 180,20);
if (Ziel == null)
{
if (LetzterZucker != null)
{
if (LetzterZucker.Menge > 10)
{
GeheZuZiel(LetzterZucker);
}
}
}
else if (Ziel is Käfer && this.AnzahlInSichtweite < 4)
{
this.BleibStehen();
}
}
}
}
[/source]
| Dieser Beitrag wurde von FireFox am 16. April 2007 um 18:55 veröffentlicht und unter C#, Programmierung abgelegt. Du kannst allen Antworten zu diesem Beitrag durch RSS 2.0 folgen. Du kannst eine Antwort schreiben oder einen Trackback von deiner eigenen Seite hinterlassen. |
vor 3 Monaten
ich brauch das mei ameise mehr drogt des geht aber ned