FC2ブログ
TOP > 一から始めるAI講座~第12回:横殴りを避けよう~
 ← 最近の牛事情 | TOP | Gv戦果:4/2

リストマーク 一から始めるAI講座~第12回:横殴りを避けよう~ 

【重要】新しいBlogに移転していますあるネットゲーマーの日常
いよいよお待ちかね、横殴り防止の改造です
結果からいえば、改造はたった3行で終わります

しかし、この連載の目的は、自分で改造できるように
スキルを身につけてもらうことですから、
きちっと解説を加えた上でソースを出しますね

  ~2章~ 攻撃パターンを改造する

 2-3:横殴りはダメよ♪

AIに「横殴りするな」とは書けませんので、
Luaで書けるように噛み砕く必要があります
が、ヒントはすでにデフォルトAIの中にあるのです

「横殴り」とは「他者が戦闘中の敵を殴る」ことですから、
「他者が戦闘している」ことを調べればいいことになります

思い出してください
主人の敵を調べる部分や、自分の敵を調べる部分で、
対象のターゲットを調べていたはずです

 target = GetV (V_TARGET,v)

これですね
ということは、誰かがターゲットしている敵は
以下のように書けます

 GetV (V_TARGET,v)~=0

裏を返せば、殴っていいのは、
「誰もターゲットしてない敵」ですね
よって、以下のようになります


function  GetMyEnemy (myid)
  local result = 0
  local owner = GetV (V_OWNER,myid)
  local actors = GetActors ()
  local enemys = {}
  local index = 1
  local target
  local get_flg = 0 -- 敵発見フラグ

-- 自分を攻撃する敵を探す
  for i,v in ipairs(actors) do
    if (v ~= owner and v ~= myid) then
      target = GetV (V_TARGET,v)
      if (target == myid) then
        enemys[index] = v
        index = index+1
        get_flg = 1 -- 敵発見
      end
    end
  end

-- 他の敵を探す
  if (get_flg == 0) then -- 自分を攻撃する敵がいない?
    local max_dis = 10 -- 索敵範囲
    local target_dis
    for i,v in ipairs(actors) do -- 敵を探す
      if (v ~= owner and v ~= myid) then
        target_dis = GetDistance2 (myid,v) -- 距離計算
        if (target_dis < max_dis) then -- 近いところにいる?
          if (1 == IsMonster(v))  then
            target = GetV (V_TARGET,v) -- 対象のターゲット確認
            if (target == 0) then -- ターゲットがいない
              enemys[index] = v
              index = index+1
              get_flg = 1
            end
          end
        end
      end
    end
  end

-- 一番近い敵を探す
  if (get_flg == 1) then -- 敵がいる
    local min_dis = 100
    local dis
    for i,v in ipairs(enemys) do
      dis = GetDistance2 (myid,v)
      if (dis < min_dis) then
        result = v
        min_dis = dis
      end
    end
  end

  return result
end


どうでしょう
たった3行なのがわかりますね?

最初にも書きましたが、結果は非常に単純です
でも、そこに至るプロセスを知ることで、
自分で改造する時の力になります


ちょっと横道にそれますが、
プログラミングにおいてはこのプロセスが非常に大事で・・・

 問題提起→解決策発見→仕様策定→実装

・・・こんな感じでしょうか?
今回の場合でいえば・・・

  横殴りしたくない
 →誰もターゲットしてない敵を狙う
 →GetV (V_TARGET,v)==0だけ敵とする
 →実装

・・・こんな感じですね


さて、ここまでの改造で、ホムの基本的な動きは
ほぼ問題なくなったと思います

次回は一歩踏み込んで、スキルについてのお話を
TraceAIの使い方にも触れる予定です
[2006.04.04(Tue) 13:15] ホムンクルスAI考察Trackback(0) | Comments(0)
↑TOPへ


 ← 最近の牛事情 | TOP | Gv戦果:4/2

COMMENT

COMMENT POST











管理者にだけ表示

Trackback

この記事のURL:
http://parrot.blog21.fc2.com/tb.php/254-a672c87f
 ← 最近の牛事情 | TOP | Gv戦果:4/2

プロフィール

Categories

Recent Entries

Recent Comments

Archives

AdSense

Calander

ブログ内検索

RO Search

Links

Copylights

Amazon