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

» 2004年11月01日 22時55分 公開
[澤橋辰典・武上将樹,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.

アクセストップ10

2026年09月19日 更新
  1. IIJに聞く“eSIMサポート”の裏側 「つながらない」「消した」なぜ起こる? 現場が打つ次の一手 (2026年09月18日)
  2. 出そろった「iPhone 18 Pro」の価格を4キャリアで比較 ソフトバンクが衝撃の安さ、楽天モバイルが異例の施策 (2026年09月13日)
  3. 「iPhone 18 Pro」は何が進化した? 「iPhone 17/17 Pro」とスペックを比較 全て20万円超えの価格が悩ましい (2026年09月10日)
  4. iPhone Duoを「開いたままでも片手で持てる」ケース登場 ESRが新製品発表、日本で急成長の理由とは (2026年09月17日)
  5. 「Suicaのペンギン」卒業騒動にまつわる背景と誤解 JR東日本に聞いた (2025年11月14日)
  6. Androidでおサイフケータイを使いたくない理由 初期化で消えないデータと売却時の落とし穴 (2026年09月19日)
  7. 15日配信「iOS 27」の新機能まとめ Siri AIの恩恵を受けられる機種は? 画像編集やSafariにも注目 (2026年09月14日)
  8. ドコモのiPhone、iOS 27でRCSに対応 3キャリアのiPhoneとAndroidで利用可能に (2026年09月17日)
  9. JR東日本「分かりにくい」新幹線券売機を改善へ なぜ、スマホではなく「駅での最短1分購入」を実現? (2026年07月04日)
  10. 「世界初」ソフトバンクらが成層圏HAPSのリアルタイム追尾とレーザー測距に成功 光無線通信へ大きな一歩 (2026年09月17日)
最新トピックスPR

過去記事カレンダー