計算ゲームアプリ　更新

・自作のＢＧＭを追加
・アプリ中断時ＢＧＭが流れ続ける不具合修正
・アプリ再開時にアプリが停止する不具合を修正
・広告（Admob）が表示されるように設定


以前のソースコード
https://qiita.com/KToushi/items/e338aaaf6decc9fced77

サンプル動画
https://twitter.com/i/status/1240632023410044929


package com.nyaa.braintrainer;

import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;


import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.initialization.InitializationStatus;
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;

import java.util.ArrayList;
import java.util.Random;


import static android.media.MediaPlayer.create;

public class MainActivity extends AppCompatActivity {

    //ゲームを開始するボタン
    Button goButton;
    //残り時間、問題、得点/問題数、4つの選択肢（ボタン）
    ConstraintLayout gameLayout;

    Button playAgainButton;
    CountDownTimer timer;

    TextView resultTextView;
    TextView commentTextView;
    TextView timerTextview;
    int score = 0;
    int numberOfQusetions = 0;

    //猫画像
    ImageView imageNirami;
    ImageView imageKakure;
    ImageView imageYousumi;

    //ゲーム開始時のカウントダウンタイマーの残り時間を表す定数
    final int remainingTime = 21;
    //カウントダウンタイマーのカウントダウンの間隔を表す定数
    final int countDownInterval = 1000;

    //ゲーム中のBGM
    MediaPlayer bgm;
    //BGMが一時停止しているか
    boolean bgmPaused = false;


    ArrayList<Integer> answers = new ArrayList<Integer>();

    //正解の位置（ボタン）のtag
    int locationOfCorrectAnswer;
    //選択肢の数
    final int numberOfTags = 4;
    //(問題に使うランダムな数が)何通りあるか
    final int numberOfWays = 20;

    TextView scoreTextView;
    TextView sumTextView;
    Button button0, button1, button2, button3;

    //広告
    private AdView mAdView;




    //Goボタンを押したときの挙動（ゲームをスタートさせる）を定義
    public void start(View view) {

        //goボタンが消える
        goButton.setVisibility(View.INVISIBLE);

        //残り時間、問題、得点/問題数、4つの選択肢（ボタン）を出現させる
        gameLayout.setVisibility(View.VISIBLE);

        //playAgainButtonを押した時と同じ挙動をする
        playAgain(findViewById(R.id.timerTextView));

    }


    //playAgainボタンを押したときの挙動を定義
    public void playAgain(View view) {
        score = 0;
        numberOfQusetions = 0;

        bgm = create(getApplicationContext(), R.raw.startshort);
        //BGM再生開始
        bgm.start();

        //残り何秒か表示
        timerTextview.setText(remainingTime + "s");

        //何問中何問正解しているか表示
        scoreTextView.setText("0/0");

        //新しい問題と選択肢を表示
        newQuetion();

        //resultTextViewを見えるようにする
        resultTextView.setVisibility(View.VISIBLE);

        //commentTextViewを見えなくする
        commentTextView.setVisibility(View.INVISIBLE);

        //playAgainButtonを見えなくする
        playAgainButton.setVisibility(View.INVISIBLE);

        //猫の画像見えなくする
        imageNirami.setVisibility(View.INVISIBLE);
        imageYousumi.setVisibility(View.INVISIBLE);
        imageKakure.setVisibility(View.INVISIBLE);

        resultTextView.setText("");


        //４つのボタン（選択肢）出現
        buttonShow();




        //カウントダウンタイマークラスのインスタンスを代入
        timer = new CountDownTimer(remainingTime * 1000, countDownInterval) {

            //CountDownTimerクラスのメソッドを上書き
            @Override
            //カウントダウンしている間の挙動
            public void onTick(long millisUntilFinished) {

                //残り何秒か表示
                timerTextview.setText(String.valueOf(millisUntilFinished / 1000) + "s");

            }

            @Override
            //カウントダウンが0になった時の挙動
            public void onFinish() {

                //効果音
                MediaPlayer se;

                bgm.stop();

                timerTextview.setText("0s");

                //playAgainButton出現
                playAgainButton.setVisibility(View.VISIBLE);


                //４つのボタン（選択肢）を見えなくする
                buttonHide();

                resultTextView.setVisibility(View.INVISIBLE);
                commentTextView.setVisibility(View.VISIBLE);

                //得点によって表示される画像とテキスト、効果音を変える
                if(score > 10) {
                    commentTextView.setText("ほ、ほめてあげるわ//");

                    //隠れ猫表示
                    imageKakure.setVisibility(View.VISIBLE);

                    //効果音キラキラが鳴る
                    se = create(getApplicationContext(), R.raw.shine1);
                    se.start();



                } else if(score > 5) {
                    commentTextView.setText("ふん、まあまあね");

                    //様子見猫表示
                    imageYousumi.setVisibility(View.VISIBLE);

                    //効果音シャキーン！が鳴る
                    se = create(getApplicationContext(), R.raw.shakin1);
                    se.start();

                } else {
                    commentTextView.setText("あんたやる気あるの？");

                    //にらみ猫表示
                    imageNirami.setVisibility(View.VISIBLE);

                    //効果音チーンが鳴る
                    se = create(getApplicationContext(), R.raw.tin1);
                    se.start();

                }


            }

        };

        //カウントダウンタイマーをスタート
        timer.start();

    }



    //4種類のボタンを押したときの挙動（メソッド）を定義
    public void chooseAnswer(View view) {

        //正解のタグと押したタグが同じとき（４つのボタンに０～３の4種類のタグを設定している）
        if (Integer.toString(locationOfCorrectAnswer).equals(view.getTag().toString())) {
            resultTextView.setText("正解にゃ(=ↀωↀ=)");

            //得点が1増える
            score++;

        } else {
            resultTextView.setText("間違いにゃ(=ↀωↀ=)");

        }

        //現在の問題数が1増える
        numberOfQusetions++;

        //何問中何問正解しているか表示
        scoreTextView.setText(Integer.toString(score) + "/" + Integer.toString(numberOfQusetions));

        //新しい問題と選択肢を表示
        newQuetion();
    }


    //新しい問題を出現させるメソッドを定義
    public void newQuetion() {

        Random rand = new Random();

        //整数の変数a,bを定義　　0～numberOfWaysの(numberOfWays + 1)通りの整数をランダムに代入
        int a = rand.nextInt(numberOfWays);
        int b = rand.nextInt(numberOfWays);

        //a + bを表示
        sumTextView.setText(Integer.toString(a)+ " + " + Integer.toString(b));

        //0～3の4通りの整数をランダムに代入　Tagも0～3の4通り
        locationOfCorrectAnswer = rand.nextInt(numberOfTags);
        //answersリストの中身（４つの答え）を消去　
        answers.clear();

        for(int i=0; i<4; i++) {
            if(i == locationOfCorrectAnswer) {

               //anserwsリストに正解(a + b)を追加
                answers.add(a+b);
            } else {
                //0～numberOfWays * 2 の numberOfWays * 2 -1 通りの整数をランダムに代入
                int wrongAnswer = rand.nextInt(numberOfWays * 2 -1);

                //wrongAnswerが正解と一緒の間、0～numberOfWays * 2 の numberOfWays * 2 -1 通りの整数をランダムに代入
                while(wrongAnswer == a+b) {
                    wrongAnswer = rand.nextInt(numberOfWays * 2 -1);

                }

                //answersリストに間違った答えを追加
                answers.add(wrongAnswer);
            }

        }

        button0.setText(Integer.toString(answers.get(0)));
        button1.setText(Integer.toString(answers.get(1)));
        button2.setText(Integer.toString(answers.get(2)));
        button3.setText(Integer.toString(answers.get(3)));
    }

    //4つのボタン（選択肢）を見えるようにするメソッドを定義
    public void buttonShow() {
        button0.setVisibility(View.VISIBLE);
        button1.setVisibility(View.VISIBLE);
        button2.setVisibility(View.VISIBLE);
        button3.setVisibility(View.VISIBLE);
    }

    //4つのボタン（選択肢）を見えなくするメソッドを定義
    public void buttonHide(){
        button0.setVisibility(View.INVISIBLE);
        button1.setVisibility(View.INVISIBLE);
        button2.setVisibility(View.INVISIBLE);
        button3.setVisibility(View.INVISIBLE);
    }


    //アプリを中断したときの挙動
    @Override
    public void onPause() {
        super.onPause();

        //BGMを一時停止
        bgm.pause();
        bgmPaused = true;

        timer.pause();

    }

    //アプリを中断した後再開したときの挙動
    @Override
    public void onResume() {
        super.onResume();

        //BGMが停止していたらBGM再生し、カウントダウン再開する
        if (bgmPaused) {
            bgm.start();
            bgmPaused = false;
            timer.resume();
        }
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        //それぞれlayoutのViewと紐づけ
        goButton = findViewById(R.id.goButton);
        sumTextView = findViewById(R.id.sumTextView);
        button0 = findViewById(R.id.button0);
        button1 = findViewById(R.id.button1);
        button2 = findViewById(R.id.button2);
        button3 = findViewById(R.id.button3);
        resultTextView = findViewById(R.id.resultTextView);
        commentTextView = findViewById(R.id.commentTextView);
        scoreTextView = findViewById(R.id.scoreTextView);
        timerTextview = findViewById(R.id.timerTextView);
        playAgainButton = findViewById(R.id.playAgainButton);
        gameLayout = findViewById(R.id.gameLayout);
        imageNirami = findViewById(R.id.nirami);
        imageKakure = findViewById(R.id.kakure);
        imageYousumi = findViewById(R.id.yousumi);


        goButton.setVisibility(View.VISIBLE);

        //SDKの初期化
        MobileAds.initialize(this, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
            }
        });
        
        mAdView = findViewById(R.id.adView);
        //インスタンス生成
        AdRequest adRequest = new AdRequest.Builder().build();
        //広告の読み込み
        mAdView.loadAd(adRequest);


    }
}