Example #1
0
 public void setVisual()
 {
     try
     {
         vc = new VisualClient("localhost", 13579);
     }
     catch (Exception e)
     {
     }
 }
Example #2
0
        /// <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;
                }
            }
        }
Example #3
0
        /// <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));
            }
        }