如何为VB.NET自然选择模拟中的类实例分配索引?
解决方案:为捕食者/猎物实例添加唯一标识
1. 给类添加唯一ID属性
给OrganismClass和PredatorClass添加只读的唯一实例ID,通过静态计数器自动生成,确保每个实例ID不重复。
方案1:独立实现每个类
Public Class OrganismClass ' 静态计数器,用于生成唯一ID Private Shared _nextId As Integer = 1 ' 实例唯一标识 Public ReadOnly Property InstanceId As Integer Public Sub New() ' 实例化时自动分配ID并递增计数器 InstanceId = _nextId _nextId += 1 End Sub ' 你的其他属性、方法... End Class Public Class PredatorClass Private Shared _nextId As Integer = 1 Public ReadOnly Property InstanceId As Integer Public Sub New() InstanceId = _nextId _nextId += 1 End Sub ' 你的其他属性、方法... End Class
方案2:通过基类复用逻辑(推荐)
如果两个类有共同行为,创建基类封装ID生成逻辑,减少重复代码:
Public MustInherit Class BaseCreature Private Shared _globalNextId As Integer = 1 Public ReadOnly Property InstanceId As Integer Protected Sub New() InstanceId = _globalNextId _globalNextId += 1 End Sub End Class ' 猎物类继承基类 Public Class OrganismClass Inherits BaseCreature ' 你的其他属性、方法... End Class ' 捕食者类继承基类 Public Class PredatorClass Inherits BaseCreature ' 你的其他属性、方法... End Class
2. 碰撞时定位实例并操作
当检测到捕食者与猎物碰撞后,可通过InstanceId快速定位实例,执行删除和子程序:
方式1:通过ID查找索引并删除
' 假设你已获取到碰撞的猎物实例collidedOrganism Dim targetIndex As Integer = Organism.FindIndex(Function(o) o.InstanceId = collidedOrganism.InstanceId) If targetIndex >= 0 Then Organism.RemoveAt(targetIndex) ' 执行碰撞后的子程序,比如捕食者能量增加等 ExecuteCollisionSubroutine(collidedOrganism) End If
方式2:直接移除实例(更简洁)
如果已持有碰撞的猎物实例,可直接从List中移除:
If Organism.Contains(collidedOrganism) Then Organism.Remove(collidedOrganism) ExecuteCollisionSubroutine(collidedOrganism) End If
说明
- 这种方式生成的ID与List的索引无关,不会因为List元素增删导致索引混乱,稳定性更高。
- 静态计数器是类级别的,所有实例共享,确保ID全局唯一(如果用基类方案,所有生物实例的ID都是连续唯一的)。
内容的提问来源于stack exchange,提问作者Khuweyb Mohamud
相关产品推荐
相关产品推荐

