分钱问题:

tornadofx动画演示分钱问题-LMLPHP

tornadofx动画演示分钱问题-LMLPHP

import javafx.animation.AnimationTimer
import javafx.collections.FXCollections
import javafx.scene.paint.Color
import javafx.scene.shape.Rectangle
import javafx.util.Duration
import tornadofx.*

class LearnApp : App(LearnV::class)
class LearnV : View("learn 分钱问题") {
//    每个矩形宽度
    val w = 10.0
//    100个矩形容器
    val rec = FXCollections.observableArrayList<Rectangle>()
    val b = (0..99)
//    100个人,每人100元
    val money = b.map { 100 }.toIntArray()
//    动画计时器
    val aniTimer=AniTimer(this)
//    每次给其他人10元
    val money1=10
    val result= stringProperty()
    override val root = vbox(5) {
        label(result){
            isWrapText=true
        }
        hbox(5) {
            button("run").action {
//                ani()
                aniTimer.start()
            }
            button("stop").action {
//                ani()
                aniTimer.stop()
            }
        }
        hbox(5) {
            // 画100个宽度为w,高度为100的矩形,方法1

//            var i = 0
//            b.forEach {
//                val r = rectangle(w * it, 0.0, w, 100.0) {
//                    fill = Color.BLUE
//                }
//                rec.add(r)
//                i.inc()
//            }

            // 画100个宽度为w,高度为100的矩形,方法2
            for(i in money.indices){
                val r = rectangle(w * i, 0.0, w, 100.0) {
                    fill = Color.BLUE
                }
                rec.add(r)
            }
        }

        prefWidth = 800.0
        prefHeight = 800.0
    }



    // 此方法无法停止动画
    fun ani() {
        class AniTimer : AnimationTimer() {
            var lastTime = 0L
            override fun handle(now: Long) {
                if ((now - lastTime) > 10000000) {
                    lastTime = now
                } else {
                    return
                }
                paint()
            }
        }
        AniTimer().start()
    }

    fun paint() {
//        999次后的结果
//        (0..999).forEach {
//            var i = 0
//            timeline {
//                keyframe(Duration.seconds(0.10)) {
//                    money.forEach {
//                        val j = b.random()
//                        if(money[i]>0){
//                            money[i] -= 10
//                            money[j] += 10
//                            keyvalue(rec[i].heightProperty(), money[i])
//                            keyvalue(rec[j].heightProperty(), money[j])
//                        }
//                        i++
//                    }
//                    println(money.toList())
//                }
//            }
//        }

        var i=0
        timeline {
            keyframe(Duration.seconds(0.10)) {
                money.forEach {
                    val j = b.random()
                    if(money[i]>0){
                        money[i] -= money1
                        money[j] += money1
                        keyvalue(rec[i].heightProperty(), money[i])
                        keyvalue(rec[j].heightProperty(), money[j])
                    }
                    i++
                }
//                如要看排序后的结果,取消下面注释
//                money.sort()
                result.value=money.toList().toString()
//                println(money.toList())
            }
        }
    }

    // 此方法可以停止动画
    class AniTimer(val learnV:LearnV) : AnimationTimer() {
        var lastTime = 0L
        override fun handle(now: Long) {
            if ((now - lastTime) > 10000000) {
                lastTime = now
            } else {
                return
            }
            learnV.paint()
        }
    }
}
07-16 09:24