0
0

More than 3 years have passed since last update.

計算ゲームアプリ 更新

Last updated at Posted at 2020-03-22

・自作のBGMを追加
・アプリ中断時BGMが流れ続ける不具合修正
・アプリ再開時にアプリが停止する不具合を修正
・広告(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("");


    //4つのボタン(選択肢)出現
    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);


            //4つのボタン(選択肢)を見えなくする
            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つのボタンに0~3の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リストの中身(4つの答え)を消去 
    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);


}

}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0