【问题标题】:Scala returning multi-dimensional arraysScala返回多维数组
【发布时间】:2016-01-20 18:35:08
【问题描述】:

我正在尝试在 Scala 中制作一个简单的扫雷游戏,并且我正在尝试制作一个调用嵌套方法的方法,用于将地雷随机放置到网格中。

我在 Array 上使用 ofDim 方法使其成为多维的,效果很好,直到我将它指定为方法返回类型。我得到的错误是:

type ofDim 不是对象数组的成员

代码如下:

class GridBuilder(x:Int, y:Int, mines:Int) {
  def generateGrid: Array.ofDim[String](x, y) = {
    def placeMines(mineLocations: Array.ofDim[String](x, y)): Array.ofDim[String](x, y) = {
      val xcoord = Random.nextInt(x)
      val ycoord = Random.nextInt(y)
      if (mineLocations.count(_ ==  "Bomb") == mines)
        mineLocations
      else if (mineLocations(xcoord) (ycoord) contains "Mine")
        placeMines(mineLocations)
      else 
        placeMines(mineLocations(xcoord)(ycoord) = "Mine")
      }
    placeMines(new Array.ofDim[String](x, y))
  }
}

我还没有找到任何关于在任何地方返回多维数组的信息。这在 Scala 中可行吗?我在这里错过了什么?

【问题讨论】:

    标签: arrays scala multidimensional-array return


    【解决方案1】:
    1. Array.ofDim 是一种方法,而不是一种类型,
    2. 如果你看一下implemented,它是一堆重载的方法,每个都有不同的返回类型。在你的情况下Array[Array[String]]。

    【讨论】:

    • 谢谢,我一直在用头撞墙寻找那个!现在完美运行
    【解决方案2】:

    我整理了一个简单的小示例,以便您可以比较最终得到的结果。它绝不是完美的,不包括无效的用户输入,或游戏结束等,但无论如何。

    import scala.annotation.tailrec
    import scala.util.Random
    
    sealed trait GridValue
    case object Bomb extends GridValue
    case object Empty extends GridValue
    case object Checked extends GridValue
    
    case class Grid(private var grid: List[List[GridValue]]){
      def click(x: Int, y: Int): String = {
        grid(x)(y) match {
          case Bomb    => "BOOM! You lose!"
          case Empty   =>
            grid = grid.updated(x, grid(x).updated(y, Checked))
            "No bomb! Good Job"
          case Checked => "You've already clicked here!"
        }
      }
    }
    
    object Grid{
      def buildGrid(x: Int, y: Int, mines: Int): Grid = {
        @tailrec
        def placeMines(grid: List[List[GridValue]] = List.fill(x)(List.fill(y)(Empty)), minesRemaining: Int = mines): List[List[GridValue]] = {
          if(minesRemaining == 0) {
            grid
          } else {
            val xcoord = Random.nextInt(x)
            val ycoord = Random.nextInt(y)
            grid(xcoord)(ycoord) match {
              case Bomb => placeMines(grid, minesRemaining)
              case Empty => placeMines(grid.updated(xcoord,grid(xcoord).updated(ycoord, Bomb)), minesRemaining - 1)
            }
          }
        }
        Grid(placeMines())
      }
    }
    
    //Start game: val game = Grid.buildGrid(100, 100, 5)
    
    //Click: game.click(10, 10)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      相关资源
      最近更新 更多