示例#1
0
 public void ProcessHitResult(HitResults hitResult)
 {
     if (hitResult == HitResults.Hit)
     {
         m_squaresHit.Add(m_lastTarget);
         if (m_tacticsState == Tactics.Random)
         {
             m_tactics = new AfterFirstHitFiring(m_enemyGrid, m_squaresHit[0], m_shipsLeft[0]);
             m_tacticsState = Tactics.AfterFirst;
         }
         else if (m_tacticsState == Tactics.AfterFirst)
         {
             m_tactics = new OrientationalFiring(m_enemyGrid, m_squaresHit.ToArray(), m_shipsLeft[0]);
             m_tacticsState = Tactics.Orientational;
         }
         else
         {
             m_tactics.AddNewHit(m_lastTarget);
         }
     }
     else if (hitResult == HitResults.Sunk)
     {
         m_squaresHit.Add(m_lastTarget);
         m_squaresHit.Sort(((sq1, sq2) => sq1.Row == sq2.Row ? sq1.Column - sq2.Column : sq1.Row - sq2.Row));
         m_enemyGrid.OccupySquares(m_squaresHit.ToArray());
         int shipLength = m_squaresHit.Count;
         m_shipsLeft.Remove(shipLength);
         if (AnyShipLeft())
         {
             m_squaresHit.Clear();
             m_tactics = new RandomFiring(m_enemyGrid, m_shipsLeft[0]);
             m_tacticsState = Tactics.Random;
         }
     }
 }
示例#2
0
        /// <summary>
        /// 是否为有效判定,子类可以重写该方法
        /// </summary>
        /// <param name="hitresult"></param>
        /// <returns></returns>
        public virtual bool IsValidHitResult(HitResults hitresult)
        {
            switch (hitresult)
            {
            case HitResults.Hit300:
            case HitResults.Hit100:
            case HitResults.Hit50:
            case HitResults.HitMiss: return(true);

            default: return(false);
            }
        }
示例#3
0
        public double CalculateHitScore()
        {
            if (!_scoreIsCalculated)
            {
                /*double timeReduction = 1 -  (FlaggedAreaSize()/ (end - start));
                 * double eventsHit = (double)events.Where(x => x.isHit).Count() / events.Count;
                 * score = ((TIME_WEIGHT * timeReduction) * (HIT_WEIGHT * eventsHit)) / (HIT_WEIGHT + TIME_WEIGHT);
                 * _scoreIsCalculated = true;
                 * return score;*/
                HitResults hitResult = CalculateHitResult();

                score = (2 * (hitResult.hits / ((double)hitResult.misses + hitResult.hits)) //Precision
                         * (hitResult.eventHits / ((double)hitResult.eventsTotal)))         //recall
                        / ((hitResult.hits / ((double)hitResult.misses + hitResult.hits))   //Precision
                           + (hitResult.eventHits / ((double)hitResult.eventsTotal)));      //recall
                _scoreIsCalculated = true;
                return(score);
            }
            else
            {
                return(score);
            }
        }
示例#4
0
 public double CalculateCoveredScore()
 {
     if (!_scoreVotingIsCalculated)
     {
         /*double timeReduction = 1 -  (FlaggedAreaSize()/ (end - start));
          * double eventsHit = (double)events.Where(x => x.isHit).Count() / events.Count;
          * score = ((TIME_WEIGHT * timeReduction) * (HIT_WEIGHT * eventsHit)) / (HIT_WEIGHT + TIME_WEIGHT);
          * _scoreIsCalculated = true;
          * return score;*/
         HitResults hitResult = CalculateHitResult();
         double     covered   = FlaggedAreaSize();
         double     totalArea = CalculateTotalNormalArea();
         _scoreVotingIsCalculated = true;
         _coveredScore            = (2 * (hitResult.hits / ((double)hitResult.misses + hitResult.hits)) //Precision
                                     * (1 - (covered / totalArea)))                                     //recall
                                    / ((hitResult.hits / ((double)hitResult.misses + hitResult.hits))   //Precision
                                       + (1 - (covered / totalArea)));                                  //recall
         return(score);
     }
     else
     {
         return(score);
     }
 }
示例#5
0
 public HitResults CalculateHitResult()
 {
     if (!_calculatedHitResult)
     {
         int Hits = 0;
         int EventHits = 0;
         int EventTotal = events.Count;
         int Misses = 0;
         foreach (Events ev in events)
         {
             if (ev.isHit)
             {
                 EventHits++;
             }
         }
         foreach (var pointOfIn in poi.GetFlaggedAreas())
         {
             if (pointOfIn.Item1 > start && pointOfIn.Item2 < end)
             {
                 bool hitted = false;
                 foreach (var ev in events)
                 {
                     if (pointOfIn.Item1 < ev.GetTimestampStart() && ev.GetTimestampEnd() < pointOfIn.Item2)
                     {
                         Hits++;
                         hitted = true;
                         break;
                     }
                     else if (pointOfIn.Item1 >= ev.GetTimestampStart() && pointOfIn.Item2 >= ev.GetTimestampEnd() && pointOfIn.Item1 <= ev.GetTimestampEnd())
                     {
                         Hits++;
                         hitted = true;
                         break;
                     }
                     else if (pointOfIn.Item1 <= ev.GetTimestampStart() && pointOfIn.Item2 <= ev.GetTimestampEnd() && pointOfIn.Item2 >= ev.GetTimestampStart())
                     {
                         Hits++;
                         hitted = true;
                         break;
                     }
                     else if (ev.GetTimestampStart() <= pointOfIn.Item1 && pointOfIn.Item2 <= ev.GetTimestampEnd())
                     {
                         Hits++;
                         hitted = true;
                         break;
                     }
                 }
                 if (hitted == false)
                 {
                     Misses++;
                 }
             }
             _calculatedHitResult = true;
         }
         _hitResult = new HitResults(EventHits, Hits, Misses, EventTotal);
         return _hitResult;
     }
     else
     {
         return _hitResult;
     }
 }
示例#6
0
 public HitResults CalculateHitResult()
 {
     if (!_calculatedHitResult)
     {
         int Hits       = 0;
         int EventHits  = 0;
         int EventTotal = events.Count;
         int Misses     = 0;
         foreach (Events ev in events)
         {
             if (ev.isHit)
             {
                 EventHits++;
             }
         }
         foreach (var pointOfIn in poi.GetFlaggedAreas())
         {
             if (pointOfIn.Item1 > start && pointOfIn.Item2 < end)
             {
                 bool hitted = false;
                 foreach (var ev in events)
                 {
                     if (pointOfIn.Item1 < ev.GetTimestampStart() && ev.GetTimestampEnd() < pointOfIn.Item2)
                     {
                         Hits++;
                         hitted = true;
                         break;
                     }
                     else if (pointOfIn.Item1 >= ev.GetTimestampStart() && pointOfIn.Item2 >= ev.GetTimestampEnd() && pointOfIn.Item1 <= ev.GetTimestampEnd())
                     {
                         Hits++;
                         hitted = true;
                         break;
                     }
                     else if (pointOfIn.Item1 <= ev.GetTimestampStart() && pointOfIn.Item2 <= ev.GetTimestampEnd() && pointOfIn.Item2 >= ev.GetTimestampStart())
                     {
                         Hits++;
                         hitted = true;
                         break;
                     }
                     else if (ev.GetTimestampStart() <= pointOfIn.Item1 && pointOfIn.Item2 <= ev.GetTimestampEnd())
                     {
                         Hits++;
                         hitted = true;
                         break;
                     }
                 }
                 if (hitted == false)
                 {
                     Misses++;
                 }
             }
             _calculatedHitResult = true;
         }
         _hitResult = new HitResults(EventHits, Hits, Misses, EventTotal);
         return(_hitResult);
     }
     else
     {
         return(_hitResult);
     }
 }