連載
» 2004年11月01日 22時55分 公開

90Xi専用ゲームiアプリ開発講座:第3回 簡単なゲーム作成の流れを身に付ける (2/2)

[澤橋辰典・武上将樹,ITmedia]
前のページへ 1|2       

乱数を使用するために、java.util.Randomをインポートする

import java.util.Random;

ランダムオブジェクトを生成する

static final Random ran = new Random();

生成したランダムオブジェクトを以下のように使用すると整数値の乱数を取得できる

ran.nextInt();

 このメソッドで返ってくる値はintが表現できるすべての値なので、-2147483648 〜 2147483647(-2^31 〜 2^31-1)の間の値になる(0を含む)。例えば、-100〜100の値を使用したければ、以下のようにすれば、-100〜100の整数値が返ってくる。

ran.nextInt() % 101;

 直感的に利用できるように、最小値と最大値を渡すとその間の乱数を返してくれるメソッドranRangeを次のように作成した。

private static int ranRange(int start, int end) {
 int retrand;
 int range  = (end - start) + 1;
 do {
  retrand = Math.abs(ran.nextInt() % range);
 } while (retrand == 0);
 return retrand + start -1;
}

簡単なゲームを作成しよう

 今回はシーン遷移に慣れるために、少ない画面数で単純明快なルールのカードゲームを作成する。そこでゲームのルールは以下のように設定した。

  • ゲームの開始では、自分と対戦相手にそれぞれ3枚ずつカードが配られる
  • カードは1〜9の値を持っていて、3枚のカードは値の合計が15になるように配られる
  • 配られたカードを1枚ずつ、3回出し合って勝敗を競い、勝利数の多いほうが勝ちとなる

 ソースコードはここからダウンロードできる。では、実際にソースを見ながらゲームの流れを追ってみよう。

 シーンがSCENE_TITLE時のメイン処理では、決定ボタンが押されると、カードをセットして、シーンをSCENE_GAMEに移している。

   case SCENE_TITLE:
    if (event == Display.KEY_SELECT) {
     stockP = cardSet(15);
     stockE = cardSet(15);
     turn = 1;
     scene = SCENE_GAME;
    }
    break;

 自作のメソッド、private static int[] cardSet(int max) は、引数に11〜19を指定すると、合計値が引数の値になるように、ランダムな値が格納された長さが3の整数型配列を返してくれる。ゲーム中のプレイヤーと相手の所持カードの値はstockP,stockEというint型配列に保持している。

 バトルが始まると、左右キーでカーソルを動かしてカードを選び、決定キーが押されると、自分のカードと相手のカードの数値を比較し、数値の高いほうがそのターンの勝者となる。勝敗の結果は変数statusに保持される。statusの値が示す情報は以下の通り。

0:未勝負, 1:勝ち, 2:負け, 3:引き分け

 バトル中の画面の描画は、プレイヤーのカードを右下に、対戦相手のカードは左上に配置し、上から黒く塗りつぶして不可視状態にしている。カードの横にはそのカードの勝敗結果が表示される。

for (int i=0;i<3;i++) {
 //自分のカードを表示(右下)
 g.drawImage(img[stockP[i]-1], 60+(i%3*60), 200);
 //敵のカードを表示(左上)
 g.drawImage(img[stockE[i]-1], 10+(i%3*60), 20);
 
 //カード毎の勝敗情報を表示
 if (status[i] == 1) {
  g.drawString("Win", 80+(i%3*60), 190);
 } else if (status[i] == 2) {
  g.drawString("Lose", 80+(i%3*60), 190);
 } else if (status[i] == 3) {
  g.drawString("Draw", 80+(i%3*60), 190);
 }
 if (status[i+3] == 1) {
  g.drawString("Win", 30+(i%3*60), 85);
 } else if (status[i+3] == 2) {
  g.drawString("Lose", 30+(i%3*60), 85);
 } else if (status[i+3] == 3) {
  g.drawString("Draw", 30+(i%3*60), 85);
 }
 
 //まだ開かれていない敵のカードを塗りつぶす
 if (turn-2 < i){
  g.fillRect(10+(i%3*60), 20, 50, 30);
 }
}

 3回勝負が済むと、勝敗結果が表示され、ソフトキー2(右上のオプションキー)を押すと、バトル中に使用した変数を初期化してタイトルへと戻る。

次回はカードの生成にチャレンジ

 今回はゲーム作成の一連の流れを理解してもらうために、画面遷移を書き、シーン別にイベント処理と描画処理を行う簡単なカードゲームを作った。しかし、これだけではカードの収集、交換ができず、トレーディングカードゲームと呼ぶにはまだ足りない。

 次回は900iに標準で搭載されているカメラを用いて、撮影した画像を解析し、カードを生成するというカッコイイ処理を解説する。また、生成されたカードがどんどん増えてくると、ゲームのデータを保存する必要が生じるため、「スクラッチパッド」と呼ばれる記憶領域にデータを保管することになる。この方法も併せて解説する予定だ。

筆者紹介──澤橋辰典・武上将樹

 ケータイアプリ(iアプリ/EZアプリ/Vアプリ)のNo1ポータルサイト「アプリ★ゲット」を運営するスパイシーソフトに勤務。

 澤橋は学生時代、iアプリのコンテストでゲームアプリやツールアプリを制作し、入賞経験がある。また、所属していたサークルの後輩に、ものづくりの楽しさやアプリの奥義を授け、その後輩も入賞していることから、自らをiアプリエヴァンジェリスト(伝道者)と呼んでいる。現在も大手企業にOEM提供しているアプリの開発を行っている。

 武上は、イーアクセスとの共同事業「どこでも読メール」や、各社にOEM提供しているアプリメールサービスなどで、主にサーバサイドやデータベースまわりの開発を担当している。ゲームアプリは、もっぱらプレイ専門。

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

この記事が気に入ったら
ITmedia Mobile に「いいね!」しよう