不是随机DIE结果,所有6个都显示相同的图像和相同的滚动数



我需要显示5随机死亡结果,我做错了什么,他们都导致相同的数字和图像?IE。扔一个5,它们都显示5,当它们都需要随机时,5的图像就会出现。

val iv1 = findViewById(R.id.iv1) as ImageView
val iv2 = findViewById(R.id.iv2) as ImageView
val iv3 = findViewById(R.id.iv3) as ImageView
val iv4 = findViewById(R.id.iv4) as ImageView
val iv5 = findViewById(R.id.iv5) as ImageView
val btnRoll = findViewById<Button>(R.id.btnRoll)
btnRoll.setOnClickListener {
val randomInt = Random().nextInt(5) + 1
val drawableResource = when (randomInt) {
1 -> R.drawable.die1
2 -> R.drawable.die2
3 -> R.drawable.die3
4 -> R.drawable.die4
5 -> R.drawable.die5
else -> R.drawable.die6
}
iv1.setImageResource(drawableResource)
iv2.setImageResource(drawableResource)
iv3.setImageResource(drawableResource)
iv4.setImageResource(drawableResource)
iv5.setImageResource(drawableResource)

如何用最少的代码改变它:把你的视图放在一个列表中,这样你就可以遍历它们,这样每个视图都得到一个随机值:

btnRoll.setOnClickListener {
val imageViews = listOf(iv1, iv2, iv3, iv4, iv5)
for (imageView in imageViews) {
val randomInt = Random().nextInt(5) + 1
val drawableResource = when (randomInt) {
1 -> R.drawable.die1
2 -> R.drawable.die2
3 -> R.drawable.die3
4 -> R.drawable.die4
5 -> R.drawable.die5
else -> R.drawable.die6
}
imageView.setImageResource(drawableResource)
}
}

但是为了减少代码重复,我将在一个列表中初始化所有视图。此外,您还可以通过列出可提取项并直接调用列表中的random()来消除when语句:

val imageViews = listOf(R.id.iv1, R.id.iv2, R.id.iv3, R.id.iv4, R.id.iv5)
.map { findViewById<ImageView>(it) }
val drawables = listOf(
R.drawable.die1,
R.drawable.die2,
R.drawable.die3,
R.drawable.die4,
R.drawable.die5,
R.drawable.die6
)
val btnRoll = findViewById<Button>(R.id.btnRoll)
btnRoll.setOnClickListener {
for (imageView in imageViews) {
imageView.setImageResource(drawables.random())
}
}

我想在你解决这个问题之前,你可以把它想象成算法get n distinct random numbers检查我的解决方案:

val views = listOf<ImageView>(
findViewById(R.id.iv1) as ImageView,
findViewById(R.id.iv2) as ImageView,
findViewById(R.id.iv3) as ImageView,
findViewById(R.id.iv4) as ImageView,
findViewById(R.id.iv5) as ImageView,
)
btnRoll.setOnClickListener {
val s: MutableSet<Int> = mutableSetOf()
while (s.size < views.size) { s.add((views.indices).random()) }
s.forEachIndexed { index, value ->
val drawableResource = when (value + 1) {
1 -> R.drawable.die1
2 -> R.drawable.die2
3 -> R.drawable.die3
4 -> R.drawable.die4
5 -> R.drawable.die5
else -> R.drawable.die6
}
views[index].setImageResource(drawableResource)
}
}

最新更新