Scala for循环未执行求助:N连子游戏棋盘打印异常
解决Scala N连子游戏棋盘打印的问题
嘿,作为Scala新手踩这些坑真的太正常了!我帮你梳理下代码里的几个关键问题:
1. 字符串不可变性导致拼接完全无效
Scala中的String是不可变对象,你代码里写的repres + "X"只是生成了一个全新的字符串,但并没有把这个新值重新赋值给repres变量。不管循环里做了多少次拼接,初始的空字符串repres从来没被改变过,最后返回的自然是空内容。
2. 循环范围错误,直接漏掉最后一行和最后一列
你用了0 until board.length - 1,但until是左闭右开的区间,这会让循环只执行到board.length-2,等于直接跳过了最后一行。列的循环0 until board(rowIndex).length -1也犯了同样的错误,会漏掉每一行的最后一个元素。
3. 冗余的嵌套循环写法(可选优化)
Scala更推荐用函数式的方式处理集合,嵌套for循环不仅代码啰嗦,效率也不如直接遍历集合元素。
修正后的代码示例
这里给你两种可行的写法,你可以根据习惯选择:
方式一:用可变的StringBuilder(适合新手理解)
override def toString(): String = { val repres = new StringBuilder() // 用可变的StringBuilder来拼接内容 for (row <- board) { // 直接遍历每一行,不用手动处理索引 for (cell <- row) { cell match { case Player.Player1 => repres.append("X") case Player.Player2 => repres.append("O") case Player.NoPlayer => repres.append("_") case _ => throw new IllegalArgumentException("无效的玩家状态") } } repres.append(System.lineSeparator()) // 每一行结束后换行 } repres.toString() // 最后转成String返回 }
方式二:函数式风格(更贴合Scala的写法)
override def toString(): String = { board.map { row => row.map { case Player.Player1 => "X" case Player.Player2 => "O" case Player.NoPlayer => "_" case _ => throw new IllegalArgumentException("无效的玩家状态") }.mkString("") // 把一行的所有元素拼成单个字符串 }.mkString(System.lineSeparator()) // 把所有行用换行符拼接起来 }
额外小提示
如果你坚持要用索引遍历的方式,记得把循环范围改成0 until board.length(行)和0 until board(rowIndex).length(列),不要减1,这样就能覆盖所有元素了。
内容的提问来源于stack exchange,提问作者kjwdamme
相关产品推荐
相关产品推荐

