0

我正在尝试在有无限网格的 Scala 中解决 GameOfLife 问题。我试图将网格表示为一组单元格(x,y)。当我从说字符串中读取时,我从 (0,0) 开始。但是由于 GameOfLife 的规律,并且由于我在将规则应用于我的 Generation 类之后正在考虑 Infinite Grid,所以我想打印当前一代。

在这里,我不知道如何计算最小位置(读取 x,y 迭代器)从哪里开始迭代和打印“X”代表活细胞和“-”代表那一代的 GameOfLife 中的死细胞。我提供我的天真Generation类的toString方法的解决方案。但我对此一点也不满意。有人可以提出更好的解决方案吗?

override def toString:String = 
   {
        val output:StringBuilder = new StringBuilder();
        val minOfRowColumn = for
        {
          cell <- aliveCells
          row = cell.row
          column = cell.column
        } yield if( row < column ) row else column

        val min = minOfRowColumn.min

        val maxOfRowColumn = for
        {
          cell <- aliveCells
          row = cell.row
          column = cell.column
        } yield if( row > column ) row else column

        val max = maxOfRowColumn.max

        var row = min;
        var column = min;

        while(row <= max)
        {
          while(column <= max)
          {
            if(aliveCells.contains(Cell(row,column)))
            {
              output.append('X')
            }
            else
              output.append('-')
            column = column + 1
          }
          output.append("\n");
          column = min
          row = row + 1
        }


        //remove the last new line addded.
        val indexOfNewLine = output.lastIndexOf("\n");
        if( -1 != indexOfNewLine )
        output.delete(indexOfNewLine,output.length());

        return output.toString();
   }

这里的 aliveCells 是一个 Set[Cell] ,其中 Cell 是 Cell(x,y) 一个案例类。

4

1 回答 1

1

我提出以下代码:

override def toString = {
  val min = aliveCells.iterator.flatMap(c => Seq(c.row, c.column)).min
  val max = aliveCells.iterator.flatMap(c => Seq(c.row, c.column)).max

  (min to max) map { row =>
    (min to max) map (col => if (aliveCells(Cell(row, col))) "X" else "-") mkString
  } mkString ("\n")
}

如果您不特别想要方形网格,则可能需要分隔最小/最大列和行:

val minC = aliveCells.iterator.map(_.column).min

等等。

于 2012-01-17T08:14:55.860 回答