class Sokoban(Playground: Array<CharArray>)
{
private var playground = Playground
private val _Playground = Playground
fun move(d: String) {
...//"playground" got modified.
}
fun restart() {
playground = _Playground
}
}
fun main(args: Array<String>) {
val Playground: Array<CharArray> = arrayOf(
"###########".toCharArray(),
"#$...*....#".toCharArray(),
"#..@......#".toCharArray(),
"###########".toCharArray()
)
val sokoban = Sokoban(Playground.clone())
sokoban.move("Left")
sokoban.restart()
}
上面的代码预计会重置变量&#34; playground&#34;当功能&#34;重启&#34;被称为,但它失败.Instead变量&#34; _Playground&#34;被修改了。 如何解决这个异常问题?
答案 0 :(得分:0)
此代码无法正常工作,因为Java,因此,Kotlin使用引用,而不是对象。因此,您的变量_Playground
只是对变量playground
的引用。如果您希望它按预期工作 - 请_Playground
填充Playground
变量。
此外,您的代码无法编译,因为您未将Playground
作为字段传递,而您的reset
方法无法访问该字段。
我认为您应该知道您没有遵循java / kotlin的样式指南。通常,变量应在camelcase中命名,并从小写字母开始。
答案 1 :(得分:0)
正如其他人所提到的,您的代码不遵循编码约定,并且有参考和其他问题。但是学习一门新语言并不容易。这是一个有效的解决方案(添加了print()以显示结果并允许我确认结果;)
我定义了'move'来将第一个元素设置为传递的字符串。
这为Sokoban创建了一个名为playground的可修改的私有属性。必须是可修改的(var)才能重新启动。
内部属性_playground采用克隆,以便以后可以恢复。
还整理了物品的名称。希望这有助于您学习Kotlin的旅程。
class Sokoban(private var playground: Array<CharArray>) {
private val _playground = playground.clone()
fun move(d: String) {
playground[0] = d.toCharArray()
}
fun restart() {
playground = _playground
}
fun print() {
println("Current value")
playground.forEach { println(it) }
}
}
fun main(args: Array<String>) {
val playground: Array<CharArray> = arrayOf(
"###########".toCharArray(),
"#$...*....#".toCharArray(),
"#..@......#".toCharArray(),
"###########".toCharArray()
)
val sokoban = Sokoban(playground)
sokoban.move("Left")
sokoban.print()
sokoban.restart()
sokoban.print()
}