人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

Javagame

栗ボー登場

ここで敵キャラを作ります。その名も栗ボー(自作)です。はい!登場。プレイヤーが踏んだら倒せるようにします。ちなみに画像が2つあるのはアニメーションのためです。2つの画像を交互に表示させるとジャンプしてるように見えます。mariolike08.jar Kuribo…

マップを読み込む

マップをファイルから読み込めるようにMapクラスを拡張します。基本的にRPGのマップの読み込みと同じです。これで自由にステージを作れるようになります。mariolike06.jar マップファイルの構造 マップファイル(map01.dat)の中身は次のようになってます。…

イメージを使う

ここでイメージを使ってもっとゲームっぽくしてみます。イメージを使う詳しい解説はイメージを表示するやImageIconを使ったイメージのロードにあるのでそっちを見てください。mariolike05.jar マップにイメージを使う まず使うイメージを用意します。今回は…

マップスクロール

マップが大きくなったとき画面がスクロールするようにします。横スクロールも縦スクロールも基本は同じなので横スクロールのみ扱います。RPGのスクロールとほとんど同じなんですがもっといいやり方がわかったので詳しく解説します。mariolike04.jar オフセッ…

ブロックとの衝突

マップ(ステージ)を作ります。マップにはブロックがありプレイヤーとぶつかるようにします。mariolike03.jar マップの作成 まずはマップを作ります。基本的にRPG編のお城を建てると同じです。RPGでは上から見たマップ(鳥瞰図)ですが、横スクロールアクシ…

ジャンプ

↑キでジャンプできるようにしてきます。ジャンプをかっこよく見せるには重力を実装する必要があります。mariolike02.jar ジャンプ処理 Playerクラスのjump()を見てください。 /** * ジャンプする */ public void jump() { if (onGround) { // 上向きに速度を…

左右移動

まずは、キー入力でプレイヤーを左右に移かすとこまで作ります。←キーと→キーで移動します。mariolike01.jar 位置と速度 Playerクラスを見てください。横スクロールのアクションゲームでは位置と速度によってプレイヤーを動かします。 // 位置 private doubl…

ニューラルネットによる逃避行動の学習

ニューラルネットによるパターン認識(2005/5/5)を紹介しましたが、これがゲームと何の関係があるんだと思った方が多いと思います。今回はニューラルネットをゲームに応用する方法を簡単なサンプルで解説します。ニューラルネットを持った獲物に追跡者から…

ぴこぴこ音

ゲームらしく効果音をつけてみます。今回つけるのは弾の発射音、エイリアンの断末魔、プレイヤーの爆発音です。ここではWAVEの再生(2004/10/3)と同じくAudioClipを使います。AudioClipは同時再生ができないという問題があります。これを解決するにはJava S…

ニューラルネットによるパターン認識

3層パーセプトロンと呼ばれるニューラルネットを用いたパターン認識のサンプルです。ニューラルネットがどういうものかという解説はまた後でしますが、ここではサンプルの遊び方だけ書いておきます。まあゲームではないんですが・・・pattern_recognition.ja…

LOS追跡

照準(Line-of-Sight: LOS)法を使った追跡アルゴリズムを実装してみます。環境はタイルベースです。LOS法を使うと獲物に対して最短経路(つまり直線)で移動できます。最短経路を求めるためにブレゼンハムアルゴリズム(2005/4/2)を使います。獲物(青い点…

ブレゼンハムアルゴリズム

ブレゼンハム(bresenham)というアルゴリズムを使ってタイル環境で直線を描画するサンプルです。ブレゼンハムはペイントソフトの直線描画にも使われているそうです。ペイントの直線描画と同じようにドラッグすれば直線が引けます。bresenham.jar ブレゼンハ…

単純な追跡アルゴリズム

もっとも単純な追跡アルゴリズムを実装してみます。環境はタイルワールドで追跡者が獲物を追いかけます。プレイヤーは矢印キーで獲物を操作でき、追跡者はAIが操作します。絶対逃げ切れないけどせいぜいがんばってください(笑)chase_test.jar 追跡処理 追…

エイリアンの攻撃

エイリアンがビームを撃つようにします。invader06.jar ビームの実装 エイリアンが発射するビームを実装します。まずShotクラスを全部コピーしてください。これで9割方完成です(笑)プレイヤーが発射する弾とエイリアンが発射するビームはほとんど同じです…

衝突判定

プレイヤーが撃った弾がエイリアンにあたるとエイリアンが消滅するようにします。invader05.jar intersects()を用いた衝突判定 エイリアンと弾の衝突判定を実装するわけですが、エイリアンの外周はかなり複雑で弾があたったかどうか判断するのは難しいですね…

エイリアン襲来

エイリアンを実装します。invader04.jarまずはエイリアンの属性と機能をまとめたAlienクラスを作ります。エイリアンの属性として private int speed; // 移動スピード private int x; // プレイヤーの位置(x座標) private int y; // エイリアンの位置(y座…

連続発射

連続で弾を発射できるようにします。invader03.jarShotを下のように配列で管理すれば複数の弾を作れます。今回は5発の弾を連続で撃てるようにするので弾の数(NUM_SHOT)を5としました。コンストラクタでは5発の弾を作り、配列に入れています。 // 連続発射…

弾の発射

プレイヤーが1発だけ弾を発射できるようにします。invader02.jar 弾の実装 弾1つ1つをオブジェクトとして扱うためShotクラスを用意します。弾もプレイヤーと同じく下のような属性が必要になります。 // 弾のスピード private static final int SPEED = 10; /…

プレイヤーの移動

キー入力でプレイヤーが移動するところまで作ります。インベーダーゲームではプレイヤーは左右にしか移動できないので←キーと→キーを使います。invader01.jar プレーヤークラス まずはプレイヤーの属性と機能をまとめたPlayerクラスを作ります。プレイヤーの…

AIの実装/α-β法

ミニマックス法を改良したα-β法を実装してみます。α-β法は枝刈り(必要のないところは先読みしないこと)をすることによって効率的に先読みを行うアルゴリズムです。ミニマックス法より深く先読みができるためAIを強くすることができます。ゲーム木の解説は…

強化学習で迷路の最短経路を見つける

強化学習というアルゴリズムを用いて迷路の最短経路を学習するプログラムを作ってみます。迷路を抜ける方法は右手法とかいろいろありますが、ここではあえて学習を用います。強化学習は試行錯誤と報酬から学習するアルゴリズムです。ゴール地点には報酬が置…

盤面評価/石の場所

また盤面評価です。前は石の数で評価していましたが、今回は石の場所で評価します。たとえば、角に石を打つのは有利だとか端に石を打つのが有利だとかをAIが考慮できるようにします。othello09.jar 各場所の価値 オセロを何回かやってると「4端や辺を取ると…

パスを実装する

前回までのプログラムはパスを実装していなかったため最後までプレイできませんでした。そこで今回はパスを実装してみます。othello08.jar 石を打てる場所を数える どこにも石が打てなくなった場合にパスをします。というわけでまず石を打てる場所の数を数え…

キーボードの使い方

画面上の●が矢印キーで移動できます。またXキーを押すと●の色がランダムに変化します。key_test.jar キーイベント キーボードが押されたか検出するにはまずKeyListenerインタフェースをimplementsし登録します。これはマウスクリック(2004/10/16)の検出にM…

盤面評価/石の数

ようやく盤面評価を導入します。ミニマックス法のゲーム木における一番末端のノード(葉)の評価値にあたります。盤面評価はオセロにとって非常に重要な要素です。othello07.jar 盤面評価 盤面評価とはある2つの盤面があったときどっちが有利かを判定するこ…

AIの実装/ミニマックス法

コンピュータと対戦できるようにAIを実装します。ここでは思考ゲームのもっとも基本的なアルゴリズムであるミニマックス法について解説します。othello06.jar プレイヤーとAIが交互に打つ AIとは人工知能(Artificial Intelligence)のことです。人工知能っ…

ライフゲーム

人工知能というより人工生命の分野ですが最初はライフゲームを作ってみます。ライフは人生という意味もありますがライフゲームは人生ゲームとはまったく関係ありません。とある理由でJARではなく自己解凍exeにしました。解凍したらclickme.batをダブルクリッ…

はさんだ石をひっくり返す

はさんだ石がひっくり返るようにしてみます。othello04.jar 石をひっくり返す 石をひっくり返す処理はmouseClicked()で呼び出しているreverse()です。 public void mouseClicked(MouseEvent e) { // どこのマスかを調べる int x = e.getX() / GS; int y = e.…

勝敗を判定する

勝敗判定機能をつけます。また黒と白の石の数が上部に表示されるようにします。othello05.jar 石の数を数える 勝敗を判定するにはまず黒と白の石の数を数える必要があります。countStone()で数えています。 private Counter countStone() { Counter counter …

石が打てる場所か判定する

オセロで石が打てる場所は相手の石をひっくり返せるところだけです。今回は石が打てる場所を判定する処理を実装します。othello03.jar 石が打てるか判定する 石を打つmouseClicked()に注目してください。 public void mouseClicked(MouseEvent e) { ・・・ /…