private bool isAHexagon(MatchContext context)
 {
     var points = context.Coordinates.ToList();
     return points[0].Position == points[2].Position
            && points[4].Position == (points[2].Position +  (points[4].Level - points[2].Level))
            && points[3].Position == points[5].Position;
 }
        private bool isATriangle(MatchContext context)
        {
            var points = context.Coordinates.ToList();

            return (points[0].Position == points[1].Position && points[1].Level == points[2].Level)
                   || (points[1].Position == points[2].Position && points[0].Level == points[1].Level);
        }
 protected override bool MatchesShape(MatchContext context)
 {
     return hasPointCount(context, 4) && hasParallelSidesOfTheSameSize(context);
 }
 private bool hasParallelSidesOfTheSameSize(MatchContext context)
 {
     var points = context.Coordinates.ToList();
     return points[1].Position - points[0].Position == points[3].Position - points[2].Position
            || points[2].Level - points[0].Level == points[3].Level - points[1].Level;
 }
 protected override bool MatchesShape(MatchContext context)
 {
     return hasPointCount(context, 6) && isAHexagon(context);
 }
 protected abstract bool MatchesShape(MatchContext context);
 protected bool hasPointCount(MatchContext context, int count)
 {
     return context.Coordinates.Count() == count;
 }
 protected override bool MatchesShape(MatchContext context)
 {
     return hasPointCount(context, 3) && isATriangle(context);
 }