public void setVisual() { try { vc = new VisualClient("localhost", 13579); } catch (Exception e) { } }
/// <summary> /// Передвижение с отрисовкой /// </summary> /// <param name="point">Класс, описывающий точку на карте</param> /// <param name="world">Игровой мир</param> /// <param name="game">Константы игры</param> /// <param name="self">Собственный маг</param> /// <param name="move">Управление магом</param> /// <param name="vc">Объект-визуализатор</param> public void goToVisual(Point2D point, World world, Game game, Wizard self, Move move, VisualClient vc) { List <LinePoint> trace = new List <LinePoint>(); trace = getTrace(point, world, game, self); //отрисовываем все отрезки пути до hotZone int iCount = 0; foreach (LinePoint LP in trace) { double myX1; double myY1; if (iCount < 1) { myX1 = self.X; myY1 = self.Y; } else { myX1 = trace.ElementAt(iCount - 1).X; myY1 = trace.ElementAt(iCount - 1).Y; } iCount++; double myX2 = LP.X; double myY2 = LP.Y; vc.Line(myX1, myY1, myX2, myY2, 0.0f, 1.0f, 0.0f); } double angle = self.GetAngleTo(trace[0].X, trace[0].Y); double px = trace[0].X; double py = trace[0].Y; if (trace.Count > 1) { if (isCrash(self) || CheckCrash == 1) { if (Math.Sqrt(Math.Pow(CrashP[0] - self.X, 2) + Math.Pow(CrashP[1] - self.Y, 2)) < CrashDis) { CrashedMove(move, self, game); CheckCrash = 1; } else { CrashP[0] = -1000; CrashP[1] = -1000; angle = self.GetAngleTo(trace[0].X, trace[0].Y); move.Turn = angle; if (Math.Abs(angle) < game.StaffSector / 4.0D) { move.Speed = game.WizardForwardSpeed; } if ((Math.Sqrt(Math.Pow(trace[0].X - self.X, 2) + Math.Pow(trace[0].Y - self.Y, 2))) < 10) { CheckCrash = 0; } } } else { double resX = px - trace[1].Y; double resY = py - trace[1].X; double res = Math.Sqrt(Math.Pow(resX, 2) + Math.Pow(resY, 2)); if (self.GetDistanceTo(trace[0].X, trace[0].Y) < 60) { i = 1; } if (i == 1) { angle = self.GetAngleTo(trace[1].X, trace[1].Y); if (self.GetDistanceTo(trace[0].X, trace[0].Y) >= res / 2) { i = 0; } } else { angle = self.GetAngleTo(trace[0].X, trace[0].Y); } move.Turn = angle; if (Math.Abs(angle) < game.StaffSector / 4.0D) { move.Speed = game.WizardForwardSpeed; } } } else { move.Turn = angle; if (Math.Abs(angle) < game.StaffSector / 4.0D) { move.Speed = game.WizardForwardSpeed; } } }
/// <summary> /// !!! НЕ РЕАЛИЗОВАНО !!! Возвращает координаты самой важной зоны (реализация Овсянникова) /// </summary> /// <param name="world">Игровой мир</param> /// <param name="game">Константы игры</param> /// <param name="self">Собственный маг</param> /// <returns>Точка на двухмерной карте</returns> public Point2D getHotZone2(World world, Game game, Wizard self, VisualClient vc) { //определяеам список возможных зон List <HotZone> hotZones = getZones(world, self); //если список возможных зон не пуст if (hotZones.Count > 0) { double maxHot = 0.0D; Point2D returnPoint = new Point2D(hotZones.ElementAt(0).getX(), hotZones.ElementAt(0).getY()); //расставляем "температуру" каждой зоны foreach (HotZone hZ in hotZones) { double distanceFactor = 0.0D; double allyFactor = 0.0D; double enemyFactor = 0.0D; double allyHPFactor = 0.0D; double enemyHPFactor = 0.0D; //!!! НЕ РЕАЛИЗОВАНО ОПРЕДЕЛЕНИЕ ВЕЛИЧИН РАЗЛИЧНЫХ ФАКТОРОВ !!! foreach (Wizard wz in world.Wizards) //перебираем всех магов { double dist = wz.GetDistanceTo(hZ.getX(), hZ.getY()); //определение дистанции между текущей зоной и магом if (dist > 20 && dist < 600) { if (wz.Faction != self.Faction) { enemyFactor += 216000000.0 * K_enemy - dist * dist * dist * K_enemy; enemyHPFactor += K_enemyHP * (wz.MaxLife / wz.Life - 1); } else { allyFactor -= 216000000.0 * K_ally - dist * dist * dist * K_ally; allyHPFactor -= K_allyHP * (wz.MaxLife / (wz.MaxLife - wz.Life + 1) - 1); } } } foreach (Building build in world.Buildings) //перебираем все здания { double dist = build.GetDistanceTo(hZ.getX(), hZ.getY()); //определение дистанции между текущей зоной и зданием if (dist > 20 && dist < 600) { if (build.Faction != self.Faction) { enemyFactor += 2.0 * (216000000.0 * K_enemy - dist * dist * dist * K_enemy); enemyHPFactor += 2.3 * K_enemyHP * (build.MaxLife / build.Life - 1); } else { allyFactor -= 2.0 * (216000000.0 * K_ally - dist * dist * dist * K_ally); allyHPFactor -= 2.3 * K_allyHP * (build.MaxLife / (build.MaxLife - build.Life + 1) - 1); } } } foreach (Minion minion in world.Minions) //перебираем всех миньонов { double dist = minion.GetDistanceTo(hZ.getX(), hZ.getY()); //определение дистанции между текущей зоной и миньоном if (dist > 20 && dist < 600) { if (minion.Faction != self.Faction) { enemyFactor += 0.05 * (216000000.0 * K_enemy - dist * dist * dist * K_enemy); enemyHPFactor += 0.005 * K_enemyHP * (minion.MaxLife / minion.Life - 1); } else { allyFactor -= 0.05 * (216000000.0 * K_ally - dist * dist * dist * K_ally); allyHPFactor -= 0.005 * K_allyHP * (minion.MaxLife / (minion.MaxLife - minion.Life + 1) - 1); } } } double dist2 = self.GetDistanceTo(hZ.getX(), hZ.getY()); if (dist2 > 100) { distanceFactor = K_distance * (3000 / dist2); } hZ.hot = distanceFactor + allyFactor + enemyFactor + allyHPFactor + enemyHPFactor; if (vc != null) { vc.Text(hZ.getX(), hZ.getY(), Convert.ToString(hZ.hot), 1.0f, 0.0f, 0.0f); } } //выбираем зону с максимальной "температурой" foreach (HotZone hZ in hotZones) { if (hZ.hot > maxHot) { maxHot = hZ.hot; returnPoint = new Point2D(hZ.getX(), hZ.getY()); } } if (vc != null) { vc.Line(returnPoint.getX(), returnPoint.getY(), self.X, self.Y, 0.0f, 0.0f, 0.0f); } return(returnPoint); } else { //иначе, вызываем метод Литвинова return(getHotZone(world, game, self)); } }