Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何用OCAML在函数式编程概念中为我的游戏项目建模?_Oop_Functional Programming_Ocaml - Fatal编程技术网

Oop 如何用OCAML在函数式编程概念中为我的游戏项目建模?

Oop 如何用OCAML在函数式编程概念中为我的游戏项目建模?,oop,functional-programming,ocaml,Oop,Functional Programming,Ocaml,我目前正在做一个视频游戏的项目,具体来说,是OCAML中基于回合的策略。这是一门关于函数式编程的课程,所以函数式编程越多越好,但是如果我不能用函数式编程,如果真的需要,我可以使用OOP 以下是我的基本游戏模型: 在下面,当我说type时,我实际上是指instance/type/module,也就是说,我不知道应该如何实现它,但我知道它们至少应该打包成不同的部分 将有一个Main类型。它的作用是在菜单、设置和实际游戏之间切换 Game类型将运行游戏。在上下文中,它将迭代游戏的每个阵营,并在阵营内迭

我目前正在做一个视频游戏的项目,具体来说,是OCAML中基于回合的策略。这是一门关于函数式编程的课程,所以函数式编程越多越好,但是如果我不能用函数式编程,如果真的需要,我可以使用OOP

以下是我的基本游戏模型:

在下面,当我说
type
时,我实际上是指
instance/type/module
,也就是说,我不知道应该如何实现它,但我知道它们至少应该打包成不同的部分

将有一个
Main
类型。它的作用是在菜单、设置和实际游戏之间切换

Game
类型将运行游戏。在上下文中,它将迭代游戏的每个
阵营
,并在
阵营
内迭代该阵营拥有的每个
单位
。每个
单元
都有一个特定的行为

每个游戏对象(可以在2D屏幕中渲染)都将具有
GameObject
类型。理想情况下,我可以附加一组视频/音频/等渲染器,这样我就能知道它们在地图上的位置

网格
将是由
平铺
组成的数组<代码>网格具有游戏的全局视图,例如,从
网格
,我可以知道
游戏中每个
游戏对象
的位置

平铺
是网格上的平铺。最后,我希望它们具有特殊功能,例如,地形类型

单元
(不要与OCAML中的
单元
类型混淆)是一个由
派别
控制的实体。它有很多属性,比如生命值、法力、力量等。。。并且可以根据他们是谁来做某些动作

派系
代表玩家或对手之一。根据阵营的不同,会有一些奖励。e、 一个派系可以有更大的健康,但较低的力量,反之亦然

动作
是一种表示动作的类型。它具有源和目标属性。它可以代表任何类型的动作,从自愈到AOE法术。它可以访问
游戏
,这样它就可以在
游戏
中随心所欲地做任何事情

我的目标是制作一个可以逐步改进的游戏模型。例如,我想创建单位的子类,那些可以从远处攻击的,以及那些只能在近战中攻击的等等

如果这是一个面向对象的项目,那么它将非常简单,尽管如果我理解前面的评论,效率会很低。正如你所看到的,我的思维方式偏向于OOP,因为没有OOP,我没有做过任何这样规模的项目。我的目标是在函数式编程中实现它

我需要你的建议,告诉我如何实现我所描述的,或者其中的一部分,这样我就可以自己解决剩下的问题了

多谢各位

编辑:编辑整个问题
EDIT2:一些拼写和反勾号

你的问题充满了命令式和面向对象的习惯用法:迭代、数组、对象、子类。。。所以你的心态似乎已经决定了

这并不奇怪,因为GUI和游戏是OOP最明显的例子。它们有状态,随着时间的推移而变异,并在遗传的基础上茁壮成长。虽然你可以在功能上做这些事情,用函子或者一级模块,但我认为这不值得


幸运的是,ocaml很适合这一点。记录和类可以有可变字段,ocamls类可以很好地为对象和继承建模。您仍然可以在类旁边使用ocaml的所有函数概念。它混合得很好。

你的问题似乎是问如何在函数式编程中实现继承,你不能这样做,因为这从根本上来说是一个面向对象的概念(尽管即使在面向对象的世界中,实现继承也不被鼓励,因为你应该支持组合)。最好根据你如何使用FP概念对游戏建模来重新表述你的问题。明白了,我应该修改我的问题还是做一个新的问题?我可能会建议编辑你仍然假设OOP习惯用法。我认为最好是在一个更具对话性的论坛上提出这类问题,比如,因为这样更有利于澄清和探索。SO最适合于特定的、定义良好的编程问题。我的心态已经建立,但我需要改变它,因为我需要尽可能避免使用OOP和命令式概念!这总是可能的。我想说的是这不方便。如果你希望你的游戏源代码是可读的,易于理解和维护,那么你必须做出妥协。在更有意义的地方使用OOP和命令式功能。这基本上意味着你的单位,建筑和地图应该是可变的记录或对象。我想我同意。我将使用类来表示游戏。其余的都可以在功能上完成,对吗?比如在游戏中前进,管理每个实体的视频/音频等