我正在尝试建立一个MUD (多人互动小说游戏)
我正处于设计/概念化阶段,我遇到了一个无法解决的问题。我希望一些更有经验的程序员会有一些建议。
这是我所能解释的最好的问题。当玩家决定执行一个动作时,他会向服务器发送一个命令。然后,服务器处理该命令,确定是否可以执行该操作,并且要么执行该操作,要么响应不能执行该操作的原因。一个动作可能失败的原因之一是玩家忙于做其他事情。例如,如果玩家在战斗过程中,刚刚挥舞了一把巨大的大刀,他可能需要3秒才能重复这个动作。如果玩家尝试再次挥杆,游戏将做出响应,指示他必须等待x秒才能这样做。现在,我可以毫不费力地设计它。我遇到的问题是如何从人工智能生物中复制这种行为。所有由服务器自己执行的事件,也就是不是对玩家所做的事情的即时反应,都必须是时间敏感的。一些邪恶的怪物对你施了魔法,但必须等待30秒才能再次施法。我想我可能会将所有这些事件添加到某种类型的事件队列中,但是如何才能使事件队列对时间敏感呢?
发布于 2010-05-01 06:43:15
MUDs操作通常在“ticks”上执行,而不是立即执行-这允许延迟的有限影响,并允许monster的命令插入队列并公平处理。
就我个人而言,我不喜欢这种方法,但几乎99%的MUD都使用它。您需要设计一个健壮的命令队列和事件队列,它可以处理AI和用户命令。然后,您可以向AI命令添加“虚拟延迟”,这些命令可能是预定义的,也可能是所有用户的平均延迟,或者您喜欢的任何东西。
发布于 2010-05-01 19:57:42
AI是客户。
它们只是从最远的角度看“服务器的一部分”。它们实际上在主游戏引擎之外。他们是没有人类的专业客户。
AI客户端与服务器具有与人类客户端相同的接口。
发布于 2010-05-01 07:18:52
好吧,你的人工智能控制的实体有某种“我下一步该怎么做?”方法,对吧?当另一个操作正在进行时,只需让该方法返回“我很忙,继续做我正在做什么”结果即可。
例如。
class ToughGuy(AI):
Action_Idle, Action_BroadswordSwing, Action_CastingMagic = range(3)
MagicRange = 10
MagicTime = 8
MeleeRange = 4
MeleeTime = 2
def __init__(self):
self.action = ToughGuy.Action_Idle
self.actiontimer = 0
def Update(self, timestep):
if self.actiontimer <= 0:
self.action = ToughGuy.ActionIdle
else
self.actiontimer -= timestep
if self.action == ToughGuy.Action_Idle:
global player # don't do this
if self.AmIFacing(player):
distance = DistanceBetween(self, player)
if distance < ToughGuy.MeleeRange:
self.action = ToughGuy.Action_BroadswordSwing
self.actiontimer = ToughGuy.MeleeTime
elif distance < ToughGuy.MagicRange:
self.action = ToughGuy.Action_CastingMagic
self.actiontimer = ToughGuy.MagicTime等等。对于可变编码标准,很抱歉...;)
https://stackoverflow.com/questions/2748084
复制相似问题