You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:31:18