FC2ブログ

    スポンサーサイト

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

    テトリスCPUの作り方(評価関数型)

    今回は「テトリス」のCPUの作り方について解説いたします。
    数日前の記事に引き続き、評価関数を用いた思考ルーチンの実装となります。

    まずは昔作った「テトリス」のソースコード(C#)を公開しておきます。→COM_2.cs
    このソースコードは、3年前にwinガジェット(Silverlight)用に
    元々WinFormのプログラムをルーチン強化&オブジェクト思考っぽく改善したものです。

    ちなみにその元プログラムはこっちです。 → COM_1.cs
    こちらは6年以上前のWinFormです。所々ひどいけどシンプルでわかりやすいかも?
    ※操作はキーボードで、WSADで移動、JKで回転。

    どちらも古くさいコードではありますが、単純な評価関数の例としてご参照ください。

    * * *

    ゲームのCPUを作成するにあたって、もっともわかりやすいのは「テトリス」です。
    テトリスは元々、学習段階に関する研究のために開発されたものです。
    いままでCPUを一度も組んだことがない、という人は
    まずは練習に、各段階のルーチンを作ってみると、コツが分かってくると思います。

    テトリスをプレイする人間は、以下の段階を経て習熟するとされています。
    ①ルール・操作法を理解する段階
    ②テトリミノを隙間無く並べるようになる段階(回転させない)
    ③テトリミノを回転させるとどのような形状になるかを予想し、狙って回転させる段階
    ④次に落ちてくるテトリミノも見て考える段階
    ⑤高得点を狙い、複数段をまとめて消すことを狙うようになる段階
    ⑥4段消しを狙い、端の1列のみを残して積む段階      ※wiki「テトリス」より

    ①から順番にCPUを教育していき⑥までいけば、立派なAIが完成します。
    さっそく各段階を見ていきましょう。

    * * *

    ①ルール・操作法を理解する段階
     CPUに操作方法を教えてあげましょう。
     ここでは、CPUが考えた結果、移動・回転ボタンを押すことができればOKです。

    ②テトリミノを隙間無く並べるようになる段階(回転させない)
     左右移動を覚えて、どの位置に置いたらもっとも評価が高くなるかを計算します。
     一番左、二番目、三番目…に置いたときの評価をすべて計算し、比較します。

     評価の例としては「列が消せるか」「高低差ができないか」「埋まった穴がないか」。
     各評価について係数をかけて、それらの合計値を評価結果とします。

    ③テトリミノを回転させるとどのような形状になるかを予想し、狙って回転させる段階
     テトリミノの回転状態は4パターンあるので、
     それらについて②の評価をそれぞれ比較し、評価が高い回転数・位置を取得します。

    ④次に落ちてくるテトリミノも見て考える段階
     これは2手先を読む必要があります。
     現在のテトリミノを置いた後、さらにその状態から次のテトリミノを置いた場合の評価
     が一番高くなる組み合わせを持つ置き方を評価します。
     ただし、次の次に来るテトリミノによっては置く場所が変わる可能性があるので
     2手先だけでなく1手先の状態もなるべく良い方が評価が高くなるようにします。
     (どれくらい考慮するかは係数によって調整します)

    ⑤高得点を狙い、複数段をまとめて消すことを狙うようになる段階
     これまでの評価に追加して、得点が高くなる手を選択するようにします。
     少しでも点が入る手を選ぶと1、2列消しばかりになりますし、いつまでも消さずに
     いるとあっという間に積み上がってしまいます。
     ここは係数調整の腕の見せ所ですよっ。
     ちなみに係数は一定ではなく、ある程度積み上がったら消す方を優先するなどの
     工夫が入っているとなお良いです。

    ⑥4段消しを狙い、端の1列のみを残して積む段階
     これは⑤の発展でOKです。
     こちらも一工夫として、左右いずれかの1列を空けておくと評価が高くなるように
     しておくとよい感じです。
     やっぱり高く積み上がりすぎたら消しましょう。

    いかがでしょうか? この段階ごとに自分でプログラムを組んでみると、
    評価関数の基礎が分かるかもしれません。
    サンプルコードも難点が多いので、ぜひもっとイイ感じのCPUを作ってください!
    スポンサーサイト

    コメントの投稿

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

    No title

    サンプルコード、ありがとうございました!
    早速研究してみます。
    とは言え、私には困難そうですがorz

    評価値の出し方

    連投失礼します。

    カードゲームにおいての評価値の出し方ですが、カードに値を設定するのではなく、一度場に出すシミュレートをしていって、その中から最終評価の高いものを選択するということなのでしょうか?

    Re: 評価値の出し方

    > とは言え、私には困難そうですがorz

    古いほうのソースは1つの関数だけという汚いコードですが、分かりやすくはあるかも?

    > カードゲームにおいての評価値の出し方ですが、カードに値を設定するのではなく、一度場に出すシミュレートをしていって、その中から最終評価の高いものを選択するということなのでしょうか?

    うーん、理想はそうですねえ。
    ただカードが複雑な効果を持っているとそういった評価方法は難しくなるので、
    カードごとにさまざまな局面での評価変動式を持っているといい感じです。
    「カードAはこの場面で使うと+1」とか「カードBは場にあるとカードC+1」とか。

    No title

    なるほど、局面によって評価を変えるのですか。
    ありがとうございます。
    試してみます。

    私の場合、カード情報はメモリノートパッド命令で管理しているのですが、
    (例えばtefuda.cardなら後ろのcard部分に。)
    それをどう評価値と参照させて場に出すのかと悩んでいます。
    評価値は算出方法は理解したものの、今度はカードを出す方法がorz
    今まではcard(cnt)=-card(cnt)のような式でその前の手札情報と同期させていたのですが、もっと別の方法ですよね。

    もう少しあがいてみます。

    No title

    評価値を参照してカードを出すことが出来ました。
    たぶんスクリプト的には大間違いだと思いますが(^^;

    こつこつ頑張ってみます。

    No title

    バトルも評価値でおこなえるようにしました。
    まだ能力はないものの、CPU同士で対戦させるのも面白いものですね。
    nanaMBさんのおかげでスキルがアップしました。
    ありがとうございます!

    これなら以前よりも良いカードゲームが作れそうです。
    とりあえず今組んでいるCPU同士の対戦ソフトが完成しましたら、公開してみます。
    製作の幅が広がるのは嬉しいです(^^)

    Re:

    > バトルも評価値でおこなえるようにしました。
    > まだ能力はないものの、CPU同士で対戦させるのも面白いものですね。

    CPU同士でえんえん対戦させていると、結構アラが見えてきますので、
    その上で調整していくと良い感じになりますよー
    ちなみにテストでは各評価値をログ等で確認しておけるようにしとくと便利ですよ。
    「あれっ、いまなんであの動きしたんだろう?」というときにすぐ確認できますし。

    って、元々CPU同士の戦闘がメインなんですか?
    昔あったCPUを作って戦うゲームとかのルーチンは、えんえんとIF文乱立でしたよね。
    でも練れてない評価型よりもよっぽど強いときがありますしね…侮れません。

    No title

    おはようございます。

    評価値の確認出来ると便利ですね。
    一応手札の評価値は見えるようにしています。
    カードゲームは引き運もあるのでしょうけど、負ける時は大敗が多いような気がします。
    もちろん僅差の勝負もありますが。

    今回は習作ということで、CPU同士の戦闘のみにしてみました。
    それはそれで結構楽しいものです。
    ベクターに上げるまでもないようなものなので、どう公開しようかと悩み中です。

    if文で組むと複雑怪奇になりますけどね。
    でも評価値を覚えるとそっちの方がはるかに簡単なのでもう戻れません(笑

    とりあえず今のところは順調です。

    公開

    こんばんは。

    ご教示頂いたものをヒントに製作しました思考ルーチンで動く『DuelSimulator』がVectorにて公開されました。
    TCGライクなシステムでCPU同士が対戦します。

    nanaMBさんには大変お世話になりました。
    ありがとうございました!

    Re: 公開

    > ご教示頂いたものをヒントに製作しました思考ルーチンで動く『DuelSimulator』がVectorにて公開されました。
    > TCGライクなシステムでCPU同士が対戦します。

    おーっ!
    ぜひ強いCPU目指してがんばってくださいませっ
    カテゴリ
    最新記事
    最新コメント
    最新トラックバック
    月別アーカイブ
    検索フォーム
    RSSリンクの表示
    リンク
    ブロとも申請フォーム

    この人とブロともになる

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