private static int CountAliveNeighbours(Matrix <bool> matrix, int x, int y) { var aliveCount = 0; var cubeCoords = HexHelper.ConvertToCube(x, y); var offsetsImplicit = HexHelper.GetOffsetClockwise(); var offsetsDiagonal = HexHelper.GetDiagonalOffsetClockwise(); var offsets = offsetsImplicit.Union(offsetsDiagonal); foreach (var offset in offsets) { var neighbour = cubeCoords + offset; var offsetCoords = HexHelper.ConvertToOffset(neighbour); var nX = offsetCoords.X; var nY = offsetCoords.Y; // Границу мертвым живым соседом. // Сделано, чтобы углы не заполнялись. if (nX >= 0 && nY >= 0 && nX < matrix.Width && nY < matrix.Height) { if (matrix.Items[nX, nY]) { aliveCount++; } } } return(aliveCount); }