分钱问题:
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()
}
}
}