/// <summary> /// If the ant has no assigned tasks, it waits for new tasks. This method /// is called to inform you that it is waiting. /// Read more: "http://wiki.antme.net/en/API1:Waiting" /// </summary> public override void Waiting() { if (CurrentLoad > 5) { if (DistanceToAnthill > 20) { TurnToDetination(hill); GoForward(DistanceToAnthill - 10); } else GoToAnthill(); return; } if (timera == null) timera = this; if (hill == null) { GoToAnthill(); hill = Destination as Anthill; Stop(); } if (Caste == "north") { if (Direction != 270) TurnToDirection(270); if (!absolute[0]) GoForward(); else GoForward(50); return; } if (Caste == "east") { if (Direction != 0) TurnToDirection(0); if (!absolute[1]) GoForward(); else GoForward(50); if (!absolute[2]) GoForward(); else GoForward(50); return; } if (Caste == "south") { if (Direction != 90) TurnToDirection(90); if (!absolute[2]) GoForward(); else GoForward(50); return; } if (Caste == "west") { if (Direction != 180) TurnToDirection(180); if (!absolute[3]) GoForward(); else GoForward(50); return; } if (Caste == "fighter2" && !IsTired && spotted) { double distance, direction, x, y; getcordsa(DistanceToAnthill, Coordinate.GetDegreesBetween(this, hill), out x, out y); getdistance(x, y, basex, basey, out distance); if (distance > 50) { getdirection(x, y, basex, basey, out direction); TurnToDirection(Convert.ToInt32(direction)); GoForward(Convert.ToInt32(distance)); Think("Infiltrieren"); return; } else { } } if (IsTired && (Caste != "sugar" || (CurrentLoad > MaximumLoad / 10)) && (Caste != "fighter2" || !spotted)) { if (DistanceToAnthill > 10) { if (Direction != Coordinate.GetDegreesBetween(this, hill)) TurnToDetination(hill); GoForward(DistanceToAnthill - 5); } else GoToDestination(hill); return; } if (Caste == "searcher") { int distance = 0; double x, y, lx, ly, direction, distanz, angle; distance = (searcher.IndexOf(this)) * Viewrange + Viewrange; getcordsa(DistanceToAnthill, Coordinate.GetDegreesBetween(this, hill), out x, out y); if (distance == 0) { Think("ERROR"); GoToDestination(hill); return; } if (DistanceToAnthill < distance - 20) { bool alle = true; Think("falsch"); if (DistanceToAnthill > 5) { Think("korrigiere" + Convert.ToInt32(distance) + " " + DistanceToAnthill); if (x > 0) { if (y > 0) { angle = 135; } else { angle = 225; } } else { if (y > 0) { angle = 45; } else { angle = 315; } } getcordsa(distance, angle, out lx, out ly); getdirection(x, y, lx, ly, out direction); getdistance(x, y, lx, ly, out distanz); TurnToDirection(Convert.ToInt32(direction)); GoForward(Convert.ToInt32(distanz) - 10); return; } else { int rd = 0; Think("richte aus"); for (int i = 0; i < 4; i++) { if (!absolute[i]) { if (Direction != 45) TurnToDirection(45); alle = false; rd = 1; } } if (alle) { double distanceh; getdistance(x, y, basex, basey, out distanceh); if (entfernung[0] > entfernung[2]) { if (entfernung[1] > entfernung[3]) { if (Direction != 315) TurnToDirection(315); rd = 0; } else { if (Direction != 225) TurnToDirection(225); rd = 3; } } else { if (entfernung[1] > entfernung[3]) { if (Direction != 45) TurnToDirection(45); rd = 1; } else { if (Direction != 135) TurnToDirection(135); rd = 2; } } } if (alle || time > 13000) GoForward(distance); } return; } else { Think("aufgestellt" + distance); bool r = false; if (searcher.IndexOf(this) % 2 == 0) r = true; if (Coordinate.GetDegreesBetween(this, hill) >= 210 && Coordinate.GetDegreesBetween(this, hill) <= 240) { if (r) { if (Direction != 270) TurnToDirection(270); } else if (Direction != 180) TurnToDirection(180); GoForward(Convert.ToInt32(DistanceToAnthill * 1.15 / 0.70710678118)); return; } else if (Coordinate.GetDegreesBetween(this, hill) >= 120 && Coordinate.GetDegreesBetween(this, hill) <= 150) { if (r) { if (Direction != 180) TurnToDirection(180); } else if (Direction != 90) TurnToDirection(90); GoForward(Convert.ToInt32(DistanceToAnthill * 1.15 / 0.70710678118)); return; } else if (Coordinate.GetDegreesBetween(this, hill) >= 30 && Coordinate.GetDegreesBetween(this, hill) <= 60) { if (r) { if (Direction != 90) TurnToDirection(90); } else if (Direction != 0) TurnToDirection(0); GoForward(Convert.ToInt32(DistanceToAnthill * 1.15 / 0.70710678118)); return; } else if (Coordinate.GetDegreesBetween(this, hill) >= 300 && Coordinate.GetDegreesBetween(this, hill) <= 330) { if (r) { if (Direction != 0) TurnToDirection(0); } else if (Direction != 270) TurnToDirection(270); GoForward(Convert.ToInt32(DistanceToAnthill * 1.15 / 0.70710678118)); return; } else { Think("falsch"); if (DistanceToAnthill > 5) { Think("korrigiere" + Coordinate.GetDegreesBetween(this, hill)); getcordsa(DistanceToAnthill, Coordinate.GetDegreesBetween(this, hill), out x, out y); if (x > 0) { if (y > 0) { angle = 135; } else { angle = 225; } } else { if (y > 0) { angle = 45; } else { angle = 315; } } getcordsa(distance, angle, out lx, out ly); getdirection(x, y, lx, ly, out direction); getdistance(x, y, lx, ly, out distanz); TurnToDirection(Convert.ToInt32(direction)); GoForward(Convert.ToInt32(distanz) - 10); return; } else { bool alle = true; Think("richte aus"); for (int i = 0; i < 4; i++) { if (!absolute[i]) { if (Direction != 45) TurnToDirection(45); alle = false; } } if (alle) { if (entfernung[0] > entfernung[2]) { if (entfernung[1] > entfernung[3]) { if (Direction != 315) TurnToDirection(315); } else { if (Direction != 225) TurnToDirection(225); } } else { if (entfernung[1] > entfernung[3]) { if (Direction != 45) TurnToDirection(45); } else { if (Direction != 135) TurnToDirection(135); } } } GoForward(distance); return; } } } } else if (Caste == "star") { int that = 0; for (int i = 1; i < 20; i++) { if (stars[i] == Ameisenliste.IndexOf(this)) { that = i; } } if (DistanceToAnthill > 5 && (Caste != "sugar" || (CurrentLoad < MaximumLoad / 10)) && (Caste != "fighter2" || !spotted)) { Think("back"); if (DistanceToAnthill > 10) { if (Direction != Coordinate.GetDegreesBetween(this, hill)) TurnToDetination(hill); GoForward(DistanceToAnthill - 5); } else GoToDestination(hill); return; } else { if (Direction != (359 / 8) * that) TurnToDirection((359 / 8) * that); GoForward(Convert.ToInt32(Range / 2.1)); Think("Ich bin ein Star!"); return; } } if (hill == null) { GoToAnthill(); hill = Destination as Anthill; Stop(); } if (IsTired && (Caste != "sugar" || (CurrentLoad < MaximumLoad / 10)) && (Caste != "fighter2" || !spotted)) { if (DistanceToAnthill > 10) { if (Direction != Coordinate.GetDegreesBetween(this, hill)) if (Direction != Coordinate.GetDegreesBetween(this, hill)) TurnToDetination(hill); GoForward(DistanceToAnthill - 5); } else GoToDestination(hill); return; } else if (Caste != "sugar" || CurrentLoad < MaximumLoad / 10 && CarryingFruit == null) { if (Coordinate.GetDistanceBetween(this, hill) < 10) TurnToDirection(norandom); norandom += 5; GoForward(50); } if (wirdangegriffen[Ameisenliste.IndexOf(this)] != 0) { for (int i = 0; i < 300; i++) { if (verfugbar[i, 0] == wirdangegriffen[Ameisenliste.IndexOf(this)]) { Think(i + "Vergessen weil unbeschäftigt"); aimedbug[i] = null; for (int u = 2; u < 300; u++) { verfugbar[i, u] = 0; } verfugbar[i, 1] = 0; verfugbar[i, 0] = 0; aimedposition[i, 0] = 0; aimedposition[i, 1] = 0; } } wirdangegriffen[Ameisenliste.IndexOf(this)] = 0; } if (Caste == "fighter" || Caste == "fighter3") { if (Coordinate.GetDistanceBetween(this, hill) < 20) TurnByDegrees(RandomNumber.Number(360)); GoForward(40); for (int i = 0; i < 300; i++) { for (int u = 2; u < 300; u++) { if (verfugbar[i, u] == Ameisenliste.IndexOf(this) && aimedbug[i] != null && (Caste != "sugar" || (CurrentLoad < MaximumLoad / 10 || Direction != Coordinate.GetDegreesBetween(this, hill))) && (Caste != "fighter2" || !spotted)) { if (!IsTired && WalkedRange < Range / 3) Attack(aimedbug[i]); else GoToDestination(hill); return; } } } int ld = 1000000; int angriff = 0; for (int i = 0; i < 300; i++) { if (aimedbug[i] != null) if (Coordinate.GetDistanceBetween(aimedbug[i], hill) < ld && verfugbar[i, 1] < 15) { ld = Coordinate.GetDistanceBetween(aimedbug[i], hill); angriff = i; } } if (aimedbug[angriff] != null && verfugbar[angriff, 1] < 15 && !IsTired) for (int i = 2; i < 300; i++) { if (verfugbar[angriff, i] == 0 && (Caste != "sugar" || (CurrentLoad < MaximumLoad / 10)) && (Caste != "fighter2" || !spotted)) { verfugbar[angriff, i] = Ameisenliste.IndexOf(this); verfugbar[angriff, 1]++; if (!IsTired && WalkedRange < Range / 3) Attack(aimedbug[angriff]); else GoToDestination(hill); Think("Angriff" + angriff); return; } } } if (Caste == "sugar") { double x, y; double direction, distance; int nearest = 0; double lowestdistance = 3000000000000000; getcordsa(Coordinate.GetDistanceBetween(this, hill), Coordinate.GetDegreesBetween(this, hill), out x, out y); for (int i = 0; i < 4; i++) { if (zucker[i] != null) { distance = Coordinate.GetDistanceBetween(this, zucker[i]); if (distance < lowestdistance && distance < Range / 3) { lowestdistance = distance; nearest = i; } } } if (lowestdistance < this.Range / 3 && zucker[nearest] != null) { if (unterwegs[nearest, 1] * MaximumLoad < zucker[nearest].Amount * 1.8 && CurrentLoad < MaximumLoad / 10) { if (Coordinate.GetDistanceBetween(this, zucker[nearest]) > 2 && Range - WalkedRange - Coordinate.GetDistanceBetween(this, zucker[nearest]) > Range * 2 / 3 && !IsTired && (Caste != "sugar" || (CurrentLoad < MaximumLoad / 10))) { if (Direction != Coordinate.GetDegreesBetween(this, zucker[nearest])) TurnToDetination(zucker[nearest]); GoForward(Convert.ToInt32(Coordinate.GetDistanceBetween(this, zucker[nearest]) / 1.1)); return; } else if (Range - WalkedRange - Coordinate.GetDistanceBetween(this, zucker[nearest]) > Range * 2 / 3 && !IsTired) GoToDestination(zucker[nearest]); } else if (CurrentLoad < MaximumLoad / 10 && Range - WalkedRange - Coordinate.GetDistanceBetween(this, zucker[nearest]) > Range * 2 / 3 && !IsTired) { for (int i = 0; i < 4; i++) { if (zucker[i] != null) { int distanz = Convert.ToInt32(Coordinate.GetDistanceBetween(this, zucker[i])); if (zucker[i] != null && Range - WalkedRange - distanz > Range * 2 / 3) { TurnToDetination(zucker[i]); GoForward(distanz); return; } } } if (Direction != Coordinate.GetDegreesBetween(this, zucker[nearest])) TurnToDetination(zucker[nearest]); GoForward(Coordinate.GetDistanceBetween(this, (zucker[nearest])) / 2); } for (int i = 0; i < 4; i++) { if (zucker[nearest].Id == unterwegs[i, 0]) { for (int u = 2; u < 100; u++) { if (unterwegs[i, u] == Ameisenliste.IndexOf(this)) break; else if (unterwegs[i, u] == 0) { unterwegs[i, u] = Ameisenliste.IndexOf(this); unterwegs[i, 1]++; break; } } } } } else { if (Coordinate.GetDistanceBetween(this, hill) < 20) { TurnToDirection(RandomNumber.Number(180)); GoForward(50); } } } else if (Caste == "default" && CarryingFruit == null) { for (int i = 0; i < 10; i++) { for (int u = 2; u < 10; u++) { if (apfelliste[i, u] == Ameisenliste.IndexOf(this) && apple[i] != null && Range - WalkedRange - Coordinate.GetDistanceBetween(this, apple[i]) > Range * 2 / 3) { if (Coordinate.GetDistanceBetween(this, apple[i]) > 20) { if (Direction != Coordinate.GetDegreesBetween(this, apple[i])) TurnToDetination(apple[i]); GoForward(Coordinate.GetDistanceBetween(this, apple[i]) - 10); } else GoToDestination(apple[i]); return; } } if ((apfelliste[i, 0] != 0 || apfelliste[i, 1] != 0) && apfelliste[i, 1] < 5 && apple[i] != null && Range - WalkedRange - Coordinate.GetDistanceBetween(this, apple[i]) > Range * 2 / 3) { apfelliste[i, 1]++; for (int u = 2; u < 10; u++) { if (apfelliste[i, u] == 0) { apfelliste[i, u] = Ameisenliste.IndexOf(this); if (Coordinate.GetDistanceBetween(this, apple[i]) > 20) { if (Direction != Coordinate.GetDegreesBetween(this, apple[i])) TurnToDetination(apple[i]); GoForward(Coordinate.GetDistanceBetween(this, apple[i]) - 10); } else GoToDestination(apple[i]); break; } } } } } else if (Caste == "stand" && (Caste != "fighter2" || !spotted)) { if (DistanceToAnthill > 10) { if (Direction != Coordinate.GetDegreesBetween(this, hill)) TurnToDetination(hill); GoForward(DistanceToAnthill - 5); } else GoToDestination(hill); return; } else if ((Caste != "sugar" || (CurrentLoad < MaximumLoad / 10))) { if (Coordinate.GetDistanceBetween(this, hill) < 10) TurnToDirection(norandom); norandom += 5; GoForward(50); } if (DistanceToAnthill > 10 && Caste != "fighter2" && false) GoToAnthill(); else if (CurrentLoad < 5 && CarryingFruit == null) { if (Coordinate.GetDistanceBetween(this, hill) < 10) TurnToDirection(norandom); norandom += 5; GoForward(50); } }
/// <summary> /// This method is called in every simulation round, regardless of additional /// conditions. It is ideal for actions that must be executed but that are not /// addressed by other methods. /// Read more: "http://wiki.antme.net/en/API1:Tick" /// </summary> public override void Tick() { if (norandom > 360) norandom -= 360; if (timera == null) timera = this; if (Caste == "fighter2" && spotted) { double distance, x, y; getcordsa(DistanceToAnthill, Coordinate.GetDegreesBetween(this, hill), out x, out y); getdistance(x, y, basex, basey, out distance); if (distance > 50) { } else if (!(Destination is Ant) && Destination == null && CurrentSpeed > 2) { Stop(); } } if (verfolgen != null) if (verfolgen.CurrentEnergy < verfolgen.MaximumEnergy / 2 || time - lastv > 20000) verfolgen = null; if (verfolgen != null && !spotted) Think("verfolge..."); if (verfolgen != null) if ((verfolgen.CurrentLoad < verfolgen.MaximumLoad / 5 && verfolgen.CarriedFruit == null) && !spotted) { double xm, ym, xtm, ytm, x, y; getcordsa(DistanceToAnthill, Coordinate.GetDegreesBetween(this, hill), out xm, out ym); getcordsa(Coordinate.GetDistanceBetween(verfolgen, this), Coordinate.GetDegreesBetween(verfolgen, this), out xtm, out ytm); x = xm + xtm; y = ym + ytm; basex = x; basey = y; if (Caste == "fighter2") { TurnToDetination(verfolgen); GoForward(Coordinate.GetDistanceBetween(this, verfolgen)); Think("Infiltriere"); } Think("gefunden; X:" + Convert.ToInt32(x) + " Y: " + Convert.ToInt32(y)); spotted = true; verfolgen = null; } if (Caste == "fighter2" && spotted) return; double xt, yt; getcordsa(DistanceToAnthill, Coordinate.GetDegreesBetween(this, hill), out xt, out yt); if (Caste == "star") Think("star"); if (hill == null) { GoToAnthill(); hill = Destination as Anthill; Stop(); } if (this == timera) { time += 50; } if (Caste == "star") return; if (Caste == "north") { if (DistanceToAnthill > entfernung[0]) { entfernung[0] = DistanceToAnthill; } else if (DistanceToAnthill < entfernung[0] - 5) absolute[0] = true; Think(entfernung[0].ToString() + absolute[0]); if (DistanceToAnthill == 0 && Direction != 270) { if (Direction != 270) TurnToDirection(270); if (!absolute[0]) GoForward(); else GoForward(50); } return; } if (Caste == "east") { if (DistanceToAnthill > entfernung[1]) { entfernung[1] = DistanceToAnthill; } else if (DistanceToAnthill < entfernung[1] - 5) absolute[1] = true; Think(entfernung[1].ToString() + absolute[1]); if (DistanceToAnthill == 0 && Direction != 0) { if (Direction != 0) TurnToDirection(0); if (!absolute[1]) GoForward(); else GoForward(50); } return; } if (Caste == "south") { if (DistanceToAnthill > entfernung[2]) { entfernung[2] = DistanceToAnthill; } else if (DistanceToAnthill < entfernung[2] - 5) absolute[2] = true; Think(entfernung[2].ToString() + absolute[2]); if (DistanceToAnthill == 0 && Direction != 90) { if (Direction != 90) TurnToDirection(90); if (!absolute[2]) GoForward(); else GoForward(50); } return; } if (Caste == "west") { if (DistanceToAnthill >= entfernung[3]) { entfernung[3] = DistanceToAnthill; } else if (DistanceToAnthill < entfernung[3] - 5) absolute[3] = true; Think(entfernung[3].ToString() + absolute[3]); if (DistanceToAnthill == 0 && Direction != 180) { if (Direction != 180) TurnToDirection(180); if (!absolute[3]) GoForward(); else GoForward(50); } return; } for (int i = 0; i < 100; i++) { if (hill == null) { GoToAnthill(); hill = Destination as Anthill; Stop(); } double x, y, direction, distance; getcordsa(DistanceToAnthill, Coordinate.GetDegreesBetween(this, hill), out x, out y); } if (hill == null) { GoToAnthill(); hill = Destination as Anthill; Stop(); } if (Destination is Bug) { for (int i = 0; i < aimedbug.Length; i++) { if (Destination == aimedbug[i]) { break; } else if (i == aimedbug.Length - 1 || aimedbug[i] == null && (Caste != "sugar" || (CurrentLoad < MaximumLoad / 10)) && (Caste != "fighter2" || !spotted)) { GoToDestination(hill); return; } } } else if (Caste == "fighter" && (Caste != "fighter2" || !spotted) && (IsTired || WalkedRange > Range / 3 || DistanceToAnthill > (Range - WalkedRange) / 1.5) && (Caste != "sugar" || (CurrentLoad < MaximumLoad / 10)) && (Caste != "fighter2" || !spotted)) { if (DistanceToAnthill > 10) { if (Direction != Coordinate.GetDegreesBetween(this, hill)) TurnToDetination(hill); GoForward(DistanceToAnthill - 5); } else GoToDestination(hill); return; } if (Caste == "fighter" && (Caste != "fighter2" || !spotted) && (IsTired || WalkedRange > Range / 3 || DistanceToAnthill > (Range - WalkedRange) / 1.5) && (Destination == null || !(Destination is Bug)) && (Caste != "sugar" || (CurrentLoad < MaximumLoad / 10)) && (Caste != "fighter2" || !spotted)) { if (DistanceToAnthill > 10) { if (Direction != Coordinate.GetDegreesBetween(this, hill)) TurnToDetination(hill); GoForward(DistanceToAnthill - 5); } else GoToDestination(hill); return; } if ((((Caste != "fighter" && (Caste != "fighter2" || !spotted)) || Destination == null && Caste != "fighter")) && IsTired && (Caste != "sugar" || (CurrentLoad < MaximumLoad / 10)) && (Caste != "fighter2" || !spotted) && (Caste != "sugar" || (CurrentLoad < MaximumLoad / 10))) { if (DistanceToAnthill > 10) { if (Direction != Coordinate.GetDegreesBetween(this, hill)) TurnToDetination(hill); GoForward(DistanceToAnthill - 5); } else { GoToDestination(hill); } return; } if (hill != null) { for (int i = 0; i < 300; i++) { double distance, x, y; getcordsa(Coordinate.GetDistanceBetween(this, hill), Coordinate.GetDegreesBetween(this, hill), out x, out y); getdistance(x, y, aimedposition[i, 0], aimedposition[i, 1], out distance); if ((time - lastact[i] > 10000) && aimedbug[i] != null) { Think(i + "vergessen " + Convert.ToInt32(distance)); aimedbug[i] = null; for (int u = 2; u < 300; u++) { verfugbar[i, u] = 0; } verfugbar[i, 1] = 0; verfugbar[i, 0] = 0; aimedposition[i, 0] = 0; aimedposition[i, 1] = 0; wirdangegriffen[Ameisenliste.IndexOf(this)] = 0; } } } if (hill == null) { GoToAnthill(); hill = Destination as Anthill; Stop(); } if (CarryingFruit != null && DistanceToAnthill < 20) { Think("Aha"); for (int i = 0; i < 10; i++) { if (apple[i] == CarryingFruit) { Think("weg"); apple[i] = null; for (int u = 0; u < 10; u++) { apfelliste[i, u] = 0; } } } } for (int i = 0; i < 10; i++) { if (apple[i] != null) if (time - lastacta[i] > 1000 || apple[i].Amount == 0) { Think("weg"); apple[i] = null; for (int u = 0; u < 10; u++) { apfelliste[i, u] = 0; } } } if (CarryingFruit != null) { for (int i = 0; i < 10; i++) { if (apple[i] == CarryingFruit) { Think(apfelliste[i, 1].ToString()); lastacta[i] = time; break; } } } if (Caste == "fighter" && Destination == null) { } for (int i = 0; i < 4; i++) { if (zucker[i] != null) if (zucker[i].Amount == 0) { Think("gelöscht"); zucker[i] = null; for (int u = 0; u < 100; u++) { unterwegs[i, u] = 0; } aimedsugar[i, 0] = 3000000; aimedsugar[i, 1] = 3000000; } } if (CarryingFruit != null && Direction != Coordinate.GetDegreesBetween(this, hill)) { TurnToDetination(hill); if (DistanceToAnthill > 20) GoForward(DistanceToAnthill - 10); else GoToAnthill(); } }
/// <summary> /// Every time that a new ant is born, its job group must be set. You can /// do so with the help of the value returned by this method. /// Read more: "http://wiki.antme.net/en/API1:ChooseCaste" /// </summary> /// <param name="typeCount">Number of ants for every caste</param> /// <returns>Caste-Name for the next ant</returns> public override string ChooseCaste(Dictionary<string, int> typeCount) { if (timera == null) timera = this; if (hill == null) { GoToAnthill(); hill = Destination as Anthill; Stop(); } Ameisenliste.Add(this); int r = RandomNumber.Number(0, 20); bool alle = true; for (int i = 0; i < 4; i++) { if (!absolute[i]) { alle = false; } } for (int i = 0; i < 4; i++) { if (spawned[i] < 1) { spawned[i]++; if (i == 0) return "south"; else if (i == 1) return "west"; else if (i == 2) return "north"; else if (i == 3) return "east"; } } if (searcher.Count < 8) { searcher.Add(this); listda = true; return "searcher"; } if (stars[0] < 0) { stars[0]++; for (int i = 1; i < 20; i++) { if (stars[i] == 0) { stars[i] = Ameisenliste.IndexOf(this); break; } } return "star"; } if (r < 0) return "stand"; else if (r < 8) return "default"; else if (r < 19) return "sugar"; else if (r < 20) return "fighter2"; else if (r < 20) return "fighter"; else return "fighter3"; }