4

MUD (マルチプレイヤー インタラクティブ フィクション ゲーム) を作成しようとしています。

私は設計/概念化の段階にあり、解決策を思い付くことができない問題に遭遇しました。より経験豊富なプログラマーがアドバイスをくれることを願っています。

これが私が説明できる限りの問題です。プレイヤーがアクションを実行することを決定すると、サーバーにコマンドが送信されます。次に、サーバーはコマンドを処理し、アクションを実行できるかどうかを判断し、アクションを実行するか、実行できなかった理由について応答します。アクションが失敗する理由の 1 つは、プレーヤーが何か他のことをするのに忙しいことです。たとえば、プレイヤーが戦闘中に巨大なブロードソードを振った場合、このアクションを繰り返すまでに 3 秒かかることがあります。プレーヤーがすぐにもう一度スイングしようとすると、ゲームは応答して、それを行う前に x 秒待つ必要があることを示します。これで、おそらく問題なく設計できます。私が抱えている問題は、AI クリーチャーからこの動作をどのように再現できるかということです。サーバーが独自に実行しているすべてのイベント、プレーヤーが行ったことに対する即時の反応としてではなく、時間に敏感である必要があります。邪悪なモンスターがあなたに呪文を唱えましたが、もう一度それを行うには 30 秒待たなければなりません...おそらくこれらすべてのイベントをある種のイベント キューに追加することになると思いますが、そのイベント キューを時間に敏感にするにはどうすればよいでしょうか?

4

7 に答える 7

4

MUD のアクションは、通常、即時ではなく「ティック」で実行されます。これにより、レイテンシの影響が制限され、モンスターのコマンドがキューに挿入され、公平に処理されます。

個人的には、このアプローチは好きではありませんが、ほぼ 99% の MUD が使用しています。AI コマンドとユーザー コマンドの両方を処理できる堅牢なコマンド キューとイベント キューを設計する必要があります。次に、「仮想レイテンシー」を AI コマンドに追加できます。これは、事前に定義されているか、すべてのユーザーのレイテンシーの平均など、好きなものです。

于 2010-04-30T22:43:14.973 に答える
3

AIはクライアントです。

それらは、最も遠いビューでのみ「サーバーの一部」です。それらは実際にはメインのゲーム エンジンの外にあります。彼らは人間のいない専門的なクライアントです。

AI クライアントには、人間のクライアントと同じサーバーとのインターフェースがあります。

于 2010-05-01T11:57:41.843 に答える
2

スレッドを使用して特定のタイプのMobを処理し、すべてのインスタンスをある種の配列に入れることができます。次に、スレッドはロジックを繰り返し適用してリストを通過します。DelayTimeStartとDelayは、親Mobクラスの属性である可能性があり、スレッドがループを通過するときに、遅延に時間が残っているMobのインスタンスの処理を延期することができます。

于 2010-11-16T02:46:01.593 に答える
2

さて、あなたの AI 制御のエンティティには、「次に何をするつもりですか?」というようなものがあります。メソッドですよね?別のアクションの進行中に、そのメソッドが「忙しいので、私がしていたことを続けてください」という結果を返すだけです。

例えば

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

など。可変コーディング標準で申し訳ありません... ;)

于 2010-04-30T23:18:52.117 に答える
1

ここで実現の例を見つけることができるかもしれません:

于 2010-11-29T08:35:08.453 に答える
0

基本的なアプローチは、邪悪なモンスターの呪文のインスタンスを表すデータ構造を持ち、それにクールダウン タイマーを設定することです。パワーが使用されると、クールダウンが設定されます(おそらく、スペルのマスター定義によって定義された秒数に)。再度使用しようとすると、プレイヤー アビリティと同様に失敗します。これは、キューにクールダウンをチェックさせ、有効期限が切れていない場合は有効期限が切れるのを待つか、アクションを中止するか、必要に応じてアクションを再スケジュールすることで、イベント キューと統合できます。

于 2011-02-02T20:47:28.400 に答える