[インターン生レポート]「Tron」ゲームをアンドロイドアプリにしました

こんにちは、技術インターン担当です。
KLabでは、技術に興味のある学生さんを随時インターン生として受け入れています。
技術系インターンは、学生さん自身とメンター(技術者)が相談して決めた課題に対して周囲の技術者/企画者とコミュニケーションを取りつつ取り組むというスタイルで進行します。

実際に課題へ取り組んでいく中では、当初想定しなかった問題に行き当たったり、逆に想定以上の良い結果が出たりと様々なことが起こります。そういった学生さんの声をこのblogに掲載することで、KLabでのインターンへ興味を持って下さる学生さんにイメージを膨らませてもらえれば、と考えています。技術インターンに興味を持たれた方は、是非 技術系インターンシップ応募ページ からご応募下さい。

また、短期間でアプリやサービスのプロトタイプを開発する 優勝賞金30万円の夏季特別インターン、「プロトタイピングラボ」も9/2(日)まで応募受付中ですので、とにかく動くものを作ってみたいという方は是非!

さて、今回は7月にAndroid向けアプリの開発へ取り組まれた学生さんのレポート全文を掲載します。
—-

KLabでインターンシップをしました。

  • 期間: 2012年7月23日から31日(7日間)
  • 部署: 開発部
  • メンター: 中澤さんと丸山さん

【やったこと】

「Tron」というゲームをアンドロイドアプリとして作りました。「Snake」に似たゲームです。線や画面のはじにぶつかると負け、ゲームの目的はできるだけ長く残ることです。

■操作方法

指を上下左右にスライドさせることで、線の進む方向を変えられます。

■特徴

他のアプリと違うところは、誰でも自分で作ったAIプレイヤー(コンピュータが操作するプレイヤー)を、このゲームに組み込めることです。他者が作ったAIプログラムは別のアプリとしてインストールし、Tronゲーム本体がそのAIアプリを呼び出し、ゲームを続行する仕組みです。詳細は下【API】を参照してください。

↑プレイヤー一覧
一番上の「You」が自分で、その他は対戦可能なAIアプリ

↑8人同時プレイ(7人はAI)

【学んだこと】

アンドロイドの正式なAPIについて学びました。Javaはインターンをする前から触れたことがありましたが、アンドロイドAPIは初めてでした。その他にKLabがどのようなところなのかなど、知ることができました。
主に以下について学びました:

  • アンドロイドAPIの基礎知識
    • 簡単なUIを作ること(レイアウトファイルとActivityの関係を知る)
    • UIのリストにアイテムをランタイムで入れること
    • 画面上に絵を描くこと(ViewのCanvasに描画)
    • 他のアプリと通信すること(外部のServiceを呼び出し、Messengerを使って通信)
    • 「ロード中」と画面に表示すること(AsyncTaskを使ってフリーズ防止)
    • 画面切り替えすること(Intentで別のActivityを起動)
    • 画面切り替え時にデータを渡すこと(Parcelableを使ってデータを渡せるようにする)
  • 会社の雰囲気
  • 開発部の方々について

【もっと時間があればやりたかったこと】

  • 予想通りに動作しない部分があるので、それらを直すこと
  • 複数の端末間での対戦機能の追加
  • 障害物などを含めたマップを選択できる機能の追加
  • タブレットなど、他の機械を使って試験
  • その他改善(プレイヤー数の制限(8人まで)の解除、タッチでもっと複雑で細かい動きを可能にする、など)

【よかったこと】

■職場

職場の雰囲気がとてもよかったです。パーティションに区切られた息苦しい灰色のオフィスをイメージしていましたが、それとは裏腹に、カーペットや壁は楽しいデザインで、リビングスペースの様なものもあり、一人ひとりに十分なスペースを設けていて、テレビで見たGoogleのオフィスを思い出させました。社員の方々もとてもフレンドリーでした。とても働きやすい環境だという印象を受けました。

一番よかったと思った点は、開発部の方々が自分の空いている時間などを使って、興味深い実験・発見・開発を行っていることです。ちょうど一ヶ月に一度行われる社内プレゼン大会で知ることができました。本当に好きでこの仕事をしているのだということが感じられました。

勉強会なども開いているようなので、それらにも参加してみたかったです。

■インターンシップ

自分のやりたかったこと・はまっていることをメインに、プロジェクトを進められることがよかったです。また、メンターの方々が付きっ切りで、分からないことがあると一緒に考えたり、アドバイスをしてくれるので、プロジェクトはとてもスムーズに進みました。コードのレビューなども入れてもらい、とてもためになりました。

又、毎日色々な社員の方々と昼食に行き、どのようなプロジェクトに取り組んでいるのかなども聞くことができました。

【こうしたらさらによくなると思った点】

開発部以外に、企画やクリエーティブでどのようなことをしているかということも少し気になりました。
又、2週間インターンシップをする方に対しては、1週間目が終わってから、大勢でレビューを入れる機会も設けるとよいのではないかと思いました。その他に、アメリカのインターンシップのように2ヶ月期間のオプションものもあれば、実際入社後どのような仕事を任されるのかなどもっと詳しく知ることができる気がしました。

【自己紹介】

22歳です。ミシガン大学を機械工学専攻で卒業し、2012年9月からペンシルバニア大学の大学院に入学する予定です。人生半分ほど海外で過ごしていました。

KLabのインターンシップについては、2012年6月30日と7月1日に開催された東京キャリアフォーラムで知りました。

趣味でプログラミングをします。主にJavaScriptやActionScriptでゲームを作るのが好きです。その他にYouTubeやGoogle AppsのAPIなどをいじるのが好きです。Javaは学校で習っただけで、あまり使っていませんが、アンドロイドの基本が分かった今、この分野でもいろいろ実験したいと思っています。

【API】

このセクションにはAIの組み込み方法が記述されています。
ファイルと最新情報はGithubを参照してください。

■概要

AIはゲーム本体とは別のアプリケーションで実行します。
ゲーム本体のアプリがAIのアプリのServiceを呼び出し、通信し合うようにできています。

■必要な環境

  • アンドロイド2.2以上
  • EclipseのJavaコンパイラーがバージョン1.6

■必要なファイル

ゲームを開始するには、以下の2つのアンドロイドアプリケーションが必要です:

  1. ゲームを表示し、動かすアプリケーション(Tron)
  2. ゲームを操作するAI(TronServiceSample)

注意

  • 「設定」の「提供元不明のアプリ」にチェックが入っていることを確認してください(「セキュリティ」または「アプリケーション」内にあります)
  • 自分でAIを作る時、Eclipseからインポートした後、コードにエラーが出た場合、Javaコンパイラーがバージョン1.5でなく1.6を使用してることを確認してください。
  • 現在のTronServiceSampleには7つのAIがまとめて含まれています。

■手順

  1. TronServiceSampleのアプリを端末にインストール・実行する。
    Hello World, TronServiceSampleActivity!と黒い背景の画面に表示されるはずです。
  2. Tronのアプリを端末にインストール・実行する。

■AIのコードを書く

TronServiceSample/src/com/MyAI.javaのファイル内を編集します。
現時点では、開いているマスを適当に選んで、そちらの方向に進むように書かれています。
以下が重要な関数です:

protected int compute(int[] info, byte[] mapData, int[] x, int[] y) {

	// Store message content
	int numColumn = info[0];
	int numRow = info[1];
	int numPlayer = info[2];
	int meIndex = info[3];

	// Direction to return
	int result = LEFT;
	...
	return result;
}

この関数は約33ミリ秒ごとに呼ばれます。この時間以内に返事をしないとゲームは前回と同じ方向に進みます。
パラメーターの意味は以下の通りです:

  • info[0]   横のマス数(デフォルト「50」)
  • info[1]   縦のマス数(デフォルト「50」)
  • info[2]   プレイヤーの数(デフォルト「2」)
  • info[3]   自分がどのプレイヤーなのかを示す。「プレイヤー0」なら「0」、「プレイヤー1」なら「1」。(デフォルト「0」)
  • mapData ゲームマップの状況を示す。0なら踏み込んで大丈夫。1なら、すでに誰かが通ったので踏み込むと負けます。盤面サイズがNxNの座標(x, y)はmapData[y * N + x]で取得できます(デフォルト:サイズ「2500」)
  • x[]     プレイヤーのX座標(「プレイヤー0」の位置はx[0]とy[0]で読む。「プレイヤー1」の位置はx[1]とy[1]で読む。よって自分の位置はx[info[3]]とy[info[3]]になります)
  • y[]     プレイヤーのY座標
  • リターン  0(←),1(↑),2(→),3(↓)のどれかを戻してください、次に行く方向を示します(LEFT、UP,RIGHT、DOWNにそれぞれのintが保存されているのでそれも使えます)
  • アプリはGoogle Playにそのうち出す予定です。

——————————————————————————————————————–

※技術インターンに興味を持たれた方は
是非、技術系インターンシップ応募ページ からご応募下さい。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中