Я пытаюсь решить GameOfLife в Scala, где у меня есть бесконечная сетка.Я пытаюсь представить сетку в виде набора ячеек (х, у).Когда я читаю со слова String, я начинаю с (0,0).Но из-за законов GameOfLife и поскольку я рассматриваю Infinite Grid после применения правил к моему классу Generation, я хочу напечатать текущее поколение.
Здесь я не уверен, как рассчитать минимальную позицию (читай x,y итераторы) откуда начинать итерацию и печатать 'X' для живой ячейки и '-' для мертвой ячейки в GameOfLife для этого поколения. Я предоставляю свое наивное решение метода toString класса Generation.Но я совсем не доволен этим.Кто-нибудь может предложить лучшее решение?
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) - класс case.