読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習、Deep Learning、Kerasに関する記事が多いです。



Javagame

スクロール処理1

今までのプログラムはなんかドラクエっぽくないですよね。私も作っててどこか違うと違和感を持ちました。そんなわけでドラクエを取り出してプレイしてみたところあることに気がつきました。ドラクエでは移動しても勇者の位置は常に画面の中央なんですね。勇…

オブジェクト化

今まで作ってたプログラムはMainPanelクラスにすべての機能をつぎ込んでいました。今回はこれらの機能を別々のクラスに分割してJavaの特徴であるオブジェクト指向をフル活用していきます。今回はキャラクターを表すCharaクラスとマップを表すMapクラスを作り…

ハイスコアランキングの作り方

CGIへスコア情報を送信する(2005/8/7)でJavaプログラムからCGIへスコア情報を送信できました。また、サーバー上のファイルにスコアを保存する(2005/8/15)で送信されたスコア情報をサーバー上のファイルに保存できるようになりました。今回は最後の手順と…

サーバー上のファイルにスコアを保存する

CGIへスコア情報を送信する(2005/8/7)の続きです。前回はCGIへスコアを送りましたが CGI側でそのスコアを保存していませんでした(ハイスコア出した人ごめんなさいってなってしまいます)。今回は、CGI側でスコアを保存する処理を追加します。CGIはサーバ…

CGIへスコア情報を送信する

(注)サーバは解約したのでスコア登録はできません。ご自身のサーバに置き換えてください。サーバ上にあるCGIに接続し、スコア情報を送信するサンプルプログラムを書いてみます。ここではCGIをPerlという言語で書いています。 ServletやJSPを使うことでJava…

コインブロック

今回は、下から叩くとコインになるブロック を導入します。左が叩く前で右が叩いた後のイメージです。ブロックはコインやアイテムと作り方が違うので注意してください。コインやアイテムはSpriteを拡張していますが、コインブロックはただのブロックと同じ扱…

二段ジャンプ

前に加速アイテムを導入しましたが、今回はもう1つ別のアイテムを追加してみます。じゃーん、このアイテムを取るとなんと二段ジャンプできるようになります。どっから二段ジャンプが出てきたかというとアクトレイザーというアクションゲームで二段ジャンプが…

キー入力改良

地味ですがキー入力の改良です。前回まではジャンプキー(↑キー)を押し続けると、押している間は何回もジャンプしてしまいます。一般的には、ジャンプキーを1回押したら1回だけジャンプする方が自然です。一方、左右への移動はジャンプと違って押し続けてい…

アイテムでパワーアップ

パワーアップアイテムを導入してみます。某ゲームみたいに巨大化するアイテムがよかったんですが少し難しいので加速するアイテムを作ってみました。2つあるのはアニメーションのためです。切り替えると点滅しているように見えます。アイテムの実装はコインの…

コインの実装

コインを実装してプレイヤーが取れるようにします。mariolike07.jar スプライト コインクラスを実装する前にスプライトを作ります。スプライトの定義はよく知らないのですが画面上に出てくるキャラクターとかそんな意味で使っています。さっぱりしておいしい…

栗ボー登場

ここで敵キャラを作ります。その名も栗ボー(自作)です。はい!登場。プレイヤーが踏んだら倒せるようにします。ちなみに画像が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) { ・・・ /…

マウスで石を打つ

盤面に白石と黒石を交互に打てるようにします。打ったときにはカチッっと気持ちい音が鳴るようにもしています。othello02.jar マウスで石を打つ 盤面をマウスでクリックしたとき石が打たれるようにするためにmouseClicked()を実装します。 public void mouse…

オセロ盤を作る

まず手始めにオセロ盤を描くところまで作ります。othello01.jar オセロ盤の構造 盤面の構成は下の図のようになってます。オセロ盤は2次元のint型並列で表現します。 // 盤面 private int[][] board = new int[MASU][MASU]; 盤面に入る数字は何もないとき0、…

マウスクリック

マウスで画面をクリックすると点が描かれるプログラムを作ります。マウスはキーボードと並んで基本的な入力インタフェースなので簡単なプログラムを書いて慣れておくといいです。mouse_click.jar クリックイベント マウスのクリックイベントを検出するにはま…

イメージを表示する

イメージを表示してみます。ゲーム作成ではイメージを頻繁に使うためとっても重要です。draw_image.jar イメージの表示 JavaがサポートしているのはGIF、JPG、PNGです。BMPも表示できるにはできますが実装は少し面倒です。ここではGIFを使いますが、JPG、PNG…

WAVEの再生

音を鳴らしてみます。ただ鳴らすだけではつまらないのでボールが跳ねるプログラムを改造し、ボールが壁に当たったら「ポン」と鳴るようにしてみます。ちなみに効果音はwav形式のファイルを使います。効果音はザ・マッチメイカァズさんからお借りしました。so…

勇者はがにまたが直った

前回までの勇者はどの方向に移動してもこっちを向いていました。ドラクエ1と同じです。これだとあまりかっこよくないので移動する方向をちゃんと向くようにしてみます。rpg06.jar 四方向の画像を用意する 用意した画像は下のです。前回と同じく足踏みさせる…

勇者は足踏みした

前回の勇者は移動はできますが足踏みしてませんね。足踏みってのは言うまでもないと思いますがのことです。rpg05.jar アニメーション ボールを動かす(2004/9/19)にも書きましたが、アニメーションはいくつかの画像を順番に切り替えることで作れます。今回…

勇者は壁にぶつかった

勇者が壁にぶつかるようにしてみます。あっ、別に挫折するわけじゃないですよ(笑)rpg04.jar 壁にぶつかる処理 壁にぶつかる=壁のあるマスには移動できないようにするということです。なので、前回勇者の移動処理を書いていたkeyPressed()から見てみます。…

ボールをたくさん作る

跳ね返るボールを複数作ってみます。今回はボールを表すクラスを別途作りました。このクラス(オブジェクトの雛形)を用いればいくつでもボールが作れます。オブジェクト指向が非常に強力な仕組みであることを理解してください。オブジェクト指向については…

勇者は第一歩を踏み出した

マップに勇者を乗せて移動できるようにしましょう。勇者が第一歩を踏み出すときがきました。rpg03.jar 勇者をキーボードで動かす まず勇者がマップ上のどの位置にいるかを表す変数(x,y)を用意します。そして、勇者の位置を(1,1)に初期化しています。これは、…