Erlang中的怪物AI-如何勾选进程,如何读取玩家';健康

Erlang中的怪物AI-如何勾选进程,如何读取玩家';健康,erlang,Erlang,我想了解一下Erlang的流程,这里有两个关于游戏服务器的问题: 第一个问题:如果怪物空闲,它应该每x秒随机移动一次。每x秒更新或勾选一个进程的正确方法是什么?最优雅的方式是什么 第二个问题:怪物想攻击一名玩家,但想先检查其位置。常见的方法是: if dist(mob_pos, player_pos) < 10 then send attack message to player 如果距离(移动位置,玩家位置)。。。; 镁硼->。。。; ... 之后-> 做你必须做的事 结束。 erl

我想了解一下Erlang的流程,这里有两个关于游戏服务器的问题:

第一个问题:如果怪物空闲,它应该每x秒随机移动一次。每x秒更新或勾选一个进程的正确方法是什么?最优雅的方式是什么

第二个问题:怪物想攻击一名玩家,但想先检查其位置。常见的方法是:

if dist(mob_pos, player_pos) < 10 then send attack message to player
如果距离(移动位置,玩家位置)<10,则向玩家发送攻击消息
我知道我可以通过发送“询问pos”消息并在下次更新中读取结果来检查玩家的pos。但问题是:这是下一次更新,怪物不会知道它只是要求pos攻击玩家。Erlang如何检查位置,然后向玩家发送攻击信息?

对于问题1: 标准库中有一个很好的计时器模块: 这可以为你的申请打勾

关于问题2: 你似乎想知道怪物和玩家之间的同步。 如果你在玩家和怪物之间进行异步消息传递,那么问题和回复之间可能会有计时器发出的滴答声(尽管可能性很小)。 您可以做的是执行一个同步调用,该调用将阻止进程,直到操作得到解决

您可以将monster和player建模为gen_服务器,并使用它们的cast(异步)和call(同步)方法。见:

第一个问题:怪物应该每x秒随机移动一次 如果空闲。每x更新或勾选一个进程的正确方法是什么 秒?最优雅的方式是什么

如果使用receive/after子句,erlang进程将在“

代码块。这是做你想做的事情最有效的方法:

receive
  msg_a -> ...;
  mg_b -> ...;
  ...
  after <milliseconds> ->
     do_whatever you have to
end.
接收
味精a->。。。;
镁硼->。。。;
...
之后->
做你必须做的事
结束。
erlang VM不能跳过“after”代码块。另外,由于“after”代码块不是来自邮箱的消息,所以不能丢失它。而且保证它会被执行

但是如果你使用这个方案,你的怪物将是独立的演员。 例如怪物1诞生了。然后他睡了10000毫秒。在一秒钟内,另一个怪物诞生了——他睡了10000毫秒。所以怪物1将被唤醒一秒钟,而第二个怪物将睡眠一秒钟

但在现实世界中,一切都像我上面描述的那样发生:) 每个人的生物时间都是独立的。但是物理所有对象的时间同时滴答作响

所以这取决于你想使用的时间——生物的还是物理的(就游戏性而言) Erlang更适合生物技术。但是,可以使用同步来实现物理同步

第二个问题:怪物想攻击一个玩家,但却想 首先检查它的位置。常见的方法是: 如果距离(移动位置,玩家位置)<10,则向玩家I发送攻击消息 知道我可以通过发送“询问pos”来检查玩家的pos 消息并在下次更新中读取结果。但这是答案 问题:这是下一次更新,怪物不会知道 只是要求pos攻击玩家。去爱尔兰的路怎么走 检查位置,然后向玩家发送攻击信息 后来呢

这是你系统的设计缺陷。 当一个强盗想抢劫你的时候,他会问你你的位置吗

应该有一个“游戏”过程。此过程应

  • 仅当您使用“物理时间”时,在“after”子句中,向所有游戏对象发送同步(调用句柄\调用)“time tick”消息。他们会在“时间点”上做任何他们需要的事情
  • 这个游戏过程应该观察物体的所有位置。它甚至可能不是唯一的过程,但也可能是一个监督树。比如,一个“游戏”对象在10秒后的时间刻度上问一个强盗:“你在哪里”,他回答“我在位置(x,y,z)”,然后“游戏”问一个生物被抢劫“家伙,你在哪里?”。这个松散的生物回答:“我在位置(x1,y1,z1)”,如果所有的通讯都在可接受的范围内,如果被抢劫的生物和抢劫者之间的“游戏”对象计算的距离在可抢劫的范围内,则抢劫者抢劫。(一个“游戏”向他发送信息“抢劫”)

    你可以想象一个“游戏”对象,比如某个神

  • 这只是一种方法。同步的

    但您可以实施另一种方法/设计。一个异步的,就像在普通的相对论问题中:)成为一个恩斯坦:)当一个强盗不“询问”受害者的位置时。但如果可以的话,他会“看到”受害者的位置

    在这种情况下,应该有一个“光”对象/过程,它会告诉我们是否可以从这里看到另一个对象

    例如,强盗的受体(眼睛)处于“接受”状态。所有的“光束”过程都会将附近地形的信息传送给强盗

    为此,您应该将一个erlang进程绑定到每个单元格。每个小区只允许向附近的小区传递信息。比如说,如果你像文明5一样使用6边的细胞,那么附近就会有6个细胞。通过这种方式,您甚至可以模拟“物质的本地时间”,如

    这是另一个更复杂的体系结构。我不会在这里解释,因为这需要更多的信件和书页:)

    我给了你一个想法,两个概念。您可以使用erlang将它们向前推。祝你好运