DAY23 这边先帮你上一个按钮喔~(五)

直接一点的说,今天的主题就是要让骰子动起来,现在他已经躺在那边准备好被你狠狠D甩出去了,你就不要客气,掷他。


避免大家忘记进度到哪边,所以补一下整体的 MainActivity 程序码(其实忘记的人是我欸嘿):

package com.example.diceroller

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

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

        val rollButton: Button = findViewById(R.id.button2)
        rollButton.setOnClickListener {
            Toast.makeText(this,"Dice Rolled!", Toast.LENGTH_SHORT).show()
						//上面是利用 Toast 来提醒使用者,按钮已经按下去了
            val resultTextView: TextView = findViewById(R.id.textView)
            resultTextView.text = "6"
						//上面是使用者会看到的骰子点数,目前预设是 6 
        }
    }
}

阿...都回来了。

接下来把骰子的逻辑放进程序码中。


添加骰子逻辑

在骰子系列的第一篇呢,有试着把逻辑转换成程序码,就可以把这些程序码修改一下并放入 MainActivity 中。先在 class MainActivity 外建立一个 class Dice:

class Dice(val numSides: Int){    //numSides这个参数代表骰子会有的面数

    fun roll(): Int {
        return (1..numSides).random() //回传 1~骰子面数的随机数字
    }
}

这时候 Android Studio 应该会给你一个视窗:

https://ithelp.ithome.com.tw/upload/images/20211008/2014063840LBPB5ujB.png

他建议 numSides 应该要是 private,既然他都这麽说了,直接点第一个选项 "Make 'numSides' 'private' "。

我们建了 Dice 这个 class 的目的就是,把产生随机点数的这个程序逻辑,交给 class Dice 去执行,接下来还要回 class MainActivity 去建立一个 rollDice 的 fun ,这个 fun 会去建立一个 Dice 的实例,再由这个实例去呼叫产生随机点数的 function,也就是 Dice.roll():

private fun rollDice(){          //建立一个名为 rollDice 的 funtion
    val dice = Dice(6)           //产生一个6面骰子的实例
    val rollDice = dice.roll()   //把产生的结果存入rollDice这个变数

    val resultTextView: TextVite = findViewById(R.id.textView) //找到显示的 TextView
    resultTextView.text = rollDice.toString()    //把textView的文字存入产生的结果
}

因为我们在 class Dice 里的 roll() 回传的种类是 Int 数值的型态,所以在最後存入 resultTextView 的 text 之前,要先从 int 转换成 string,才会在後面加上 toString() 。

最後只要在监听 Button 的程序里呼叫 rollDice( ) 就可以产生结果啦:

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

        val rollButton: Button = findViewById(R.id.button2)
        rollButton.setOnClickListener {    //监听按钮是不是被点击了
            Toast.makeText(this, "Dice Rolled!", Toast.LENGTH_SHORT).show()
            rollDice()
        }
    }
    private fun rollDice(){         //建立一个名为 rollDice 的 funtion
        val dice = Dice(6)          //产生一个6面骰子的实例
        val rollDice = dice.roll()  //把产生的结果存入rollDice这个变数

        val resultTextView: TextView = findViewById(R.id.textView)
        resultTextView.text = rollDice.toString()

    }
}

class Dice(private val numSides: Int){    //numSides这个参数代表骰子会有的面数

    fun roll(): Int {
        return (1..numSides).random() //回传 1~骰子面数的随机数字
    }
}

我就不放入结果展示啦,虽然少了骰子的图片,但其实逻辑差不多就是这样,接下来应该会说点别的,至於要讲解甚麽,我也不知道,一定会知道的。

今天一样就先 John ,

下一篇见写写打家打家摆掰。


<<:  [2021铁人赛 Day23] Cryptography 密码学题目 01

>>:  Day23-按钮分身术(上)_纯CSS汉堡图样与改变

知识真的有办法管理吗?

开宗明义就以「知识」是什麽?作为开场序幕 你所认定的IT管理层面的知识是 资料库里的知识 学术篇章的...

【学习笔记】Git branch

在开发专案时可能会有多人同时commit和push的状况,很容易有conflict,这时候就需要使用...

D28 / Compose 可以用来做 Desktop App? - Compose JB

写到最後三天了,想要聊聊和 Android 不完全相关的东西。感谢JetBrains 的开发,和 K...

【PHP 设计模式大头菜】策略模式 Strategy Pattern

策略模式 Strategy Pattern 策略模式,可以让物件在运作时更改其行为或算法,你可以透...

[Day27]程序菜鸟自学C++资料结构演算法 – 堆积排序法(Heap sort)

前言:在第16、17天的时候有介绍到堆积,今天要利用堆积的特性来实现排序法,忘记或不知道堆积是甚麽的...