Androidで簡単ゲーム作成!!アイテムガチャやモンスターの出現率などを抽選するガラポン風便利クラスをつくってみた。

こんにちは。西間木です。

ゲーム系のアプリをつくるときに、アイテムやモンスターの”出現率”によって、抽選をするような仕組みが必要になることってありますよね?

本日は、Androidアプリ用にアイテムなどの抽選ができるような、Javaのutilクラスを作ってみましたのでご紹介いたします。

シンプルなクラスにしたので、アイテムをGETするようなガチャや、モンスターをコレクションするようなゲームなどで、拡張したりして使っていただけたら嬉しいです!


実装のイメージ

今回実装するクラスのイメージは、よく福引などで使われるガラガラ回して玉が出てくるあれです。どうでも良い話ですが、ちなみにあれは「ガラポン」って呼ばれているみたいです。

いろんな種類のアイテムまたは、モンスターがガラポンに入っていて、使うときにそのガラポンをぐるぐる回して一つ取得してくるようなクラスになります。レア度が高いもの(金の玉)は、ガラポンに入っている量が相対的に少ないといったイメージです。

garapon

簡単な設計

このクラスは、

  • ロールは、サービス提供役になります。
  • 抽選に使用するガラポン(抽選BOX)を知っています。
  • アイテムとその確率が構造化されたデータとコラボレートします。(ガラポンに玉を準備する)
  • ガラポンを回して、アイテム(玉)を1つ取得します。

そんなクラスです。


実装の説明

では、実際の実装を見てみましょう。

コンストラクタ

    // メンバ変数 - ガラポン(抽選BOX) 
    private List mLotBallList;

    /**
     * コンストラクタ
     * 
     * @param Map
     */
    public Lottery(Map lotteryMap) {
        mLotBallList = createLotteryBox(lotteryMap);
    }

まず、コンストラクタの引数で、アイテムやモンスターのユニークNo(ID)と確率が構造化されたMap(確率表)を受取ります。そして、受け取った確率表を使って抽選に使うガラポンの準備をします。

尚、このクラスは、使用するガラポン(抽選BOX)のことを知っているので、メンバ変数として定義してあります。

コラボレートするMapのイメージ

コレボレートするMapのイメージは、下記の左の表のような感じです。
今回は、ガラポンをイメージしたクラスなので確率は相対的なものになります。

【イメージの図】
lottery_map_image

ガラポンの準備

    /**
     * ガラポンの準備をします。(ガラポンに玉を入れる)
     * 
     * @retun List
     */
    private static List createLotteryBox(
            Map lotteryMap) {
        List lotBalls = new ArrayList();
        for (Integer key : lotteryMap.keySet()) {
            for (int i = 0; i < lotteryMap.get(key); i++) {
                lotBalls.add(key);
            }
        }
        return lotBalls;
    }

受け取ったMap(確率表)lotteryMapを元にアイテム(玉)をガラポンに入れまくって、ガラポンを準備します。
各アイテムをMapの確率(入れる玉の数)分ループ(2回目のループ)させて、そのアイテムNoの玉をガラポンに一つづつ入れていきます。
⇒ lotBalls.add(key);の部分

上記の図のMapのイメージでいうと、「どうのつるぎ」と交換できる白い玉が1,000個、「プラチナのつるぎ」と交換できる青い玉が50個、「勇者のつるぎ」と交換できる金の玉が2個の合計1,052個の玉が入ったガラポンが、これで完成したことになります!

メソッド

    /**
     * ガラポンを回してアイテムNoを一つ取得する。
     * 
     * @return int
     */
    public int drawLots() {
        Collections.shuffle(mLotBallList);
        return (int) mLotBallList.get(0);
    }

あとは、準備したガラポンをガラガラと回してやるだけです。
ガラポンをガラガラ回して、玉をぐしゃぐしゃにする処理は、Collections.shuffle(List list)を使います。

Collections.shuffle(List list)は、デフォルトの乱数発生の元を使用して、指定されたリストの順序を無作為に入れ替えます。
便利ですね!

あとは、List.get(int)でガラポンの出口から出てくる玉を取得してやるだけです。
今回は、リストの0番目を取得するといったふうに実装しています。

さぁ、これでガラポンクラスの出来上がり!!


まとめ

mushi_colle

このクラスを使えば、アイテムガチャや場所・ダンジョンなどによって出現率が変わるモンスターを集めるAndroidのゲーム機能が簡単につくれると思います!!
単純に、ガラポンの福引アプリを作っても良いかもしれませんね♪

今回、作ったクラス全体のソースコードを最後に記載しておきます~~。
使いやすいように、シンプルなクラスにしましたので、そのまま使ったり拡張したりして是非使ってみて頂ければと思います!!
こういうシンプルなutilクラスの設計とか考えるのって結構楽しいですね!

では、また!!


今回作成したクラス

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * ガラポンクラス
 * 
 * @author nishimaki.masaya
 * 
 */
public class Lottery {
    // メンバ変数 - ガラポン(抽選BOX) 
    private List mLotBallList;

    /**
     * コンストラクタ
     * 
     * @param Map
     */
    public Lottery(Map lotteryMap) {
        mLotBallList = createLotteryBox(lotteryMap);
    }

    /**
     * ガラポンを回してアイテムNoを一つ取得する。
     * 
     * @return int
     */
    public int drawLots() {
        Collections.shuffle(mLotBallList);
        return (int) mLotBallList.get(0);
    }

    /**
     * ガラポンの準備をします。(ガラポンに玉を入れる)
     * 
     * @retun List
     */
    private static List createLotteryBox(
            Map lotteryMap) {
        List lotBalls = new ArrayList();
        for (Integer key : lotteryMap.keySet()) {
            for (int i = 0; i < lotteryMap.get(key); i++) {
                lotBalls.add(key);
            }
        }
        return lotBalls;
    }
}

コメントを残す

メールアドレスが公開されることはありません。

ABOUTこの記事をかいた人

アバター

主に、女性向けのWEBサイトやスマホアプリの新規サービス構築に従事。自ら企画をして、数々のサービスやアプリも立ち上げている。企画・開発からプロモーションまで幅広く活躍。2009年、株式会社ヘッドウォータース入社。 / リーンスタートアップ / AI / 画像解析 / GoogleBigQuery / ライフログ / ヘルスケア / ファッション / ビューティ / Misfit / SynAppsTablet / Monaca / エバンジェリスト