C# 如何让生物在角色扮演游戏中相互跟踪

C# 如何让生物在角色扮演游戏中相互跟踪,c#,C#,我正在编写一个角色扮演游戏,目的是为了好玩和学习。我计划有一个完整的游戏世界,在这个游戏世界里,我计划有玩家和怪物可以移动的区域。假设分区是20x20网格,网格上的每个磁贴都有64像素宽。玩家或怪物可以占据一块1x1瓷砖,每一步移动一块瓷砖 在游戏过程中,我如何让怪物和玩家了解彼此?我不知道我会使用什么样的数据结构,也不知道我会如何制造怪物,让它们在区域中游荡 注意:我似乎提到过使用某种树结构四叉树,但我不太明白它们是如何应用的。首先,你应该为每个区域列出一个怪物列表。或者deque,或者任何适

我正在编写一个角色扮演游戏,目的是为了好玩和学习。我计划有一个完整的游戏世界,在这个游戏世界里,我计划有玩家和怪物可以移动的区域。假设分区是20x20网格,网格上的每个磁贴都有64像素宽。玩家或怪物可以占据一块1x1瓷砖,每一步移动一块瓷砖

在游戏过程中,我如何让怪物和玩家了解彼此?我不知道我会使用什么样的数据结构,也不知道我会如何制造怪物,让它们在区域中游荡


注意:我似乎提到过使用某种树结构四叉树,但我不太明白它们是如何应用的。

首先,你应该为每个区域列出一个怪物列表。或者deque,或者任何适合您的数据结构,它基本上需要是线性的,允许随机和线性访问,并允许从任意位置删除,以防您删除死亡怪物。例如,如果您不删除,则不需要这样做

每个怪物只需在该区域的列表中搜索其他怪物和玩家,并以这种方式跟踪他们

效率低下?对

一个好的解决方案?取决于区域中实体的数量如果没有100万个实体,循环就不会那么糟糕,特别是在PC或其他强大的平台上


如果您正在努力寻找最快的解决方案,那么就选择树结构,但这相当复杂。

一个非常简单的方法是将游戏板表示为二维整数数组。您可以设置并清除阵列中每个元素中的单个位,以表示占据该磁贴的玩家/怪物的类型,以及地形类型等其他内容

或者,您可以为游戏中的所有演员创建一个基类,然后从演员派生一个玩家和怪物类。基类可以跟踪常见的事情,比如网格上的位置。派生类可以跟踪特定于玩家或怪物的东西

如果你构建了一个表示游戏区域的区域容器类,它可以有一些方法来移动一个参与者,定位一个参与者,等等。在内部,这个类不需要将棋盘表示为网格——它可以是一个参与者列表


添加到区域的每个参与者都可以维护对其所在区域的引用。这将允许每个演员检查区域中的其他演员。

在众所周知的流行游戏中,这种意识作为攻击列表实现。每个生物都有这个列表。它最初是空的。每当生物接近仇恨时,此列表将被填充。当一些减少仇恨的事件发生时,从列表中删除。比如距离达到某个上限,或者对方生物死亡,做一些减少仇恨的动作等等


很好,您的设计基于分区,因此您最终可以将引擎扩展到多个进程/机器。在可伸缩引擎中绝对不应该有任何单体/全局结构,否则设计将无法伸缩,因为您的游戏将包含数百万生物

我只需按区域映射怪物:

Map<Zone, Monster> MonsterByZones = new  Map<Zone, Monster>();
世界应该有一种方法来更改角色区域:

world.ChangeZoneIfNeeded(character);
这是一个实现RPG的简单方法


玩得开心

您需要深入了解您的规范,并确定彼此了解的目的是什么。只有知识是没有意义的;重要的是你根据这些知识采取的行动。这些行为的性质决定了你需要的知识类型。通常,任何一个参与者都可以在需要时查询其世界,以获取有关附近参与者的信息。在任何情况下,这些信息都应该存在于参与者之外。

对于常规平铺贴图,您希望使用二维数组,因为它将执行快速随机访问。数组中的每个条目都将保留存在其中的对象的引用或ID号(如果有的话)。如果您的对象希望与附近的磁贴或一组磁贴上的某个对象交互,它应该从对应于该磁贴的2D数组条目中获取相应的引用/id


您可以在游戏中使用一棵树,在游戏中,空间不被划分为规则的分幅。树将空间划分为越来越小的区域,每个叶节点将保留对该区域中对象的引用列表。树和2D数组都是场景图数据结构-它们跟踪空间区域中的对象。

如果每个人都知道其他人,那么每个对象都可以简单地引用所有角色的主列表。如果你想限制谁知道谁,在你考虑数据结构之前,你需要准确地定义他们将如何获得和失去彼此的知识。在您担心如何实现相互了解系统之前,您需要
需要准确定义它遵循的规则。每个人都知道其他人吗?实体只知道相邻瓷砖上的实体吗?AI部分是生物相互了解的地方。这并不是人工智能这个术语的公认含义。当你开始进入决策算法时,它就进入了人工智能领域。@Kylotan感谢你的澄清。从问题中去掉人工智能标签
world.ChangeZoneIfNeeded(character);