A more efficent way of handling the counter would be wrapping the array in a class with according setter and getter, and accessing the array only via setters and getters.
Type
TUniverseClass = Class
Private
FArray: Array [0 .. 71, 0 .. 45] of Boolean;
FLivingCount: Integer;
function GetXY(X, Y: Integer): Boolean;
procedure SetXY(X, Y: Integer; const Value: Boolean);
Public
Property XYValue[X, Y: Integer]: Boolean Read GetXY Write SetXY;
Property LivingCount: Integer Read FLivingCount;
End;
var
UniverseClass: TUniverseClass;
{ UniverseClass }
function TUniverseClass.GetXY(X, Y: Integer): Boolean;
begin
Result := FArray[X, Y];
end;
procedure TUniverseClass.SetXY(X, Y: Integer; const Value: Boolean);
begin
if FArray[X, Y] <> Value then
if Value then
Inc(FLivingCount)
else
Dec(FLivingCount);
FArray[X, Y] := Value;
end;
// example call
procedure TForm1.Button1Click(Sender: TObject);
begin
UniverseClass.XYValue[0, 0] := true;
Memo1.Lines.Add(IntToStr(UniverseClass.LivingCount));
UniverseClass.XYValue[1, 1] := true;
Memo1.Lines.Add(IntToStr(UniverseClass.LivingCount));
UniverseClass.XYValue[0, 0] := false;
Memo1.Lines.Add(IntToStr(UniverseClass.LivingCount));
end;
initialization
UniverseClass := TUniverseClass.Create;
finalization
UniverseClass.Free;