public override FighterControllerData MakeTurn(Fighter f, List <Fighter> units, string[] eth) { FighterControllerData data = new FighterControllerData(); Write("Begin"); if (f.Dead) { Write("0"); return(data); } Write("1"); Write(f.Location.X); Write(f.Location.Y); Write((int)(f.Angle * 180 / Math.PI)); Write(f.HP); Write(f.Mana); Write(units.Count); for (int j = 0; j < units.Count; j++) { Write(units[j].Location.X); Write(units[j].Location.Y); Write(units[j].Team == f.Team ? 0 : 1); Write(units[j].Letter); Write(units[j].HP); } Write(eth.Length); for (int i = 0; i < eth.Length; i++) { Write(eth[i] == null ? "" : eth[i]); } p.StandardInput.Flush(); // Thread.Sleep(200); Console.WriteLine("Reading..."); try { data.shot = Read() == "1"; data.shotPoint.X = int.Parse(Read()); data.shotPoint.Y = int.Parse(Read()); data.newLocation.X = int.Parse(Read()); data.newLocation.Y = int.Parse(Read()); data.newAngle = double.Parse(Read()) * Math.PI / 180; data.msg = Read(); } catch { throw new Exception("Не могу разобрать ответ программы " + data); } if (data.shot) { data.shot = Rnd.Next(100) < f.Precision; } data.damage = f.Damage; return(data); }
protected override TurnActionInfo <Coordinate2D, Metric2D, int> OnTurn(SubMap <Coordinate2D, Metric2D, int> submap) { List <Fighter> lst = new List <Fighter>(); //foreach(Cell<Coordinate2D, Metric2D, int> c in submap.Cells) foreach (Fighter f in submap.Objects) { if (f == this) { continue; } if (back.CanSee(Location.X, Location.Y, f.Location.X, f.Location.Y, SightLength, Angle, SightAngle)) { lst.Add(f); } } //FighterControllerData move = controller.MakeTurn(this, lst, back.Eth[Team]); FighterControllerData move = controller.MakeTurn(this, lst, ether.Get <string[]>(Team.ToString())); TurnActionInfo <Coordinate2D, Metric2D, int> inf = new TurnActionInfo <Coordinate2D, Metric2D, int>(); if (Dead) { DeadCountDown--; if (DeadCountDown == 0) { Dead = false; inf.hasMoved = true; inf.moveTo = submap.ToLocal(new Coordinate2D(BirthLocation.X, BirthLocation.Y)); } } else { if (move.shot) { if (Mana >= ShotCost) { Mana -= ShotCost; for (int dx = -Radius; dx <= Radius; dx++) { for (int dy = -Radius; dy <= Radius; dy++) { if (back.Inside(move.shotPoint.X + dx, move.shotPoint.Y + dy)) { Cell <Coordinate2D, Metric2D, int> cl = submap.GetCell( submap.ToLocal(new Coordinate2D(move.shotPoint.X + dx, move.shotPoint.Y + dy))); foreach (Fighter f in cl) { f.HP -= move.damage; } } } } } } if (back.CanGo(Location.X, Location.Y, move.newLocation.X, move.newLocation.Y, Speed)) { inf.hasMoved = true; inf.moveTo = submap.ToLocal(new Coordinate2D(move.newLocation.X, move.newLocation.Y)); } else { inf.hasMoved = false; } Angle = move.newAngle; LastEth = move.msg; } return(inf); }