移动应用开发应用(一)

一、前言

现在向我们展示的是某位憨憨在上课时候在下面跟着讲台上老师一行行敲代码,最终敲成的程序。敲的时候没啥感觉,跟着老师思路走,敲完后腰酸了,头晕了,才知道上课老师讲得有多幸苦(而且还是站着敲代码)。

二、程序

1、抢红包程序(终端版)

  1. 代码实现
    package ncu.edu.wyy.kotlin_study.project01
    
    /**
     * 实现群主发红包,群成员抢红包,并能够展示抢红包的人的姓名,金额,
     * 并接受红包金额升序排序输出
     */
    class moneyException(message:String):Exception(message){
        override fun toString() = "红包剩余金额不够,但还有个数,全体成员请求群主补齐金额,${message}"
    }
    
    //默认值
    //红包
    class RedBag(var money:Double,var num:Int,val userList: MutableList<User> = mutableListOf<User>()) {
        var hasBeGetNum:Int = 0
        var remainMoney = money
        var remainNum = num
        val avgMoney = money/num
    
        fun addUser(user:User){
            userList.add(user)
        }
    
        fun shareMoney(user:User){
            if(String.format("%.2f",remainMoney) == "0.00" || remainNum == 0){
                println("很遗憾,红包已经被抢光了,${user.name}没抢到红包.")
            }
            else{
                var m = (money-hasBeGetNum*avgMoney)/remainNum * 2 * Math.random()//保证均匀分配概率,抢红包
                //如果红包被抢完了,但是数量还有剩余,进行异常处理
                if(m>remainMoney){
                    m = remainMoney
                    if(remainNum != 0){
                        throw moneyException("${user.name}抢完了所有红包金额,但红包数目还有剩余,")
                    }
                }
                //如果是最后一个红包的话,但实际上没抢到这么多,直接把剩余的全拿走
                if(m<remainMoney && remainNum == 1){
                    m = remainMoney
                }
                println(user.name+"抢到了%.2f".format(m)+"元红包")
                remainMoney -= m
                user.getMoney(m)
                addUser(user)
                remainNum -= 1
                hasBeGetNum += 1
            }
    
        }
    
        fun display(){
            userList.sort()
            userList.forEach{
                println("${it.name}抢到金额为"+"%.2f".format(it.receiveMoney)+"元的红包")
            }
        }
    
    }
    
    //普通用户(用户姓名,账户余额,抢到金额)
    open class User(var name: String,var money:Double,var receiveMoney:Double):Comparable<User>{
        init {
            money = 2000.0
        }
    
        override fun compareTo(other: User): Int = (this.receiveMoney - other.receiveMoney).toInt()
    
        fun getMoney(m:Double){
            this.money += m
            this.receiveMoney = m
        }
    
    //群主身份
       class HostUser(name:String,money: Double,receiveMoney: Double):User(name,money,receiveMoney){
        //发送红包
        fun sendRedBagMoney(m:Double,n:Int):RedBag{
                val r = RedBag(m,n)
                if(m>money){
                    throw moneyException("账户余额不足!")
                }else{
                    println("群主${name}发出了${n}个红包,金额为${m}元,大家快来抢啊!")
                    money -= m
                }
                return r
            }
        //红包金额不足时补齐红包
        fun addMoney(){}
        }
    }
    
    fun main(){
        val h = User.HostUser("王五",3000.0,0.0)
        val redBag:RedBag = h.sendRedBagMoney(1000.0,5)
        val user1 = User("张三",2000.0,0.0)
        val user2 = User("李四",2000.0,0.0)
        val user3 = User("赵六",2000.0,0.0)
        val user4 = User("田七",2000.0,0.0)
        val user5 = User("陈八",2000.0,0.0)
        val user6 = User("胡九",2000.0,0.0)
        redBag.shareMoney(user1)
        redBag.shareMoney(user2)
        redBag.shareMoney(h)
        redBag.shareMoney(user3)
        redBag.shareMoney(user4)
        redBag.shareMoney(user5)
        redBag.shareMoney(user6)
        redBag.display()
    }
    
    
  2. 运行结果截图:
  3. 缺陷:未能处理如下几种意外情况:
  • 当红包金额被抢光,但是还剩余几个包,这样导致剩下抢红包的人抢的空包;
  • 红包金额在固定区间中,不能像微信红包那样,可以一个人占大多数。(或许可以通过保底红包来实现,如设定最低金额为0.01元)

2、月历程序(终端版)

  1. 代码实现
    @file:Suppress("UNREACHABLE_CODE")
    
    package ncu.edu.wyy.kotlin_study.project01
    
    import android.os.Build
    import androidx.annotation.RequiresApi
    import java.time.LocalDate
    import java.util.Calendar
    import java.util.Scanner
    
    /**
     * 1.输入格式调整,比如2023 10;
     * 2.根据参数判断是闰年还是平年,这个月有多少天,第一天是星期几;
     * 3.格式化输出
     */
    
    class LunarCalendar {
    }
    
    @RequiresApi(Build.VERSION_CODES.O)
    fun main(){
        val sc = Scanner(System.`in`)
        println("请输入年份:")
        val year = sc.nextInt()
        println("请输入月份:")
        val month = sc.nextInt()
        val days = getDaysByMonth(year, month)
        val firstDay = getFirstDayOfWeek(year, month)
        println("这个月的第一天是星期$firstDay")
        println("一  二  三  四  五  六  日")
        for(i in 1  ..<firstDay){
            print("    ")
        }
        for(i in 0 ..<days){
            print("%-4d".format(i+1))
            if((i+firstDay) % 7 == 0){
                println()
            }
        }
    }
    
    //若为闰年,返回1,平年返回0
    fun isLeapYear(year:Int):Int{
        var result:Int = 0
        if((year % 4==0 && year % 100!=0) || year % 400 ==0){
            result = 1
        }
        return result
    }
    
    fun getDaysByMonth(year: Int,month:Int):Int{
        var days:Int = 0
        days = when(month){
            1,3,5,7,8,10,12 -> return 31
            2 -> return if(isLeapYear(year) == 1) 29 else 28
            4,6,9,11 -> return 30
            else -> throw RuntimeException("月份有误,这个月份根本就不存在的好吧!")
        }
        return days
    }
    
    @RequiresApi(Build.VERSION_CODES.O)
    fun getFirstDayOfWeek(year: Int, month: Int): Int {
        val date = LocalDate.of(year, month, 1)
        return date.dayOfWeek.value  // 1 表示星期一,7 表示星期日
    }
    
  2. 运行结果截图
  3. 缺陷
  • 没有对齐格式,有待优化
  • 输入方式可以再稍作改进,比如输入2023-10

3、骰子游戏(APP版)

《Android移动应用开发》(微课版)这本书上P95~P103完整阐述了代码以及实现功能,

demodicegame · 青峥/kotlin_study - 码云 - 开源中国 (gitee.com)(随手代码仓库,便于管理)

博主还在写实验报告中,《闪耀命运之骰》只能搁浅了。。。

三、结尾语

上述缺陷因博主太雷泽,故未做改进,若各位博主完善了上述缺陷,望不吝赐教。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值