sealed trait Mark case object Circle extends Mark case object Cross extends Mark case class Board(array: Array[Array[Mark]]) { lazy val cols: Array[Array[Mark]] = { val col1 = Array(array(0)(0), array(1)(0), array(2)(0)) val col2 = Array(array(0)(1), array(1)(1), array(2)(1)) val col3 = Array(array(0)(2), array(1)(2), array(2)(2)) Array(col1, col2, col3) } lazy val firstRow = array(0) lazy val secondRow = array(1) lazy val thirdRow = array(2) lazy val firstCol = cols(0) lazy val secondCol = cols(1) lazy val thirdCol = cols(2) lazy val firstCross = Array(firstRow(0), secondRow(1), thirdRow(2)) lazy val secondCross = Array(firstRow(2), secondRow(1), thirdRow(0)) } object Check { def inRows(board: Board, mark: Mark): Boolean = { lazy val inRow1 = board.firstRow.forall(_ == mark) lazy val inRow2 = board.secondRow.forall(_ == mark) lazy val inRow3 = board.thirdRow.forall(_ == mark) inRow1 || inRow2 || inRow3 } def inCols(board: Board, mark: Mark): Boolean = { lazy val inCol1 = board.firstCol.forall(_ == mark) lazy val inCol2 = board.secondCol.forall(_ == mark) lazy val inCol3 = board.thirdCol.forall(_ == mark) inCol1 || inCol2 || inCol3 } def inCross(board: Board, mark: Mark): Boolean = { lazy val inCross1 = board.firstCross.forall(_ == mark) lazy val inCross2 = board.secondCross.forall(_ == mark) inCross1 || inCross2 } } val array: Array[Array[Mark]] = Array( Array(Cross, Cross, Cross), Array(Cross, Cross, Circle), Array(Cross, Circle, Cross) ) assert(Check.inRows(Board(array), Cross) == true) assert(Check.inCols(Board(array), Cross) == true) assert(Check.inCross(Board(array), Cross) == true) assert(Check.inCross(Board(array), Circle) == false)