【Android Studio】用Kotlin语言编写模拟 F1 方程式赛车的程序

问题:

程序包含 1 个主函式、1 个 赛车(RacingCar)类、1 个 Mercedes 类、1 个 Ferrari 类、1 个BMW类与1个跑(Run)接口。RacingCar类有位置(position)属性,用来纪录实例目前的位置,Run 接口有跑(go)方法须实现。Mercedes 类、Ferrari 类与 BMW 类须继承 RacingCar类,并实现跑接口。3 类中都有名称(name)属性,用以暂存赛车实例名称,而实例调用跑方法,将改变实例的位置。在主函式中分别创建 3 种赛车的实例,在模拟赛车的循环中,轮流调用实例的 go 方法,用随机数random方法改变赛车实例的位置(每次的位移量不宜过大),3 个实例移动完后,分别打印出各车辆当前的位置,并检查是否有赛车实例已移动超过 200 公里,若有,则该实例获胜,退出模拟赛车循环,打印出获胜车辆的名称,程序结束。

程序运行的过程与结果如下图所示

img

import java.util.*

object Main {
    fun main(args: Array<String>) {
        val mercedes = Mercedes()
        val ferrari = Ferrari()
        val bmw = BMW()
        while (true) {
            mercedes.go(Random().nextInt(10))
            ferrari.go(Random().nextInt(10))
            bmw.go(Random().nextInt(10))
            println(mercedes.name + ":" + mercedes.position)
            println(ferrari.name + ":" + ferrari.position)
            println(bmw.name + ":" + bmw.position)
            if (mercedes.position >= 200) {
                println("The winner is:" + mercedes.name)
                break
            }
            if (ferrari.position >= 200) {
                println("The winner is:" + ferrari.name)
                break
            }
            if (bmw.position >= 200) {
                println("The winner is:" + bmw.name)
                break
            }
        }
    }

    internal open class RacingCar {
        var position = 0
    }

    internal interface Run {
        fun go(distance: Int)
    }

    internal class Mercedes : RacingCar(), Run {
        var name = "Mercedes"
        override fun go(distance: Int) {
            position += distance
        }
    }

    internal class Ferrari : RacingCar(), Run {
        var name = "Ferrari"
        override fun go(distance: Int) {
            position += distance
        }
    }

    internal class BMW : RacingCar(), Run {
        var name = "BMW"
        override fun go(distance: Int) {
            position += distance
        }
    }
}

fun main(args: Array<String>) {
    val carList = arrayListOf(RaceCar("Car1"),RaceCar("Car2"),RaceCar("Car3"))
    Thread{
        run {
            while (true) {
                carList.forEach {
                    it.running(Random().nextInt(10) + 5)
                    println("${it.name} current sumDistance is:${it.sumDistance}")
                }
                carList.forEach {
                    if (it.sumDistance >= 200) {
                        println("winner is->${it.name}")
                        return@Thread
                    }
                }
                Thread.sleep(500)
            }
        }
    }.start()
}
data class RaceCar(var name: String, var sumDistance: Int = 0) : Running {
    override fun running(delta: Int) {
        sumDistance += delta
    }
}
interface Running {
    fun running(delta: Int)
}

我嫌麻烦没写那么多类,只写了下简单逻辑,跟前面那位大佬的差不多,你随便看下就好