FC2ブログ

    スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    MTG的カードゲームのAI(評価関数型)を考えるだけ考えてみた

    いわゆるMTGベースな、遊戯王とかデュエマとかのTCGについて
    わたしがAIを組むとしたらどんな感じになるかをゆるゆると書き出してみます。

    まずは想定するカードゲームのルールを決めておきます。適当に読み流してください。
    ルール1:プレイヤー2人で、お互いに構築済デッキを用意して対戦する。
    ルール2:各プレイヤーはゲーム開始時にライフを20点持つ。
         相手プレイヤーのライフが0点になったらゲームは終了し、勝利する。
    ルール3:各プレイヤーは交互にターンを受け取る。
         各ターンではプレイヤーは以下の行動を行う。
         ①デッキからカードを1枚引く
         ②手札か場にあるカードの効果を使用する(何回でも)

    さらに、今回作成するCPUの特徴について以下のように限定します。
    特徴1:用意するデッキはスタンダードな(特化していない)もの。
    特徴2:自分のデッキの内訳は知っており、相手のデッキ内訳は知らない。
    特徴3:ゲーム中の非公開情報は知らない(判断条件に加えない)。

    本当はもっと細かく定めないといけないですが、長すぎるので省略です。

    * * *

    今回作成するAIは、評価関数により行動を決定させます。
    これはAIが行動した結果、場の状態が「最も有利になる」ように行動を選ぶ方法です。
    (詳しくはググってくださいネ)
    今回は実際に動かしながら作ることを想定していますので、段階ごとに評価項目を
    増やしていきます。各段階のプロトタイプが完成したら実際にプレイしてください。
    そしてこの段階での強さを確認してから、次の段階の作成に進んでいってくださいね。


    <評価レベル1> 相手ライフの残量を評価する
     このゲームでは相手のライフを0にすれば勝ちなので、まずは相手ライフを削ることを
     CPUに教えなければなりません。
     そのため、行動結果のうち「最も相手ライフが少なくなる」行動を優先します。

     CPUにこの評価レベル1を習得させれば、まずはゲームが成立します。
     ひたすら攻撃的なAIになりますが、実際のゲームの初心者もそんなものです。

    <評価レベル2> 自ライフの残量を評価する
     相手のライフを0にすれば勝ちということは、同時に自分のライフが0になれば負ける
     ということです。
     そのため、行動結果のうち「最も自ライフが少なくなる」行動を優先します。

     ここでCPUが2つ目の評価を習得しました。
     各評価の内容をどれだけ重視するかの度合いは「係数」と呼ばれます。例えば評価1を
     75%、評価2を25%の割合で重視するとするならば、最終的な評価は
      評価1 × 0.75 + 評価2 × 0.25 = 最終評価
     ということになります。この数値が大きくなる行動を優先します。

    <評価レベル3> 次の手を評価する
     一手行動した後もゲームは続いていきます。複数回行動した結果として有利になるよう
     動く必要があります。
     例えば《2ダメージ》《ちからをためる》という2枚のカードを持っていたとします。
     それぞれの効果は「相手のライフを2減らす」「次のライフ減少を2倍にする」という
     ものです。つまりCPUはこうするといい感じです。
      《ちからをためる》→《2ダメージ》の順に使用する(ライフを4減らせる)。
     これをCPUに実行させるには、2手分の行動を評価しなければなりません。
     つまり評価するのは「行動後の場」ではなく「2手後の場」の状態にします。

     ただしもしかすると相手が、途中で行動を妨害してくるかもしれません。
     この評価では妨害される可能性を係数としますと、最終的な評価は
      1手後の評価 × 妨害係数 + 2手後の評価 = 最終評価
     ということになりました。妨害率が高いほど、1手だけでの評価が重要になります。

    <評価レベル4> デッキの中身も評価する
     デッキの中身が分かっているので、次に引けるカードの予測がつくことがあります。
     「次に《ちからをためる》を引く確率は60%なので《2ダメージ》は残しておこう」
     といった判断をすることができます。引く確率が係数になるので、最終的な評価は
      引いた場合の評価 × カードを引く率 = 最終評価
     となります。

    <評価レベル5> 相手の状態も評価する
     ゲームでは、当然相手も攻撃してきます。相手が行ってきそうな行動についても
     評価しなければなりません。
     例えば相手は既に《ちからをためる》をプレイしていたとします。この後に攻撃
     カードを出されてしまうと大ダメージを受けてしまいます! そこで防御カードを
     使用する必要があります。次のライフ減少を1/4にする《大防御》カードを
     使うよう係数を調整します。
      評価 - 相手の行動後の評価(予想) × 係数 = 最終評価
     相手がフェイントをしかけている可能性もありますので、予想は大事です。。

    <評価レベル6> さらに先の手も評価する
     次の手だけでなく、さらにその先、その先の先まで評価していきます。
     ゲーム終了まで読み切ったならば、あなたの勝ちはゆるぎないものとなります!
     …と思いきや、係数の設定によっては負けることもあります。
     うまく調整して勝率を伸ばしましょう。


    いかがでしょうか? なんとなく作れそうな気がしてきましたか?
    しかし、現実は非常です。大量で複雑なカードテキストに悩ませられるでしょう…

    もし次回があれば、もっと複雑なゲームでのCPUを考えてみようと思います。
    具体的に記事化して欲しい内容とかあれば、コメントいただければ幸いです。
    スポンサーサイト

    コメントの投稿

    管理者にだけ表示を許可する

    管理人のみ閲覧できます

    このコメントは管理人のみ閲覧できます

    No title

    しゅくふくでエルルーンがついほうされちゃった

    Re: 評価関数

    ハトクラの話題はこの記事じゃないですよっ

    > (管理人へのコメント)
    普通に公開コメントにしてもイイノヨ…?

    わたしが以前オセロ作ったとき、そこそこ強くなったAIは
    やっぱり評価関数のタイプでしたねえ。

    評価の対象は大きく分けて4つで、
    ①場所ごとの優先度、②個数(終盤以降)、③置ける個所数(中盤まで)、④特定の条件下での定石
    という感じで、後に行くほど係数が上がって行くようになってました。
    ちなみに2手先は読んでませんでした(意味的には①と④に含まれてはいますが)。
    こんなのでも、オセロの定石を知らない人にはまず負けなかったデスヨ。

    2手先を読む方法については、カードが多彩なほど実装が難しくなっていきますね。。
    テトリスの例がシンプルなので、軽く説明を混ぜて記事+コードをUPしときますね。

    No title

    お手数をおかけしてすみません。
    よろしくお願いします。
    カテゴリ
    最新記事
    最新コメント
    最新トラックバック
    月別アーカイブ
    検索フォーム
    RSSリンクの表示
    リンク
    ブロとも申請フォーム

    この人とブロともになる

    QRコード
    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。