예제 #1
0
 private void ObjectDeathFunc(AbstractUnit unit)
 {               // Метод вызываемый через делегат при смерти или съедании объекта. Добавляет объект в список на удаление и останавливает жизненный цикл живущих объектов
     if (unit is IAging && (unit as IAging).Age > 1)
     {
         (unit as IAging).ItsTimeToDie();
     }
     if (!toRemove.Contains(unit))
     {
         toRemove.Add(unit);
     }
 }
예제 #2
0
 public void CheckPosition(AbstractUnit unit)
 {               // Метод, сверяющий координаты входного элемента с координатами всех звеньев змейки
     if (unit.PosX == PosX && unit.PosY == PosY)
     {
         touched.Add(unit, links.Count);
         GetProfit(unit);
     }
     else
     {
         for (int i = 0; i < links.Count; i++)
         {
             if (!touched.ContainsKey(unit))
             {
                 if (unit.PosX == links[i].PosX && unit.PosY == links[i].PosY)
                 {
                     touched.Add(unit, links.Count - i + 1);
                     GetProfit(unit);
                 }
             }
         }
     }
 }
예제 #3
0
        private void GetProfit(AbstractUnit unit)
        {               // Метод реализующий поедание змейкой подобранного элемента если элемент поедаемый (Реализует интерфейс IEatable)
            if (unit is IEatable)
            {
                int profit = (unit as IEatable).GetProfit();

                if (profit == 0)
                {                       // Нулевой профит, сценарий столкновения, змейка меняет направление движения
                    if (direction == 'u' || direction == 'd')
                    {
                        switch (Rand.Get(1, 3))
                        {
                        case 1:
                            direction = 'l'; break;

                        case 2:
                            direction = 'r'; break;
                        }
                    }
                    else
                    {
                        switch (Rand.Get(1, 3))
                        {
                        case 1:
                            direction = 'u'; break;

                        case 2:
                            direction = 'd'; break;
                        }
                    }
                }
                else if (profit > 0)
                {                       // Положительный профит, сценарий подбора нового звена, змейка добавляет к себе количество звеньев указанное в пепременной profit звена.
                    for (int i = 0; i < profit; i++)
                    {
                        links.Add(new SnakeLink(unit.PosX, unit.PosY));
                        stats[0] = stats[0] += 1;
                        setStats(stats);
                    }
                }
                else if (profit < 0)
                {                   // Отрицательный профит, сценарий подбора отравы, змейка кушает микроба и теряет количество звеньев указанное в пепременной profit микроба.
                    for (int i = 0; i < profit * -1; i++)
                    {
                        if (links.Count > 0)
                        {
                            SnakeLink toRemove = links[links.Count - 1];
                            drawBuffer[toRemove.PosY, toRemove.PosX] = ' ';
                            links.Remove(toRemove);
                            stats[1] = stats[1] += 1;
                            setStats(stats);
                        }
                        else
                        {                               // Геймовер если отравлениеи больше чем количество звеньев
                            gameOver();
                        }
                    }
                }
                objectDeath(unit);                      // Съеденый объект умирает
            }
            else
            {                   // Если юнит несъедобный
                gameOver();
            }
        }