关于MUD游戏设计中定时事件的概念问题

4 投票
7 回答
1919 浏览
提问于 2025-04-15 22:13

我正在尝试制作一个MUD(多人互动小说游戏)。

现在我处于设计和构思阶段,但遇到了一个问题,想不出解决办法。希望一些有经验的程序员能给我一些建议。

我尽量简单地解释一下这个问题。当玩家决定执行一个动作时,他会向服务器发送一个命令。服务器会处理这个命令,判断这个动作是否可以执行,然后要么执行这个动作,要么给出不能执行的理由。一个动作可能失败的原因是玩家正在忙于其他事情。例如,如果一个玩家正在打斗,刚挥了一下大剑,可能需要3秒钟才能再次执行这个动作。如果玩家太快再次尝试挥剑,游戏会提示他需要等x秒才能再做这个动作。这个我大概可以设计得不错。我的问题是,如何让AI生物也有这种行为。服务器自己执行的所有事件,也就是不是直接响应玩家的行为,都需要有时间限制。比如,一个邪恶的怪物对你施了个法术,但必须等30秒才能再次施法……我想我可能会把这些事件放到某种事件队列中,但我该如何让这个事件队列具有时间限制呢?

7 个回答

2

你的人工智能控制的角色应该有一种“我接下来要做什么?”的方法,对吧?你只需要让这个方法在另一个动作进行时返回“我很忙,继续做我正在做的事情”的结果。

比如:

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

等等。抱歉,代码风格可能有点乱……;)

3

人工智能(AI)是客户端。

从某种角度来看,它们“是服务器的一部分”,但实际上并不是。它们其实是在主游戏引擎之外的。它们是没有人类参与的专用客户端。

一个AI客户端与服务器的接口和人类客户端是一样的。

4

MUD(多用户地下城)中的动作通常是在“滴答”时间内执行的,而不是立刻进行。这种做法可以减少延迟的影响,同时也能公平地处理怪物的指令,让它们排队等待执行。

我个人不太喜欢这种方式,但几乎99%的MUD都是这么做的。你需要设计一个强大的指令队列和事件队列,能够同时处理人工和AI的指令。然后你可以给AI的指令添加“虚拟延迟”,这个延迟可以是预设的,也可以是所有用户延迟的平均值,或者你想要的其他方式。

撰写回答