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