private void MoveToBonus(Tank self, World world, Move move) { double distanceToBonus = double.MaxValue; Bonus selectedBonus = null; foreach (Bonus bonus in world.Bonuses) { double distance = self.GetDistanceTo(bonus); if (distance < distanceToBonus) { distanceToBonus = distance; selectedBonus = bonus; } } if (selectedBonus == null) return; double angle = self.GetAngleTo(selectedBonus); double absAngle = Math.Abs(angle); if (absAngle < Const.MIN_ANGLE) // move forward { move.LeftTrackPower = 1.0d; move.RightTrackPower = 1.0d; } else if (absAngle > Math.PI - Const.MIN_ANGLE) // move back { move.LeftTrackPower = -1.0d; move.RightTrackPower = -1.0d; } else if (absAngle > Const.HALF_PI - Const.MIN_ANGLE && absAngle < Const.HALF_PI + Const.MIN_ANGLE) // turn { move.LeftTrackPower = 1.0d; move.RightTrackPower = -1.0d; } else if (absAngle < Const.HALF_PI) { move.LeftTrackPower = 1.0d; move.RightTrackPower = 1.0d - absAngle * 2d; if (angle < 0.0d) { var tmp = move.LeftTrackPower; move.LeftTrackPower = move.RightTrackPower; move.RightTrackPower = tmp; } } else // if (absAngle > HALF_PI) { move.LeftTrackPower = -1.0d; move.RightTrackPower = -1.0d - absAngle * 2d; if (angle < 0.0d) { var tmp = move.LeftTrackPower; move.LeftTrackPower = move.RightTrackPower; move.RightTrackPower = tmp; } } }
private void Go(Tank self, double x, double y) { double angle = self.GetAngleTo(x, y); // Если слишком близко к цели (то есть с точностью до размера танка уже на ней) if (self.GetDistanceTo(x, y) < self.Width * 0.7) return; bool reverse = false; if (Math.Abs(angle) > Angle[90]) { reverse = true; angle = NewAngle(angle); } if (world.Tick < 200) { if (angle > Angle[30]) { // если угол сильно положительный, SetMove(1, -1); } else if (angle < -Angle[30]) { // если угол сильно отрицательный, SetMove(-1, 1); } else { SetMove(1, 1); } } else { if (angle > 0) SetMove(1, Math.Cos(angle)); else SetMove(Math.Cos(angle), 1); if (self.GetDistanceTo(x, y) < self.Width * 5) { if (move.LeftTrackPower < 0.8) move.LeftTrackPower = -1; if (move.RightTrackPower < 0.8) move.RightTrackPower = -1; } } if (reverse) { SetMove(-move.RightTrackPower, -move.LeftTrackPower); } }