private static LinkedList<INodeInformation> CreateSector(string name, int sectorSideSize, IPlayer emptyPlayer) { LinkedList<INodeInformation> ret = new LinkedList<INodeInformation>(); var sector = new SectorInfo(); /* building the nodes >>> */ int layersInSector = sectorSideSize; for (int layer = 0; layer < sectorSideSize; layer++) { int rowsInLayer = layersInSector - layer; int indexInLayer = 0; for (int row = 0; row < rowsInLayer; row++) { int columnsInRow = rowsInLayer - row; for (int column = 0; column < columnsInRow; column++) { var node = new SampleMockNodeInformation(layer, row, column, sector, emptyPlayer); node.IndexInLayer = indexInLayer; ret.AddLast(node); indexInLayer++; } } } /* <<< building the nodes */ /* joining the nodes >>> */ var exits = new NodeExit[] { NodeExit.Alpha, NodeExit.Beta, NodeExit.Delta, NodeExit.Epsilon, NodeExit.Eta, NodeExit.Gamma, NodeExit.Iota, NodeExit.Kappa, NodeExit.Lambda, NodeExit.Mu, NodeExit.Theta, NodeExit.Zeta }; foreach (SampleMockNodeInformation node in ret) { int startLayer = node.Layer; int startRow = node.Row; int startColumn = node.Column; int startIndex = node.IndexInLayer; var currRow0 = startRow - 1; var currColumns0 = new int[]{ startColumn, startColumn + 1 }; var currRow1 = startRow; var currColumns1 = new int[] { startColumn - 1, startColumn + 1 }; var currRow2 = startRow + 1; var currColumns2 = new int[] { startColumn - 1, startColumn }; var currNodes = (from n in ret where n.Layer == startLayer where (n.Row == currRow0 && currColumns0.Contains(n.Column)) || (n.Row == currRow1 && currColumns1.Contains(n.Column)) || (n.Row == currRow2 && currColumns2.Contains(n.Column)) select n).ToList(); int nextLayer = startLayer + 1; var nextRow0 = startRow; var nextColumns0 = new int[] { startColumn }; var nextRow1 = startRow - 1; var nextColumns1 = new int[] { startColumn - 1, startColumn }; var nextNodes = (from n in ret where n.Layer == nextLayer where (n.Row == nextRow0 && nextColumns0.Contains(n.Column)) || (n.Row == nextRow1 && nextColumns1.Contains(n.Column)) select n).ToList(); var nestedNodes = currNodes.Concat(nextNodes).ToList(); //var connectedNodes = currNodes.Concat(nextNodes).ToList(); var connectedNodes = (from n in nestedNodes let currN = n.Exits.Where(kp => kp.Value == node).Select(kp => kp.Value).FirstOrDefault() where null == currN select n).ToList(); var currAvailableExits = new List<NodeExit>(exits.Except(node.Exits.Keys)); for (int i = 0; i < connectedNodes.Count; i++) { var nextNode = connectedNodes[i]; var exit = currAvailableExits[i]; node.Exits.Add(exit, nextNode); var connAvailableExits = new List<NodeExit>(exits.Except(nextNode.Exits.Keys)); var nextExit = connAvailableExits.First(); nextNode.Exits.Add(nextExit, node); } } /* <<< joining the nodes */ /* * 0 1 2 3 * 0 1 2 * 4 5 6 0 1 * 3 4 0 * 7 8 2 * 5 * 9 * * * L0:0 -> L0:{1,4} + L1:0 = 3 * L0:1 -> L0:{0,2,4,5} + L1:{0,1} = 6 * L0:2 -> L0:{1,3,5,6} + L1:{1,2} = 6 * L0:3 -> L0:{2,6} + L1:2 = 3 * L0:4 -> L0:{0,1,5} + L1:{0,3} = 5 * L0:5 -> L0:{1,2,4,6,7,8} + L1:{1,3,4} = 9 * L0:6 -> L0:{2,3,5,8} + L1:{2,4} = 6 * L0:7 -> L0:{4,5,8,9} + L1:{3,5} = 6 * L0:8 -> L0:{5,6,7,9} + L1:{4,5} = 6 * L0:9 -> L0:{7,8} + L1:5 = 3 * * L1:0 -> L1:{1,3} + L0:{0,1,4} + L2:0 = 6 * L1:1 -> L1:{0,2,3,4} + L0:{1,2,5} + L2:{0,1} = 9 * L1:2 -> L1:{1,4} + L0:{2,3,4} + L2:1 = 6 * L1:3 -> L1:{0,1,4,5} + L0:{4,5,7} + L2:{0,2} = 9 * L1:4 -> L1:{1,2,3,5} + L0:{5,6,8} + L2:{1,2} = 9 * L1:5 -> L1:{3,4} + L0:{7,8,9} + L2:2 = 6 * * L2:0 -> L2:{1,2} + L1:{0,1,3} + L3:0 = 6 * L2:1 -> L2:{0,2} + L1:{1,2,4} + L3:0 = 6 * L2:2 -> L2:{0,1} + L1:{3,4,5} + L3:0 = 6 * * L3:0 -> L3:<-> + L2:{0,1,2} = 3 * * * X X X X XXXX * X X X XXX * X X XX * X X * * 0 1 2 3 0123 * 4 5 6 456 * 7 8 78 * 9 9 * * * R 0123 012 12 1 * C * 0 0123 012 12 1 * 1 456 34 3 * 2 78 5 * 3 9 */ return ret; }