安卓开发学习日记第四天番外篇_用Kotlin炒冷饭——越炒越小_莫韵乐的欢乐笔记

安卓开发学习日记第四天番外篇——用Kotlin炒冷饭——越炒越小

前情提要
安卓开发学习日记第一天_Android Studio3.6安装
安卓开发学习日记第二天_破坏陷阱卡之sync的坑
安卓开发学习日记第三天_新手怪button
安卓开发学习日记第四天_会爬就会跑

这一次我们就来试一下怎么用kotlin写出跟第四天日记一样的小游戏,外加自动复位效果

准备工作

如何想要在自己的Android Studio上运行以下代码,请在创建项目的时候选择kotlin语言

安卓开发学习日记第四天番外篇_用Kotlin炒冷饭——越炒越小_莫韵乐的欢乐笔记_第1张图片

activity_main.xml的内容

内容与第四天的一样,可以直接从第四天的日记获取
安卓开发学习日记第四天_会爬就会跑

MainActivity.kt的主体内容

声明变量

我们可以看到kotlin作为一种强类型语言,不仅可以用varval去规定变量是可变变量还是只读变量,同时在变量的后面也可以补指定一个类型,以实现它的类型推理机制

 	//声明一个对象数组类型是Button,名字是buttons
    private var buttons = arrayOfNulls<Button>(10)
    //按钮的标签,用于判断按钮是否可见,用布尔数组表示
    private var flag: Array<Boolean> = arrayOf(true,true,true,true,true,true,true,true,true,true)
    //用于存放布局中按钮的ID,我们可以看出R.id.XX的类型是Int
    private val buttonID: Array<Int> = arrayOf(0,R.id.button1,R.id.button2,R.id.button3,R.id.button4,R.id.button5,R.id.button6,R.id.button7,R.id.button8,R.id.button9)
    //用于计算你点击了多少次
    private var count = 0

实例化对象数组

在这段代码里面我们可看到两个语法糖,当循环结构或选择结构里面只有一个语句的时候,写出以下形式就可以简化代码,让我们更方便地使用它(语法糖也相当于我们中文里面的成语,浓缩就是精华)

	override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //利用循环简化赋值过程
        for(i in 1..9)buttons[i] = findViewById(buttonID[i])
        //需要传入接口实现类的实例。
        //此时接口实现类的实例为MainActivity
        for (j in 1..9) buttons[j]?.setOnClickListener(this)
    }

第二个for循环里面的buttons[i]后面有个" ? ",这个小问号就是用于判空,因为我们写代码时候不一定会知道实际运行的时候是否出现空指针,因此我们需要“ ? ”来对对象进行判空
与之相对应的,如果我们确定这个对象不会是空指针的时候,那么我们就可以用非空断言语句“ !! ”来提高运行的效率

第三步:写出转换按钮状态的函数将按钮状态变换接口移入内部

看到这里大家肯定会发现kotlin的for循环和python的for循环很像,就是比python的for循环多了个括号,其中的0..4意味着0到4的闭区间

	private fun convertBoolean(a: Int, b: Int, c: Int, d: Int, e: Int){
        val flags: Array<Int> = arrayOf(a,b,c,d,e)
        //根据传入的参数转换flag的值
        for(i in 0..4) if (flags[i] != 0)flag[flags[i]] = !flag[flags[i]]
        //按钮状态变换接口
        showButton()
    }

第四步:实现按钮显示和隐藏的函数,检测游戏是否结束,实现游戏复位

这里的for循环中使用了kotlin中的when语法,代替了Java的switch语句(奇怪的行数减少了)

	private fun showButton(){
        var tag = 0
        //根据标签的状态实现按钮是否可见
        for(i in 1..9)when (flag[i]) {
                true -> buttons[i]?.visibility = View.VISIBLE//使按钮可见
                false -> buttons[i]?.visibility = View.INVISIBLE//使按钮不可见
        }
        //记录点击次数
        count++
        //检查标签的状态
        for (i in 1..9)if(!flag[i])tag++
        //在屏幕中弹出消息
        if(tag == 9){
            Toast.makeText(this,"恭喜你赢得了游戏!\n本次游戏你一共点击了"+count+"次!", Toast.LENGTH_LONG).show()
            //完成游戏后按钮复位
            for (i in 1 .. 9)convertBoolean(i,0,0,0,0)
        }
    }

第五步:设置点击事件(这就是我为什么喜欢上kotlin的地方)

大家可以回去上一天的日记里数数这一段一共用了几行,用kotlin用了几行(kotlin牛逼)
第四天的日记在这里~
这里when中的v同样也进行了判空

	override fun onClick(v: View?) {
        when(v?.id) {
            R.id.button1 -> convertBoolean (1,2,4,0,0)  //改变对于按钮的状态标签
            R.id.button2 -> convertBoolean (1,2,3,5,0)  //改变对于按钮的状态标签
            R.id.button3 -> convertBoolean (2,3,6,0,0)  //改变对于按钮的状态标签
            R.id.button4 -> convertBoolean (1,4,5,7,0)  //改变对于按钮的状态标签
            R.id.button5 -> convertBoolean (2,4,5,6,8)  //改变对于按钮的状态标签
            R.id.button6 -> convertBoolean (3,5,6,9,0)  //改变对于按钮的状态标签
            R.id.button7 -> convertBoolean (4,7,8,0,0)  //改变对于按钮的状态标签
            R.id.button8 -> convertBoolean (5,7,8,9,0)  //改变对于按钮的状态标签
            R.id.button9 -> convertBoolean (6,8,9,0,0)  //改变对于按钮的状态标签
        }
    }

接下来就是运行效果

我们可以发现,效果是一样的,但是代码量却减少了
安卓开发学习日记第四天番外篇_用Kotlin炒冷饭——越炒越小_莫韵乐的欢乐笔记_第2张图片

如果觉得还不错就点个赞,收藏一下,感谢您的观看

你可能感兴趣的:(安卓学习日记)