Chessistics/chessistics-engine/Rules/CollisionDetector.cs

35 lines
985 B
C#
Raw Normal View History

using Chessistics.Engine.Model;
namespace Chessistics.Engine.Rules;
public static class CollisionDetector
{
public static IReadOnlyList<(int PieceIdA, int PieceIdB, Coords Cell)> DetectCollisions(
IReadOnlyList<PieceState> pieces)
{
var collisions = new List<(int, int, Coords)>();
var byCell = new Dictionary<Coords, List<PieceState>>();
foreach (var piece in pieces)
{
if (!byCell.TryGetValue(piece.CurrentCell, out var list))
{
list = [];
byCell[piece.CurrentCell] = list;
}
list.Add(piece);
}
foreach (var (cell, occupants) in byCell)
{
if (occupants.Count < 2) continue;
for (int i = 0; i < occupants.Count; i++)
for (int j = i + 1; j < occupants.Count; j++)
collisions.Add((occupants[i].Id, occupants[j].Id, cell));
}
return collisions;
}
}