SnakeBattleNet.Core.FieldComparer.PossibleDirections C# (CSharp) Method

PossibleDirections() public method

public PossibleDirections ( Fighter self, IEnumerable enemies ) : Direction[]
self Fighter
enemies IEnumerable
return Direction[]
        public Direction[] PossibleDirections(Fighter self, IEnumerable<Fighter> enemies)
        {
            var fighters = enemies as Fighter[] ?? enemies.ToArray();
            var moves = new[]
            {
                Directed.ToNorthFrom(self.Head),
                Directed.ToWestFrom(self.Head),
                Directed.ToEastFrom(self.Head),
                Directed.ToSouthFrom(self.Head),
            };
            var result = new HashSet<Directed>();
            foreach (var move in moves)
            {
                // Empty cells
                if (field[move.X, move.Y] == Content.Empty)
                {
                    result.Add(move);
                    continue;
                }

                // Own tail
                if (self.Body.Count > 1 && self.Tail.X == move.X && self.Tail.Y == move.Y)
                {
                    result.Add(move);
                    continue;
                }

                // Enemy single heads and tails
                foreach (var fighter in fighters)
                {
                    if (fighter.Body.Count == 1 && fighter.Head.X == move.X && fighter.Head.Y == move.Y)
                    {
                        result.Add(move);
                        break;
                    }
                    if (fighter.Tail.X == move.X && fighter.Tail.Y == move.Y)
                    {
                        result.Add(move);
                    }
                }
            }
            return result.Select(_ => _.Direction).ToArray();
        }