【Androidプログラミング】四択クイズアプリ(2次元配列とシャッフル)

初めてjavaでアプリを作ってみよう、という人向けに、簡単な「四択クイズアプリ」の作り方実況解説をしました。主な学習テーマは「2次元配列」とその表示、そして「シャッフル」です。

※2次元配列の理解が目的なので、ややコードが稚拙だったり、アプリとしては未完成だったりしますがご了承ください

 

▼作業環境
OS:win10
AndroidStudio:4.0.2
言語:java

動画解説


 

テキスト解説

▼xml(レイアウト)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <TextView
        android:id="@+id/tvCount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="あと●問"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/tvQuestion"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="50dp"
        android:text="question"
        android:textSize="30sp" />

    <Button
        android:id="@+id/ansBtn1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="50dp"
        android:layout_weight="1"
        android:onClick="onButton"
        android:text="ans1" />

    <Button
        android:id="@+id/ansBtn2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:onClick="onButton"
        android:text="ans2" />

    <Button
        android:id="@+id/ansBtn3"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:onClick="onButton"
        android:text="ans3" />

    <Button
        android:id="@+id/ansBtn4"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:onClick="onButton"
        android:text="ans4" />

    <Button
        android:id="@+id/nextBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:onClick="onNext"
        android:text="next" />

</LinearLayout>

 

▼プログラミング(java)

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    //どのメソッドからでも使えるための準備
    private TextView tvCount;
    private TextView tvQuestion;
    private Button ansBtn1;
    private Button ansBtn2;
    private Button ansBtn3;
    private Button ansBtn4;
    private Button nextBtn;

    private int i =0;

    //1)クイズデータを準備
    String quizData[][] = {
            // {"問題", "正解", "選択肢1", "選択肢2", "選択肢3"}
            {"問題A", "A1", "A2", "A3", "A4"},
            {"問題B", "B1", "B2", "B3", "B4"},
            {"問題C", "C1", "C2", "C3", "C4"},
            {"問題D", "D1", "D2", "D3", "D4"},
            {"問題E", "E1", "E2", "E3", "E4"}
    };


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

        //2)idを取得
        getId();

        
        //3)クイズを表示(練習)
//        tvCount.setText("残り5問");
//        tvQuestion.setText(quizData[0][0]);
//        ansBtn1.setText(quizData[0][1]);
//        ansBtn2.setText(quizData[0][2]);
//        ansBtn3.setText(quizData[0][3]);
//        ansBtn4.setText(quizData[0][4]);


        showQuiz();

    }


    //まずidを取得して準備
    public void getId(){
        tvCount = findViewById(R.id.tvCount);
        tvQuestion = findViewById(R.id.tvQuestion);
        ansBtn1 = findViewById(R.id.ansBtn1);
        ansBtn2 = findViewById(R.id.ansBtn2);
        ansBtn3 = findViewById(R.id.ansBtn3);
        ansBtn4 = findViewById(R.id.ansBtn4);
        nextBtn = findViewById(R.id.nextBtn);
    }

    //3)クイズを表示
    public void showQuiz(){

        //4)シャッフル
        List<Integer> num  = Arrays.asList(1,2,3,4);
        Collections.shuffle(num);

        tvCount.setText("残り" + (5-i) + "問");
        tvQuestion.setText(quizData[i][0]);
        ansBtn1.setText(quizData[i][num.get(0)]);
        ansBtn2.setText(quizData[i][num.get(1)]);
        ansBtn3.setText(quizData[i][num.get(2)]);
        ansBtn4.setText(quizData[i][num.get(3)]);
    }

    //5)ボタンが押されたときの正誤判定
    public void onButton(View view){
        //押されたボタン
        Button clickedBtn =(Button)view;
        String clickedAns =clickedBtn.getText().toString();

        if(clickedAns.equals(quizData[i][1])){
            clickedBtn.setText("正解!");

            //ボタンを無効化、ネクストボタンを有効化
            ansBtn1.setEnabled(false);
            ansBtn2.setEnabled(false);
            ansBtn3.setEnabled(false);
            ansBtn4.setEnabled(false);
            nextBtn.setEnabled(true);

            //i++;
            if(i ==4){
                //7)アクティビティ画面作成
                //8)画面遷移
                Intent intent = new Intent(this,Result.class);
                startActivity(intent);
                finish();

            }else{
                i++;
            }

        }else{
            clickedBtn.setText("不正解!");
            tvQuestion.setText("Game over");

            //ボタンを無効化
            ansBtn1.setEnabled(false);
            ansBtn2.setEnabled(false);
            ansBtn3.setEnabled(false);
            ansBtn4.setEnabled(false);
            nextBtn.setEnabled(false);
        }
    }

    //6)Nextボタンが押された時の処理
    public void onNext(View view){
        showQuiz();

        ansBtn1.setEnabled(true);
        ansBtn2.setEnabled(true);
        ansBtn3.setEnabled(true);
        ansBtn4.setEnabled(true);
    }

}

▼Result.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFEB3B"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".Result">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="全問正解!ゲームクリア!"
        android:textSize="30sp" />
</LinearLayout>

 

▼Result.java

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class Result extends AppCompatActivity {

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

主なポイント

1)2次元配列の表示

「たて0番目、横1番目」みたいな時には、こんな感じで書きます。

ansBtn1.setText(quizData[0][1]);

 

2)シャッフル
1~4までの数字(int)をシャッフルさせるときはこのように書きます。

List<Integer> num = Arrays.asList(1,2,3,4);
        Collections.shuffle(num);