public void PlaceTile(TileHandler tile) { if (_tile == null) { var temp = this.TileGateModel; this._tileGateModel = tile._tileGateModel; this._tileGateModel.isCertainSouth = temp.isCertainSouth; this._tileGateModel.isCertainEast = temp.isCertainEast; this._tileGateModel.isCertainNorth = temp.isCertainNorth; this._tileGateModel.isCertainWest = temp.isCertainWest; this._tile = tile._tile; IsPlaced = true; Explored = false; } }
public List <TileHandler> GetTiles() { if (_tiles == null) { string[] listOfTile = { "Tile_2_EW", "Tile_2_NS", "Tile_3_E", "Tile_3_N", "Tile_3_W", "Tile_3_S", "Tile_4", "Tile_L_NE", "Tile_L_NW","Tile_L_SE", "Tile_L_SW", "Tile_U_N", "Tile_U_E", "Tile_U_S", "Tile_U_W" }; List <TileHandler> result = new List <TileHandler>(); foreach (var tile in listOfTile) { try { var gameobj = (GameObject)(Resources.Load("Prefabs/Tiles/" + tile)); var gateModel = gameobj.GetComponent <TileGateModel>(); gateModel.isCertainSouth = false; gateModel.isCertainEast = false; gateModel.isCertainNorth = false; gateModel.isCertainWest = false; TileHandler tileProp = new TileHandler(gateModel); tileProp._tile = gameobj; result.Add(tileProp); } catch (Exception) { } } _tiles = result; } return(_tiles); }
private bool GraphIsConsistent(GraphNode <TileHandler> Node, TileHandler selectedTile, int minimumLevelSize) { Queue <GraphNode <TileHandler> > q = new Queue <GraphNode <TileHandler> >(); int totalPlacedTile = 1; q.Enqueue(Node); if (selectedTile.NumberOfPossibleNeighBors > Node.Neighbors.Count) { return(true); } while (q.Count > 0) { var node = q.Dequeue(); node.NodeObject.Explored = true; if (node.Neighbors.Count < node.NodeObject.NumberOfPossibleNeighBors) { return(true); } if (!node.NodeObject.IsPlaced) { return(true); } foreach (var neighbor in node.Neighbors) { if (!neighbor.NodeObject.Explored) { totalPlacedTile++; q.Enqueue(neighbor); } } } if (totalPlacedTile > minimumLevelSize) { return(true); } return(false); }
public Graph <TileHandler> BuildWorld(int minimumLevelSize, string seedNumber) { Graph <TileHandler> fullWorld = EmptyWorld(); if (!string.IsNullOrEmpty(seedNumber)) { seedNumberLocal = seedNumber; } else { seedNumberLocal = GameHandler.Game.Random.RandomString(12); } GameHandler.Game.Random.SetSeed(seedNumberLocal); Queue <GraphNode <TileHandler> > queue = new Queue <GraphNode <TileHandler> >(); TileHandler model = new TileHandler(); model.SetPosition(0, 0); GraphNode <TileHandler> graphModel = new GraphNode <TileHandler>(model); fullWorld.AddNode(graphModel); queue.Enqueue(graphModel); while (fullWorld.GraphNodes.Count <= minimumLevelSize && queue.Count != 0) { var dq = queue.Dequeue(); #region PlacementControl #region East if (fullWorld.GraphNodes.Any(op => op.NodeObject.IsPlaced && op.NodeObject.TileGateModel.westGate == 1 && op.NodeObject.PositionX == (dq.NodeObject.PositionX + 1) && op.NodeObject.PositionY == dq.NodeObject.PositionY)) { dq.NodeObject.TileGateModel.isCertainEast = true; } if (fullWorld.GraphNodes.Any(op => op.NodeObject.IsPlaced && op.NodeObject.TileGateModel.westGate == 0 && op.NodeObject.PositionX == (dq.NodeObject.PositionX + 1) && op.NodeObject.PositionY == dq.NodeObject.PositionY)) { dq.NodeObject.TileGateModel.eastGate = 0; } #endregion #region North if (fullWorld.GraphNodes.Any(op => op.NodeObject.IsPlaced && op.NodeObject.TileGateModel.southGate == 1 && op.NodeObject.PositionX == (dq.NodeObject.PositionX) && op.NodeObject.PositionY == dq.NodeObject.PositionY + 1)) { dq.NodeObject.TileGateModel.isCertainNorth = true; } if (fullWorld.GraphNodes.Any(op => op.NodeObject.IsPlaced && op.NodeObject.TileGateModel.southGate == 0 && op.NodeObject.PositionX == (dq.NodeObject.PositionX) && op.NodeObject.PositionY == dq.NodeObject.PositionY + 1)) { dq.NodeObject.TileGateModel.northGate = 0; } #endregion #region West if (fullWorld.GraphNodes.Any(op => op.NodeObject.IsPlaced && op.NodeObject.TileGateModel.eastGate == 1 && op.NodeObject.PositionX == (dq.NodeObject.PositionX - 1) && op.NodeObject.PositionY == dq.NodeObject.PositionY)) { dq.NodeObject.TileGateModel.isCertainWest = true; } if (fullWorld.GraphNodes.Any(op => op.NodeObject.IsPlaced && op.NodeObject.TileGateModel.eastGate == 0 && op.NodeObject.PositionX == (dq.NodeObject.PositionX - 1) && op.NodeObject.PositionY == dq.NodeObject.PositionY)) { dq.NodeObject.TileGateModel.westGate = 0; } #endregion #region South if (fullWorld.GraphNodes.Any(op => op.NodeObject.IsPlaced && op.NodeObject.TileGateModel.northGate == 1 && op.NodeObject.PositionX == (dq.NodeObject.PositionX) && op.NodeObject.PositionY == dq.NodeObject.PositionY - 1)) { dq.NodeObject.TileGateModel.isCertainSouth = true; } if (fullWorld.GraphNodes.Any(op => op.NodeObject.IsPlaced && op.NodeObject.TileGateModel.northGate == 0 && op.NodeObject.PositionX == (dq.NodeObject.PositionX) && op.NodeObject.PositionY == dq.NodeObject.PositionY - 1)) { dq.NodeObject.TileGateModel.southGate = 0; } #endregion #endregion var selectedTile = dq.NodeObject.SelectTile(); // Make it so every node can be visited foreach (var node in fullWorld.GraphNodes) { node.NodeObject.Explored = false; } //Should Check Whether The Loop Is Closed When It has not supposed to be while (fullWorld.GraphNodes.Count > 1 && !GraphIsConsistent(dq, selectedTile, minimumLevelSize)) { selectedTile = dq.NodeObject.SelectTile(); // Make it so every node can be visited foreach (var node in fullWorld.GraphNodes) { node.NodeObject.Explored = false; } } dq.NodeObject.PlaceTile(selectedTile); if (dq.NodeObject.TileGateModel.southGate == 1 && !dq.NodeObject.TileGateModel.isCertainSouth && !fullWorld.GraphNodes.Any(op => op.NodeObject.PositionX == (dq.NodeObject.PositionX) && op.NodeObject.PositionY == dq.NodeObject.PositionY - 1)) { var newGraphNode = new GraphNode <TileHandler>(new TileHandler()); newGraphNode.NodeObject.SetPosition(dq.NodeObject.PositionX, dq.NodeObject.PositionY - 1); newGraphNode.NodeObject.TileGateModel.isCertainNorth = true; fullWorld.AddNode(newGraphNode); fullWorld.AddUndirectedEdge(dq, newGraphNode, 0); queue.Enqueue(newGraphNode); } if (dq.NodeObject.TileGateModel.eastGate == 1 && !dq.NodeObject.TileGateModel.isCertainEast && !fullWorld.GraphNodes.Any(op => op.NodeObject.PositionX == (dq.NodeObject.PositionX + 1) && op.NodeObject.PositionY == dq.NodeObject.PositionY)) { var newGraphNode = new GraphNode <TileHandler>(new TileHandler()); newGraphNode.NodeObject.SetPosition(dq.NodeObject.PositionX + 1, dq.NodeObject.PositionY); newGraphNode.NodeObject.TileGateModel.isCertainWest = true; fullWorld.AddNode(newGraphNode); fullWorld.AddUndirectedEdge(dq, newGraphNode, 0); queue.Enqueue(newGraphNode); } if (dq.NodeObject.TileGateModel.westGate == 1 && !dq.NodeObject.TileGateModel.isCertainWest && !fullWorld.GraphNodes.Any(op => op.NodeObject.PositionX == (dq.NodeObject.PositionX - 1) && op.NodeObject.PositionY == dq.NodeObject.PositionY)) { var newGraphNode = new GraphNode <TileHandler>(new TileHandler()); newGraphNode.NodeObject.SetPosition(dq.NodeObject.PositionX - 1, dq.NodeObject.PositionY); newGraphNode.NodeObject.TileGateModel.isCertainEast = true; fullWorld.AddNode(newGraphNode); fullWorld.AddUndirectedEdge(dq, newGraphNode, 0); queue.Enqueue(newGraphNode); } if (dq.NodeObject.TileGateModel.northGate == 1 && !dq.NodeObject.TileGateModel.isCertainNorth && !fullWorld.GraphNodes.Any(op => op.NodeObject.PositionX == (dq.NodeObject.PositionX) && op.NodeObject.PositionY == dq.NodeObject.PositionY + 1)) { var newGraphNode = new GraphNode <TileHandler>(new TileHandler()); newGraphNode.NodeObject.SetPosition(dq.NodeObject.PositionX, dq.NodeObject.PositionY + 1); newGraphNode.NodeObject.TileGateModel.isCertainSouth = true; fullWorld.AddNode(newGraphNode); fullWorld.AddUndirectedEdge(dq, newGraphNode, 0); queue.Enqueue(newGraphNode); } } var unPlacedNodes = fullWorld.GraphNodes.ToList().FindAll(op => op.NodeObject.IsPlaced == false); for (int i = 0; i < unPlacedNodes.Count; i++) { var unPlacedNode = unPlacedNodes[i]; var eastNode = fullWorld.GraphNodes.ToList().FirstOrDefault(op => op.NodeObject.IsPlaced && op.NodeObject.PositionX == unPlacedNode.NodeObject.PositionX + 1 && op.NodeObject.PositionY == unPlacedNode.NodeObject.PositionY); var westNode = fullWorld.GraphNodes.ToList().FirstOrDefault(op => op.NodeObject.IsPlaced && op.NodeObject.PositionX == unPlacedNode.NodeObject.PositionX - 1 && op.NodeObject.PositionY == unPlacedNode.NodeObject.PositionY); var northNode = fullWorld.GraphNodes.ToList().FirstOrDefault(op => op.NodeObject.IsPlaced && op.NodeObject.PositionX == unPlacedNode.NodeObject.PositionX && op.NodeObject.PositionY == unPlacedNode.NodeObject.PositionY + 1); var southNode = fullWorld.GraphNodes.ToList().FirstOrDefault(op => op.NodeObject.IsPlaced && op.NodeObject.PositionX == unPlacedNode.NodeObject.PositionX && op.NodeObject.PositionY == unPlacedNode.NodeObject.PositionY - 1); if (eastNode != null) { unPlacedNode.NodeObject.TileGateModel.isCertainEast = eastNode.NodeObject.TileGateModel.westGate == 1; } if (westNode != null) { unPlacedNode.NodeObject.TileGateModel.isCertainWest = westNode.NodeObject.TileGateModel.eastGate == 1; } if (northNode != null) { unPlacedNode.NodeObject.TileGateModel.isCertainNorth = northNode.NodeObject.TileGateModel.southGate == 1; } if (southNode != null) { unPlacedNode.NodeObject.TileGateModel.isCertainSouth = southNode.NodeObject.TileGateModel.northGate == 1; } unPlacedNode.NodeObject.CloseWorld(); } if (fullWorld.Count <= minimumLevelSize) { fullWorld = BuildWorld(minimumLevelSize, seedNumberLocal); } return(fullWorld); }