private static void ConnectNodes(MutatingNode node, MutatingNode upperNode) { if (upperNode != null) { node.Connections.Add(upperNode); upperNode.Connections.Add(node); } }
/// <summary> /// Builds the world from the input /// </summary> /// <param name="path">Path to the input file</param> /// <returns>The constructed world</returns> public async Task <LinkedList <MutatingNode> > BuildWorldFromInput(string path) { if (!File.Exists(path)) { throw new ArgumentException($"Unable to find file at {path}."); } var world = new LinkedList <MutatingNode>(); using (var input = new StreamReader(path)) { string allText = await input.ReadToEndAsync(); var lines = allText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); // tempArray is used to determine the neighbours (one/off) var tempArray = new MutatingNode[lines.Length][]; for (int row = 0; row < lines.Length; ++row) { int columnsLength = lines[row].Length; tempArray[row] = new MutatingNode[columnsLength]; for (int column = 0; column < columnsLength; column++) { var node = new MutatingNode(lines[row][column] == '*', row, column); world.AddLast(node); tempArray[row][column] = node; if (row > 0 && row <= tempArray.Length) { MutatingNode upperNode = tempArray[row - 1][column]; ConnectNodes(node, upperNode); if (column < columnsLength - 1) { MutatingNode upperRightNode = tempArray[row - 1][column + 1]; ConnectNodes(node, upperRightNode); } } if (column > 0) { MutatingNode leftNode = tempArray[row][column - 1]; ConnectNodes(node, leftNode); } if (column > 0 && row > 0) { MutatingNode upperLeftNode = tempArray[row - 1][column - 1]; ConnectNodes(node, upperLeftNode); } } } } return(world); }