【簡単】KotlinでAndroidアプリ・計算ゲームアプリ作成

android計算アプリサムネ プログラミング
質問する人
質問する人

計算ゲームをAndroidアプリ(Kotlin)で作ってみたいな・・・

こんなご要望にお応えします。

◆この記事の内容
・Kotlinを使用したAndroidの計算問題アプリの作成方法が分かります
うまし
うまし

エンジニア歴15年のうましが解説します。

スポンサーリンク

【簡単】KotlinでAndroidアプリ・計算ゲームアプリ作成

シンプルですが、Kotlinでのプログラミングの勉強になるかと思いますのでぜひ参考にしてもらえるとありがたいです。Andoroid Studioのインストールやプロジェクトの作成、エミュレータやAndroid端末への書き込みはこちらの記事で細かく解説しています。

作成するアプリの動作

android計算アプリ完成イメージ完成イメージです

android計算アプリ動作説明1『モード』を押すと、足し算→引き算→かけ算→割り算→足し算…と変わります

android計算アプリ動作説明2『消去』で入力した値を消去できます

android計算アプリ動作説明3入力した値が正解している状態で『解答』を押すと『正解!!』と表示されて右上がカウントアップします。

android計算アプリ動作説明4

間違っていると『残念・・・』と表示されてカウントがゼロになります。

android計算アプリ動作説明5『次へ』を押すと新たな問題が出題されます

レイアウトのコード(xml)

『activity_main.xml』をcode表示にして以下のコードをコピペします。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/numView1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginStart="30dp"
        android:layout_marginTop="30dp"
        android:text=" "
        android:textAlignment="center"
        android:textAppearance="@style/TextAppearance.AppCompat.Display3"
        app:layout_constraintEnd_toStartOf="@+id/opView"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/opView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginTop="30dp"
        android:text=" "
        android:textAlignment="center"
        android:textAppearance="@style/TextAppearance.AppCompat.Display3"
        app:layout_constraintEnd_toStartOf="@+id/numView2"
        app:layout_constraintStart_toEndOf="@+id/numView1"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/numView2"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginTop="30dp"
        android:layout_marginEnd="30dp"
        android:text=" "
        android:textAlignment="center"
        android:textAppearance="@style/TextAppearance.AppCompat.Display3"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/opView"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/countView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_marginEnd="5dp"
        android:text=" "
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/result"
        android:layout_width="330dp"
        android:layout_height="90dp"
        android:layout_marginTop="20dp"
        android:text="0"
        android:textAlignment="viewEnd"
        android:textAppearance="@style/TextAppearance.AppCompat.Display1"
        android:textSize="60sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/opView" />

    <Button
        android:id="@+id/eight"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="8dp"
        android:text="8"
        android:textSize="24sp"
        app:layout_constraintEnd_toStartOf="@+id/nine"
        app:layout_constraintStart_toEndOf="@+id/seven"
        app:layout_constraintTop_toBottomOf="@+id/result" />

    <Button
        android:id="@+id/two"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:text="2"
        android:textSize="24sp"
        app:layout_constraintEnd_toStartOf="@+id/three"
        app:layout_constraintStart_toEndOf="@+id/one"
        app:layout_constraintTop_toBottomOf="@+id/five" />

    <Button
        android:id="@+id/six"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="70dp"
        android:text="6"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/five"
        app:layout_constraintTop_toBottomOf="@+id/nine" />

    <Button
        android:id="@+id/zero"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:text="0"
        android:textSize="24sp"
        app:layout_constraintEnd_toStartOf="@+id/answer"
        app:layout_constraintStart_toEndOf="@+id/del"
        app:layout_constraintTop_toBottomOf="@+id/two" />

    <Button
        android:id="@+id/four"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="70dp"
        android:text="4"
        android:textSize="24sp"
        app:layout_constraintEnd_toStartOf="@+id/five"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/seven" />

    <Button
        android:id="@+id/nine"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="70dp"
        android:text="9"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/eight"
        app:layout_constraintTop_toBottomOf="@+id/result" />

    <Button
        android:id="@+id/one"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="70dp"
        android:text="1"
        android:textSize="24sp"
        app:layout_constraintEnd_toStartOf="@+id/two"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/four" />

    <Button
        android:id="@+id/three"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="70dp"
        android:text="3"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/two"
        app:layout_constraintTop_toBottomOf="@+id/six" />

    <Button
        android:id="@+id/seven"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="70dp"
        android:layout_marginTop="20dp"
        android:text="7"
        android:textSize="24sp"
        app:layout_constraintEnd_toStartOf="@+id/eight"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/result" />

    <Button
        android:id="@+id/five"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:text="5"
        android:textSize="24sp"
        app:layout_constraintEnd_toStartOf="@+id/six"
        app:layout_constraintStart_toEndOf="@+id/four"
        app:layout_constraintTop_toBottomOf="@+id/eight" />

    <Button
        android:id="@+id/mode"
        android:layout_width="175dp"
        android:layout_height="wrap_content"
        android:text="モード"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="@+id/del"
        app:layout_constraintTop_toBottomOf="@+id/del" />

    <Button
        android:id="@+id/del"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="70dp"
        android:text="消去"
        android:textSize="24sp"
        app:layout_constraintEnd_toStartOf="@+id/zero"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/one" />

    <Button
        android:id="@+id/answer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="70dp"
        android:text="解答"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/zero"
        app:layout_constraintTop_toBottomOf="@+id/three" />

    <Button
        android:id="@+id/next"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:text="次へ"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="@+id/answer"
        app:layout_constraintStart_toEndOf="@+id/zero"
        app:layout_constraintTop_toBottomOf="@+id/answer" />

</androidx.constraintlayout.widget.ConstraintLayout>

『Design』に切り替えて以下のようになると成功です。

android計算アプリレイアウト1

ボタンの色の変更

色の変更はこちらでご紹介しています。

android計算アプリレイアウト2

処理のコード(kotlin)

『MainActivity.kt』に以下のコードをコピペします。

package com.example.myapplication

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

//変数の宣言

        //解答の値
        var answer : Int = 0
        var mode : Int = 0  //0=足し算 / 1=引き算 / 2 = かけ算 / 3 = 割り算

        //数値ボタンの宣言
        val btnZero : Button = findViewById(R.id.zero)
        val btnOne  : Button = findViewById(R.id.one)
        val btnTwo  : Button = findViewById(R.id.two)
        val btnThree: Button = findViewById(R.id.three)
        val btnFour : Button = findViewById(R.id.four)
        val btnFive : Button = findViewById(R.id.five)
        val btnSix  : Button = findViewById(R.id.six)
        val btnSeven: Button = findViewById(R.id.seven)
        val btnEight: Button = findViewById(R.id.eight)
        val btnNine : Button = findViewById(R.id.nine)

        //『解答』ボタンの宣言
        val btnAnswer : Button = findViewById(R.id.answer)

        //『次へ』ボタンの宣言
        val btnNext : Button = findViewById(R.id.next)

        //DELボタン
        val btnDel : Button = findViewById(R.id.del)

        //modeボタン
        val btnMode : Button = findViewById(R.id.mode)

        //表示関係の宣言
        val resultView : TextView = findViewById(R.id.result)
        val numView1 : TextView = findViewById(R.id.numView1)
        val numView2 : TextView = findViewById(R.id.numView2)
        val opView : TextView = findViewById(R.id.opView)
        val countView : TextView = findViewById(R.id.countView)

        var num1 :Int = (0..9).random()         //初期値は足し算
        var num2 :Int = (0..9).random()         //初期値は足し算
        var numResult : Int = num1 + num2       //初期値は足し算

        var count :Int = 0

        var op : String = "+"

        numView1.text = num1.toString()
        numView2.text = num2.toString()
        opView.text = "+"

//関数の宣言
        //問題の初期化
        fun questionInit (){
            answer = 0
            resultView.text ="0"                //解答欄を0にする

            //足し算
            if (mode == 0) {
                num1 = (0..9).random()              //0~9の間でランダム
                numView1.text = num1.toString()     //String型で表示

                num2 = (0..9).random()              //0~9の間でランダム
                numView2.text = num2.toString()     //String型で表示

                numResult = num1 + num2
            }

            //引き算
            else if (mode == 1) {
                num1 = (0..20).random()             //引かれる数。0~20の間でランダム
                numView1.text = num1.toString()     //String型で表示

                num2 = (0..num1).random()           //引く数。0~引かれる数の間でランダム
                numView2.text = num2.toString()     //String型で表示

                numResult = num1 - num2
            }

            //かけ算
            else if (mode == 2) {
                num1 = (0..9).random()              //0~9の間でランダム
                numView1.text = num1.toString()     //String型で表示

                num2 = (0..9).random()              //0~9の間でランダム
                numView2.text = num2.toString()     //String型で表示

                numResult = num1 * num2
            }

            //割り算
            else {
                num1 = (0..9).random()              //A × B = C のA
                num2 = (1..9).random()              //A × B = C のB
                numResult = num1                    //C ÷ B = A のA

                num1 = num1 * num2                  //左に表示する数num1にCを代入

                numView1.text = num1.toString()     //String型で表示 C
                numView2.text = num2.toString()     //String型で表示 B
            }
        }

        //数字ボタンを押した時の動作
        fun numBtnAction(num : String) {
            resultView.text = if(resultView.text.toString() != "0"){
                resultView.text.toString() + num
            } else {
                num
            }
        }

        //『モード』ボタンを押した時の処理
        fun modeBtnAction(){
            resultView.text = "0"        //解答欄を初期化する
            answer = 0                  //解答を初期化

            if (mode == 3) {
                mode = 0
            } else {
                mode++
            }

            if (mode == 0) {
                op = "+"
                opView.text = op
            }
            else if (mode == 1){
                op = "-"
                opView.text = op
            }
            else if (mode == 2){
                op = "×"
                opView.text = op
            }
            else {
                op = "÷"
                opView.text = op
            }
            questionInit ()
        }

        //『解答』ボタンを押した時の関数
        fun answerBtnAction(){
            answer = resultView.text.toString().toInt()     //解答欄の数値(文字列型)をInt型にする
            if (answer == numResult){
                resultView.text = "正解!!"
                count++
                countView.text = count.toString()
            }
            else {
                resultView.text = "残念・・・"
                count = 0
                countView.text = count.toString()
            }
        }

//ボタンを押した時に呼び出す処理

        //0
        btnZero.setOnClickListener {
            numBtnAction("0");
        }

        //1
        btnOne.setOnClickListener {
            numBtnAction("1");
        }

        //2
        btnTwo.setOnClickListener {
            numBtnAction("2");
        }

        //3
        btnThree.setOnClickListener {
            numBtnAction("3");
        }

        //4
        btnFour.setOnClickListener {
            numBtnAction("4");
        }

        //5
        btnFive.setOnClickListener {
            numBtnAction("5");
        }

        //6
        btnSix.setOnClickListener {
            numBtnAction("6");
        }

        //7
        btnSeven.setOnClickListener {
            numBtnAction("7");
        }

        //8
        btnEight.setOnClickListener {
            numBtnAction("8");
        }

        //9
        btnNine.setOnClickListener {
            numBtnAction("9");
        }

        //『次へ』を押した時の処理
        btnNext.setOnClickListener {
            questionInit ()
        }

       //『消去』を押された時の処理
        btnDel.setOnClickListener {
            resultView.text ="0"        //解答欄を初期化する
            answer = 0                  //解答を初期化
        }

        //『モード』を押された時の処理
        btnMode.setOnClickListener {
            modeBtnAction()
        }

        //『解答』を押された時の処理
        btnAnswer.setOnClickListener {
            answerBtnAction()
        }
    }
}

エミュレータやAndroid端末で実行してもらうと計算アプリを起動できるかと思います。

android計算アプリ完成イメージ

うまし
うまし

ブログやサイトでご紹介、拡散してもらえるとはげみになります!