【Android問題集】『オンラインランキング機能を作ってみよう!「連打ゲーム」』

RendaGame

コンテンツ概要

問題について

  • 問題は2問あります
  • 2問クリアすると「連打ゲーム」にオンラインランキング機能を実装したアプリが完成します
  • 問題を取り組む上で必要な開発環境は以下です
  • AndroidStudio ver.1.4 以上

問題に取り組む前の準備

プロジェクトのダウンロード

▼問題用プロジェクト▼

「連打ゲーム (Taping Game)」

  1. 上記リンクをクリックしてzipファイルをローカルに保存します
  2. zipファイルを解凍して、AndroidStudioを開き,「Open an existing AndroidStudio project」を選択し、解凍したプロジェクトを開きます。
  3. プロジェクトをビルドし、「連打ゲーム」で遊んでみましょう

「連打ゲーム」の操作方法

  1. 「START」ボタンをタップします
  2. 「3」,「2」,「1」とカウントダウンし、「スタート!」からタイムアップ!の10秒間「◎」の部分がタップできるようになります
  3. 10秒間の間に何回タップできるかを競う単純なゲームです
  4. 10秒経つと名前を入力するアラートが表示されますので、入力し「OK」をクリックします
  5. 「SHOW RANKING」ボタンをタップすると、画面に名前とスコアが表示されます。

注意:問題に取り組む前の状態では「SHOW RANKING」ボタンをタップしてもランキングは表示されません

アプリの新規作成とAPIキーの設定

mBaaS

  • ニフティクラウドmobile backendにログインしアプリの新規作成を行います
  • アプリ名はわかりやすいものにしましょう。例)「renda」
  • アプリが作成されるとAPIキーが2種類(アプリケーションキーとクライアントキー)発行されます
  • 次で使用します。

AndroidStudio

問題0-1

  • それぞれYOUR_APPLICATION_KEYYOUR_CLIENT_KEYの部分を書き換えます
  • このとき、ダブルクォーテーション(")を消さないように注意してください!

【問題1】:名前とスコアの保存をしてみよう!

MainActivity.javaを開きます。下図の__saveScoreメソッドを編集し、引数のname(アラートで入力した名前)とscore__(連打ゲームでタップした回数)の値をmBaaSに保存する処理をコーディングしてください

問題1-1

  • データストアに保存先クラスを作成します
  • クラス名は「GameScore」としてください
  • nameを保存するフィールドを「name」、scoreを保存するフィールドを「score」として保存してください

ヒント

コーディング後の作業

問題1のコーディングが完了したら、下記の作業を行います

__【作業1-1】__それぞれ該当する箇所に以下の処理を追記して、実行時にアラートを表示できるようにします

  • 保存に失敗した場合の処理を行う箇所に追記
// 保存に失敗した場合の処理
  Log.e("NCMB", "保存に失敗しました。エラー:" + e.getMessage());
  • 保存に成功した場合の処理を行う箇所に追記
//保存が成功した場合の処理
  Log.i("NCMB", "保存に成功しました。");

__【作業1-2】__エミュレーターで実行、「Start」ボタンを押してゲームを遊びます

  • 名前を入力し、「OK」がクリックされると【問題1】で作成したsaveScoreメソッドが呼ばれ、データが保存されます

  • このとき下記のいずれかのログが出力されます

  • 保存に成功しました。」の場合は保存成功です

  • 保存に失敗しました。エラー : ************」の場合は保存失敗です

※エラーコードが出た場合はこちらで確認できます

答え合わせ

▼答えはこちら▼

【問題1】解答

【問題2】:ランキングを表示しよう!

RankingActivity.javaを開きます。下図のcheckRankingメソッドを編集し、データストアのGameScoreクラスに保存したnamescoreのデータをscoreの降順(スコアの高い順)で検索・取得する処理をコーディングしてください

問題2-1

  • 検索データ件数は5件とします

ヒント

コーディング後の作業

問題2のコーディングが完了したら、下記の作業を行います

__【作業2-1】__該当する箇所に以下の処理を追記して、実行時にAndroidStudio上にログを表示できるようにします

  • 検索に失敗した場合の処理を行う箇所に追記
// 検索に失敗した場合の処理
Log.e("NCMB", "検索に失敗しました。エラー:" + e.getMessage());
  • 検索に成功した場合の処理を行う箇所に追記
// 検索に成功した場合の処理
Log.i("NCMB", "検索に成功しました。");

__【作業2-2】__エミュレーターで実行し、「ランキングを見る」ボタンをタップします

  • 画面起動後、checkRankingメソッドが呼ばれ、【問題1】で保存されたデータが検索・取得されます

  • このとき下記のいずれかのログが出力されます

  • 検索に成功しました。」が表示された場合は検索成功です

  • 検索に失敗しました。エラー:************」が表示された場合は検索失敗です

※エラーコードが出た場合はこちらで確認できます

  • 検索の状態(成功・失敗)に関係なく、「SHOW RANKING」ボタンをタップしても、まだランキングは表示されません

__【作業2-3】__検索に成功したら、該当する箇所に以下の処理を追記して、取得した値から必要なデータを取り出し、ランキング画面へ反映させます

  • 検索に成功した場合の処理を行う箇所に追記
        //ListViewオブジェクトの取得
        ListView lv = (ListView)findViewById(R.id.lstRanking);

        // ループカウンタ
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(RankingActivity.this, android.R.layout.simple_list_item_1);

        for (int i = 0, n = objects.size(); i < n; i++) {
            NCMBObject o = objects.get(i);
            Log.i("NCMB", o.getString("name"));
            // 処理
            String name = o.getString("name");
            Integer score = o.getInt("score");
            adapter.add(name + " さん : " + score.toString() + " (point)");
        }

        lv.setAdapter(adapter);

__【作業2-4】__エミュレーターで実行、「ランキングを見る」ボタンを押します

  • 先ほどのスコアが表示されれば完成です!おめでとうございます★

答え合わせ

▼答えはこちら▼

【問題2】解答

参考

  • 問題の回答を実装した完全なプロジェクトをご用意しています

▼完成版プロジェクト▼

「【完成版】連打ゲーム」

  • APIキーを設定してご利用ください