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); } }
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); } } } } }
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(); } }