作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在做游戏。游戏由一个无限平面组成。单位必须在一个离散的正方形上,因此可以使用简单的 Location { x :: Int, y :: Int }
来定位它们。
可能有很多种Unit
s。有些可能是生物,有些只是物体,例如一 block 石头或木头(想想那里的 2d minecraft)。许多将是空的(只是草或其他)。
你会如何在 Haskell 中建模呢?我已经考虑过执行以下操作,但是 Object vs Creature 呢?他们可能有不同的领域?在 Unit 上将它们全部标准化?
data Unit = Unit { x :: Int, y :: Int, type :: String, ... many shared properties... }
data Location = Location { x :: Int, y :: Int, unit :: Unit }
-- or this
data Location = Location { x :: Int, y :: Int }
data Unit = Unit { unitFields... , location :: Location }
Location
或
Unit
相互继承,并使特定类型的 Unit 相互继承。
最佳答案
Location
只是一个简单的二维Point
类型。
我建议不要绑定(bind) Unit
s 到他们所在的位置;只需使用 Map Location Unit
处理网格上位置之间的 map 以及那里存在什么(如果有的话)。
至于具体类型Unit
去吧,我至少会建议将公共(public)字段分解为数据类型:
data UnitInfo = UnitInfo { ... }
data BlockType = Grass | Wood | ...
data Unit
= NPC UnitInfo AgentID
| Player UnitInfo PlayerID
| Block UnitInfo BlockType
String
对于
Unit
的“类型”是 Haskell 中一个强大的反模式;它通常表明您正在尝试使用数据类型实现动态类型或 OOP 结构,这是不合适的。
String
的情况下在 Haskell 中惯用地实现这种通用性。打字或花哨的类型类黑客,使用函数和数据类型作为抽象的主要单位。当然,前者会给你带来麻烦;很难将函数序列化为 JSON。但是,您可以维护来自 ADT 的 map ,该 map 表示生物或方 block 的“类型”等,以及它的实际实现:
-- records containing functions to describe arbitrary behaviour; see FAQ entry
data BlockOps = BlockOps { ... }
data CreatureOps = CreatureOps { ... }
data Block = Block { ... }
data Creature = Creature { ... }
data Unit = BlockUnit Block | CreatureUnit Creature
newtype GameField = GameField (Map Point Unit)
-- these types are sent over the network, and mapped *back* to the "rich" but
-- non-transferable structures describing their behaviour; of course, this means
-- that BlockOps and CreatureOps must contain a BlockType/CreatureType to map
-- them back to this representation
data BlockType = Grass | Wood | ...
data CreatureType = ...
blockTypes :: Map BlockType BlockOps
creatureTypes :: Map CreatureType CreatureOps
关于haskell - 如何在 Haskell 中建模 2D 世界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8904086/
我是一名优秀的程序员,十分优秀!