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;
///

/// Gibt dem Spieler die Möglichkeit, eigene Variablen zu initialisieren.
/// Wird vor jedem Spiel aufgerufen. Statische Variablen m?ssen hier
/// initialisiert werden!
///

public static void Initialisiere()
{
}

///

/// Bestimmt den Typ einer neu zu erzeugenden Ameise.
///

/// Anzahl der vorhandenen Ameisen pro Typ /// Name des Typs
public static string BestimmeTyp(Dictionary anzahl)
{
//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“);
}
}

///

/// Der Ameise Konstruktor.
///

/// Das Volk zu dem die neue Ameise gehört /// Der Typ der neuen Ameise public Sammler(Volk volk, int typIndex)
: base(volk, typIndex)
{
}

///

/// Wird aufgerufen, wenn die Ameise nicht weiss wo sie hingehen soll.
///

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(); } } ///

/// Wird einmal aufgerufen, sobald die Ameise ein Drittel ihrer maximalen
/// Reichweite ?berschritten hat.
///

public override void WirdM?de()
{
}

///

/// Wird aufgerufen, wenn die Ameise einen Zuckerhaufen sieht.
///

/// 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);
}
}

///

/// Wird aufgerufen, wenn die Ameise ein St?ck Obst sieht.
///

/// 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);
}
}

///

/// Wird aufgerufen, wenn die Ameise einen Käfer sieht.
///

/// 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);
}
}
}

///

/// Wird aufgerufen, wenn die Ameise eine Markierung sieht.
///

/// 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();
}
}
}
}
}
}

///

/// Wird aufgerufen, wenn die Ameise von einem Käfer angegriffen wird.
///

/// 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();
}
}

///

/// Wird aufgerufen, wenn die Ameise bei einem Zuckerhaufen ankommt.
///

/// 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();
}

///

/// Wird aufgerufen, wenn die Ameise bei einem St?ck Obst ankommt.
///

/// 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);
}
}

///

/// Wird aufgerufen, wenn die Ameise gestorben ist.
///

/// Die Todesart der Ameise public override void IstGestorben(TodesArt todesArt)
{
System.Diagnostics.Debug.WriteLine(todesArt.ToString());
}

///

/// Wird in jeder Runde aufgerufen.
///

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]

2 Antworten

  1. Alfons sagt:

    ich brauch das mei ameise mehr drogt des geht aber ned

  2. Nicht aufgeben, ihr kiregt das schon hin, es kann nur besser werden

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.