2012年03月08日

【MarioAI】マリオの動かし方メモ

【MarioAI】GamePlay trackをeclipseから動かす。

前回の続きです。
マリオエージェントの動かし方についてメモ。

iMario.jarのダウンロード

マリオエージェントを作成にはiMario.jarが必要とのこと。iMario.jarは以下のURL先からダウンロードできます。

http://code.google.com/p/marioai/source/browse/trunk/target/iMario.jar?r=101

File infoより「View raw file」をクリックして「iMario.jar」をダウンロードします。
このiMario.jarを外部ライブラリとしてインストールしてください。

エージェントファイルを作る

マリオを動かすエージェントファイルを作ってみます。今回は、srcパッケージ以下にaiパッケージを作成し、その中にMyAgent.javaファイルを作成しました。

マリオエージェントを動かす

先程作成した、MyAgent.java内にエージェントプログラムを書き込みマリオを動かしてみます。以下のコードはマリオをただ右に動かすだけのプログラムです。

package ai;

import ch.idsia.agents.Agent;
import ch.idsia.ai.agents.RegisterableAgent;
import ch.idsia.benchmark.mario.environments.Environment;
import ch.idsia.mario.engine.sprites.Mario;

public class MyAgent extends RegisterableAgent implements Agent
{
public MyAgent()
{
super("MyAgent");
reset();
}

public boolean[] getAction()
{
boolean[] action = new boolean[Environment.numberOfKeys];
action[Mario.KEY_RIGHT] = true;

return action;
}

public void integrateObservation(Environment environment)
{

}

public void giveIntermediateReward(float intermediateReward)
{

}

public void setObservationDetails(int rfWidth, int rfHeight, int egoRow, int egoCol)
{

}
}
マリオエージェントはch.idsia.ai.agents.RegisterableAgentクラスの継承とch.idsia.agents.Agentインターフェースを実装する必要があるようです。

ch.idsia.agents.Agentインターフェースの実装に伴い、それぞれ
  • boolean[] getAction()

  • void integrateObservation(Environment environment)

  • void giveIntermediateReward(float intermediateReward)

  • void setObservationDetails(int rfWidth, int rhHeight, int egoRow, int egoCol)
メソッドを再定義する必要があります。

実行時の設定について

作成したエージェントを動かしてみましょう。
[実行(R)]メニューの[実行構成(N)…]を選び実行構成ダイアログを開きます。

marioaiexesetting01.png

Javaアプリケーションを選択し、左上の[新規の起動構成]をクリックします。

marioaiexesetting02.png

作成されたJavaアプリケーションを選択して名前や実行するクラスを編集します。今回は

名前(N):MarioStart
プロジェクト(P):MarioAIGameTrack
メイン・クラス(M):ch.idsia.scenarios.Play


として設定を行いました。

marioaiexesetting03.png

続いて、エージェントプログラムを適用するために実行時の引数を設定します。
エージェントファイルを適用するオプションである「-ag」を入力した後に、適用させたいエージェントクラスを指定します。

-ag ai.MyAgent

として自作したai.MyAgentを指定します。

すべての設定を終えた後に実行ボタンを押すと


このように動かすことができました。

参考サイト

Mario AI Competition プログラムからマリオを操作する - Symfoware
タグ:AI MarioAI
posted by Noa at 15:35 | Comment(0) | AI | このブログの読者になる | 更新情報をチェックする

2012年03月07日

【MarioAI】GamePlay trackをeclipseから動かす。

MarioCompetition2011のGamePlay trackをeclipse上から動かせる様になったので、必要なライブラリのインストールに関してメモ。

プロジェクトのダウンロード

http://www.marioai.org/gameplay-track/getting-started

ここの「Mario AI Benchmark source package」のリンクから
プロジェクトをDLして展開します。展開すると「MarioAI」フォルダが作成されます。

使用するEclipseのバージョン

今回の動作確認ではEclipse 3.7(Indigo)を使っています。開発環境には特殊な設定などは。DL仕立ての素の状態のものを使っています。以下のライブラリの設定もこのバージョンで行った手順ということを前提に進めていきます。

GamePlay trackを動かす。

まずは、新規JPAプロジェクトを作成します。プロジェクトの名前は仮に「MarioAIGameTrack」として作成しておきましょう。作成時のパラメータ設定はデフォルトのままで構いません。

続いて、ソースコードの取り込みを行います。
「MarioAI\src」にある「amico」「ch」「competition」フォルダを全て選択し、
先程eclipse上で作成した「MarioAIGameTrack」プロジェクトの「src」パッケージに、マウス操作でまるごと放り込みます。

この時たくさんエラーが出てくるので、一つ一つエラー潰しを行なっていきます。

必要なライブラリの設定追加を行う

■org.objectweb.asmライブラリの追加
まずは、org.objectweb.asm以下を使えるようにします。

http://struts.apache.org/download.cgi

こちらより最新版の「struts-2.3.1.2-all.zip」をDLして展開。
「struts-2.3.1.2\lib」フォルダ内に「asm-3.3.jar」「asm-tree-3.3.jar」があるのでこれらをインストールします。

■org.testngライブラリの追加
続いて、org.testng以下を使えるようにします。
「struts-2.3.1.2\lib」フォルダ内に「testng-5.1-jdk15.jar」があるのでインストールします。

■juintライブラリの追加
https://github.com/KentBeck/junit/downloads

こちらより最新版の「junit-dep-4.10.jar」をDLしてインストールします。

■org.jdomライブラリの追加
続いて、org.jdom以下を使えるようにします。

http://sourceforge.jp/projects/sfnet_fpl/downloads/jdom%20as%20eclipse%20plugin/jdom%20b8/org.jdom.zip/

こちらより、「org.jdom.zip」をDLして展開。
「org.jdom」フォルダ内に「jdom.jar」があるのでインストールします。

■sun.reflect.ReflectionFactoryの禁止解除
ReflectionFactoryに関しては外部からjarをインストールするのではなく、使用制限を解除する必要があります。

setting01.png

プロジェクトのプロパティなどから、「Javaのビルド・パス」を選択。
ライブラリータブを選択しJREシステム・ライブラリーを表示します。

続いて、「アクセス・ルール」を選び編集ボタンを押します。

setting02.png

追加ボタンを押してアクセス・ルールの追加を行います。

setting03.png

解決:アクセス可能
ルール・パターン:sun/reflect/*


に設定し、OKを押すと、sun.reflect.ReflectionFactoryが使用可能になりました。


Java外部ライブラリ(*.jar)のインストール方法

外部ライブラリのインストール
http://www.mlab.im.dendai.ac.jp/~yamada/java/ext/

jarのインストールは上記サイトを参考に行いました。

設定が上手くいくとeclipseからMario AI Benchmarkを動かせるようになったかと思います。

marioaibenchmark.png

参考サイト

・BASE64Encoderを使おうとしたら「rt.jarで制限されているためアクセスできません」
http://blog.bitmeister.jp/?p=1486

・02.Struts2のライブラリとweb.xmlの設定について - soracane
https://sites.google.com/site/soracane/home/struts2nitsuite/struts2noraiburarinitsuite#TOC-2
posted by Noa at 18:09 | Comment(0) | AI | このブログの読者になる | 更新情報をチェックする

2012年03月04日

【MarioAI】ステージのレベルを変更してみる。

http://www.marioai.org/LevelGeneration/level-generation-track-source
ここの「MarioLevelCompetition2011」のコードを少しずつ解析していこうと思います。

ステージレベルの変更

2009年版などのプロジェクトでは
java ch.idsia.scenarios.Main -ag ch.idsia.agents.controllers.ForwardAgent -ld 3 -ls 5 -ll 512 -lt 2
のようにコマンドプロンプト上でオプションを指定することでステージの形状や難易度を変更することができました。この記事ではMarioLevelCompetition2011の場合でのステージレベルを変更する方法についてメモ書きしておきます。

ステージレベルを構成するクラス

ステージレベルを変更するためには、dk.itu.mario.engine.PlayCustomizedクラスを実行する必要があります。

PlayCutomized.javaの12行目辺りにあるMarioComponentクラス第3引数がステージカスタマイズを適用するか否かのフラグです。

PlayCutomizedクラスではこのカスタマイズフラグが予めtrueに設定されています。
MarioComponent mario = new MarioComponent(640, 480,true);
このフラグによって影響を受ける場所はdk.itu.mario.scene.LevelSceneTest.javaの60行目あたりです。このisCustomのフラグで、独自のステージレベルを適用するか、ランダムレベルを適用するかにわかれます。

61行目の
CustomizedLevelGenerator cls = new CustomizedLevelGenerator();
が実際にレベル情報を扱うクラスインスタンスの定義文です。
CustomizedLevelGeneratorクラスはdk.itu.mario.level.generator以下で定義されています。このCustomizedLevelGeneratorクラス以下を変更することで、独自のステージレベルを定義することができます。

CustomizedLevelGeneratorクラスについて

package dk.itu.mario.level.generator;

import java.util.Random;

import dk.itu.mario.MarioInterface.Constraints;
import dk.itu.mario.MarioInterface.GamePlay;
import dk.itu.mario.MarioInterface.LevelGenerator;
import dk.itu.mario.MarioInterface.LevelInterface;
import dk.itu.mario.level.CustomizedLevel;

public class MyLevelGenerator implements LevelGenerator
{
public LevelInterface generateLevel(GamePlay playerMetrics)
{
LevelInterface level = new CustomizedLevel(100, 50, new Random().nextLong(), 1, 1, playerMetrics);
return level;
}

@Override
public LevelInterface generateLevel(String detailedInfo)
{
return null;
}
}
14行目でLevelInterfaceクラスのインスタンスをCutomizedLevelクラスで初期化を行なっています。

CustomizedLevel(width, height, seed, difficulty, type, playerMetrics)

このクラスの各引数は、

Width : フィールドの幅
Height : フィールドの高さ
Seed : 乱数シード
Difficulty : 難しさ
Type : 地形タイプ
playerMetrics : プレイヤーデータ?


をそれぞれ指定できます。コマンドプロンプトからの設定とはいきませんが、このクラス引数をソースコード内で変更することで、独自のステージレベルを定義することができます。

以下、パラメータを何パターンか変更してプログラムを実行してみました。

CustomizedLevel(500, 15, new Random().nextLong(), 5, 2, playerMetrics);
marioai01.png

CustomizedLevel(500, 15, new Random().nextLong(), 1, 1, playerMetrics);
marioai02.png

ステージジェネレータそのものを変更したい場合

CustomizedLevelクラスを変更することで、ステージ生成方式さえもき換えることが可能です。ただ、MarioLevelCompetitionの競技的にはステージの自動生成法の変更は意味をなさないので、「ステージ自動生成の仕組みを知りたい!」という方はCustomizedLevelクラスをじっくり見るのもいいかもしれません。
タグ:MarioAI java AI
posted by Noa at 00:11 | Comment(0) | AI | このブログの読者になる | 更新情報をチェックする

2012年02月29日

ゲームAIの勉強

プロによるゲームAIの解説



プロによるゲームAIの解説動画を見ました。こういう放送もあるんですね。

マイクロキャビン社のNOONというアクションパズルゲームを題材に

実際に取り組んだAI構築の過程について、一部コードを交えながら解説されています。

企画側、プログラマ側のそれぞれの視点からの解説があり色々と勉強させていただきました。

ゲームAIの勉強といえば

y_miyakeのゲームAI千夜一夜
http://blogai.igda.jp/article/33936286.html

三宅陽一郎さんのHPにAI講演資料がまとめられているので、

じっくり読めばかなり勉強になりそうです。
posted by Noa at 03:48 | Comment(1) | AI | このブログの読者になる | 更新情報をチェックする

2012年02月25日

【AI】Mario AI Competition動かしてみた



スーパーマリオの動きをAIを使って制御しようというプロジェクトです。
このプログラムが動かせるということで動かしてみました。
ゲームを実行するにはいくつかやり方があったので、各方法についてメモしておきます。

2009年版プロジェクト

http://julian.togelius.com/mariocompetition2009/gettingstarted.php
こちらの右上より「source code」のリンクをクリックし「marioai.zip」をDLして展開する。
展開された「marioai」フォルダを適当な位置に移動する。Ex.「C:\marioai」

続いて、コマンドプロンプトを開いて以下を実行する
cd C:\marioai\classes
java ch.idsia.scenarios.Play

marioai2009.jpg

するとこんな感じのマリオゲームが実行される。
クリアするか敵にあたってゲームオーバになるとゲームが終了し
コマンドプロンプト上にゲーム内スコアが表示される。

操作方法
・左右矢印キー:左右移動
・下矢印キー:しゃがむ
・Sキー:ジャンプ
・Aキー:ダッシュ

また、プログラム実行時にエージェントプログラムを引数で割り当てる事ができる
java ch.idsia.scenarios.Play ch.idsia.ai.agents.ai.ForwardAgent

このエージェントファイルはマリオがただ右に動き、
壁や敵がいたらジャンプで避けるエージェントプログラムです。

「marioai\classes\ch\idsia\ai\agents\ai」に様々なエージェントファイルがあります。

中には動かないものもありましたが、いろいろ動かして試してみると面白いです。

2011年版プロジェクト

http://www.marioai.org/gameplay-track/getting-started
こちらのサイトから「Mario AI Benchmark source package」をクリックしてダウンロードします。

展開された「MarioAI」フォルダを適当な位置に移動させる。Ex.「C:\MarioAI」

コマンドプロンプトを開き以下を実行する。
cd C:\marioai\bin\AmiCobuild\PyJava
java ch.idsia.scenarios.Main

marioai2011.jpg

こんな感じで実行されます。2009年版はPlayでしたが、今回はMainで実行します。
2009年版とはあまり代わり映えしません。2011年年版はゲーム終了時に
コマンドプロンプトに詳細な情報が出力されるようになっています。

[~ Mario AI Benchmark ~ 0.1.9]

[MarioAI] ~ Evaluation Results for Task: BasicTask
Evaluation lasted : 99668 ms
Weighted Fitness : 4385
Mario Status : Loss...
Mario Mode : small
Collisions with creatures : 3
Passed (Cells, Phys) : 177 of 256, 2845 of 4096 (69% passed)
Time Spent(marioseconds) : 162
Time Left(marioseconds) : 37
Coins Gained : 71 of 285 (24% collected)
Hidden Blocks Found : 0 of 0 (0% found)
Mushrooms Devoured : 0 of 0 found (0% collected)
Flowers Devoured : 0 of 0 found (0% collected)
kills Total : 2 of 40 found (5%)
kills By Fire : 0
kills By Shell : 0
kills By Stomp : 2
MEMO INFO: Reason of death: Collision with a creature [Goomba]

2011年版のエージェントプログラムの実行も2009年とは少し違います。
実行ファイル名の後に「-ag」オプションを追加した後にエージェントファイルを指定します。
java ch.idsia.scenarios.Main -ag ch.idsia.agents.controllers.ForwardAgent

また、更にオプションを追加することでゲーム内容を変更させることも可能です。

・ステージ難易度の設定
-ld (num)
ステージの難易度をnumだけ上昇させる。デフォルト値は0。

・乱数シードを設定
-ls (num)
乱数シードをnumに変更する。デフォルト値は0。

・ステージの広さを設定
-ll (num)
ステージの幅をnumに設定する。デフォルト値は256。

・ステージ番号を設置
-lt (num)
ステージ番号をnumに設定する。デフォルト値は0。
0:Overground(0)
1:Underground(1)
2:Castle(2)

その他数多くのパラメータがあるが、詳しくは
「MarioAI\src\ch\idsia\utils\ParameterContainer.java」
を参照。

試しに以下を実行するとこうなります。
java ch.idsia.scenarios.Main -ag ch.idsia.agents.controllers.ForwardAgent -ld 3 -ls 5 -ll 512 -lt 2

marioai2011_customised.jpg

設定したオプションのようにステージパラメータが変更されています。

やっぱEclipseで動かしたい。

コマンドライン上で動かすのではなくEclipse上で動かしたいと思います。
成功した例に関してメモします。

http://www.marioai.org/LevelGeneration/level-generation-track-source
こちらの「MarioLevelCompetition2011」をクリックしダウンロードします。
「MarioLevelComp2011」が展開されると思います。

このプロジェクトも同様に
cd C:\ MarioLevelComp2011\bin
java dk.itu.mario.engine.Play

のように入力することで以下のゲームが実行できます。
mariocompetition2011.jpg

アイテム取得時の時間停止表現がついていて、上記2つと比べても一番マリオっぽいです。

このプログラムに関してEclipseで動いたので、動かし方についてメモします。
「MarioLevelComp2011」にある「src」フォルダを、
Eclipse上で新規作成したJapaProjectの「src」に移動させて実行すればOKです。

setup.jpg

いろいろ聞かれるかもしれませんがとりあえずOKでも問題ないと思います。

参考サイト

・Mario AI Competitionを動かす - Symfoware
http://symfoware.blog68.fc2.com/blog-entry-120.html

・Kanpe’s one step: Mario AI Competition 2009->2011 移行
http://kanpe777.blogspot.com/2011/11/mario-ai-competition-2009-2011.html
posted by Noa at 02:25 | Comment(0) | AI | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。