关于MUD游戏设计中定时事件的概念问题
我正在尝试制作一个MUD(多人互动小说游戏)。
现在我处于设计和构思阶段,但遇到了一个问题,想不出解决办法。希望一些有经验的程序员能给我一些建议。
我尽量简单地解释一下这个问题。当玩家决定执行一个动作时,他会向服务器发送一个命令。服务器会处理这个命令,判断这个动作是否可以执行,然后要么执行这个动作,要么给出不能执行的理由。一个动作可能失败的原因是玩家正在忙于其他事情。例如,如果一个玩家正在打斗,刚挥了一下大剑,可能需要3秒钟才能再次执行这个动作。如果玩家太快再次尝试挥剑,游戏会提示他需要等x秒才能再做这个动作。这个我大概可以设计得不错。我的问题是,如何让AI生物也有这种行为。服务器自己执行的所有事件,也就是不是直接响应玩家的行为,都需要有时间限制。比如,一个邪恶的怪物对你施了个法术,但必须等30秒才能再次施法……我想我可能会把这些事件放到某种事件队列中,但我该如何让这个事件队列具有时间限制呢?
7 个回答
你的人工智能控制的角色应该有一种“我接下来要做什么?”的方法,对吧?你只需要让这个方法在另一个动作进行时返回“我很忙,继续做我正在做的事情”的结果。
比如:
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
等等。抱歉,代码风格可能有点乱……;)
人工智能(AI)是客户端。
从某种角度来看,它们“是服务器的一部分”,但实际上并不是。它们其实是在主游戏引擎之外的。它们是没有人类参与的专用客户端。
一个AI客户端与服务器的接口和人类客户端是一样的。
MUD(多用户地下城)中的动作通常是在“滴答”时间内执行的,而不是立刻进行。这种做法可以减少延迟的影响,同时也能公平地处理怪物的指令,让它们排队等待执行。
我个人不太喜欢这种方式,但几乎99%的MUD都是这么做的。你需要设计一个强大的指令队列和事件队列,能够同时处理人工和AI的指令。然后你可以给AI的指令添加“虚拟延迟”,这个延迟可以是预设的,也可以是所有用户延迟的平均值,或者你想要的其他方式。