【发布时间】:2015-08-26 21:15:01
【问题描述】:
我认为标题说明了一切......但为了完整起见,这里是完整的问题。
问题
所以,我在 Visual Basic/C#/Anything.net 中有一个 2 列数组(矩阵或“网格”),由声明为 Public Matrix(,) As Cell 的 Cell 实例组成。
Cell 大致是这样的:
Class Cell
Public Value as integer
Public Height as integer
Public Tags as Dictionary
Sub New(Optional v As CellType = CellType.Void)
value = v
type = v
End Sub
Function GetPos() as Point
*need arcane necromancy here*
End Sub
End Class
问题很简单,但我知道答案可能不是:我可以不通过构造函数就得到Cell的位置吗?
这是我想要实现的示例(总是给出Public Matrix(,) As Cell):
Dim x,y as integer
Dim apple as Cell = GetARandomAppleFrom(Matrix)
x=apple.GetArrayPos.x
y=apple.GetArrayPos.y
Console.WriteLine(String.Format("An Apple is in {0}, {1}",x,y)
关于这个问题的必要性的附带问题
目前我正在使用以下 sn-p 代码将所有单元格初始化为零值,因为使用 Matrix.Initialize() 失败了,将每个元素设置为空。
如果方法描述说它调用了默认构造函数,那么为什么会失败?
尽管从编码/效率的角度来看,我怀疑我的初始化是否正确,因为我认为双循环并不是那么好......
For x = 0 To Me.zWidth
For y = 0 To Me.zHeight
Matrix.SetValue(New Cell(CellTypes.Void), x, y)
Next
Next
我现在坚持。因此这里有一个
可能的解决方案
这意味着我可以在初始化时将索引传递给 Position 字段 - 通过构造函数 - 像这样......
For x = 0 To Me.zWidth
For y = 0 To Me.zHeight
Matrix.SetValue(New Cell(CellTypes.Void,x,y), x, y)
Next
Next
但是,由于 Cell 可能会改变位置或被覆盖,我希望它的位置是动态确定的。
但是,如果雷达没有更好的结果,我肯定会使用这种方法,然后根据位置变化更新值,
附录
一些可能有用或没用的信息:
- 矩阵大小小于或等于 (512,512)
- 这将成为等距(所以没有 3d,但我已经在单元格中有一个高度变量)游戏的地形数据地图生成器,具有相当小的地图,支持山脉、河流等表面特征,
【问题讨论】:
-
您只有两个选择:(1)将位置传递给 Cell 构造函数(正如您已经提到并被拒绝)或(2)通过搜索容器中的单元格来按需计算位置( O(N) 操作)
-
我的问题是,为什么
GetPos是Cell的方法?你有充分的理由,还是只是因为它对你来说是自然而然的?因为根据我的经验,这些问题实际上相当棘手,并且让它们“正确”有时涉及做出违反直觉的选择。在这种情况下,我认为细胞根本不应该知道自己的位置。你最初是如何获得对单元格的引用的?不管你怎么做,这可能不是一个好主意——而不是存储对单元格的直接引用,你应该遍历矩阵。 -
我正在为一款具有相当小地图的游戏制作地形数据地图生成器原型,并支持山脉、河流等表面特征