一、前言
现在向我们展示的是某位憨憨在上课时候在下面跟着讲台上老师一行行敲代码,最终敲成的程序。敲的时候没啥感觉,跟着老师思路走,敲完后腰酸了,头晕了,才知道上课老师讲得有多幸苦(而且还是站着敲代码)。
二、程序
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、月历程序(终端版)
代码实现@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
/**
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 表示星期日
}
运行结果截图
3、骰子游戏(APP版)
《Android移动应用开发》(微课版)这本书上P95~P103完整阐述了代码以及实现功能,
demodicegame · 青峥/kotlin_study - 码云 - 开源中国 (gitee.com)(随手代码仓库,便于管理)
博主还在写实验报告中,《闪耀命运之骰》只能搁浅了。。。
三、结尾语
上述缺陷因博主太雷泽,故未做改进,若各位博主完善了上述缺陷,望不吝赐教。