Meet your neighbors
In this section, we will add the code necessary to link up each tile with its immediate neighbors. At most, a tile can have 8 neighbors:
First, we need to enhance our Tile class a bit by adding a set of neighbors to it:
public class Tile : MonoBehaviour { private HashSet neighbors; ... public Tile() { weight = 1; neighbors = new HashSet<Tile>(); } public void AddNeighbor(Tile neighbor) { neighbors.Add(neighbor); } public HashSet GetNeighbors() { return neighbors; } }
Next, we update the GridCreator class by adding an array of Tiles. In addition, we create a new private method to add all the neighbors:
public class GridCreator : MonoBehaviour { ... private Tile[,] tiles; void Start() { tiles = new Tile[gridWidth, gridHeight]; for (int w = 0; w < gridWidth; w++) { for (int h = 0; h < gridHeight; h++) { GameObject tileGameObject = Instantiate( tilePrefab, new Vector2(w, h), Quaternion.identity ); Tile tile = tileGameObject.GetComponentInChildren<Tile>(); tile.SetWeight(w * gridWidth + h); tiles[w, h] = tile; } } AddNeighbors(); } } private void AddNeighbors() { }
The implementation of AddNeighbors() while initially looking somewhat complex is fairly straight-forward. We iterate through each tile and identify all its neighbors based on the tile's current position (w, h):
private void AddNeighbors() { for (int w = 0; w < gridWidth; w++) { for (int h = 0; h < gridHeight; h++) { Tile currentTile = tiles[w, h]; if (w > 0) { // W neighbor currentTile.AddNeighbor(tiles[w - 1, h]); } if (w < gridWidth - 1) { // E neighbor currentTile.AddNeighbor(tiles[w + 1, h]); } if (h > 0) { // S neighbor currentTile.AddNeighbor(tiles[w, h - 1]); } if (h < gridHeight - 1) { // N neighbor currentTile.AddNeighbor(tiles[w, h + 1]); } if (w > 0 && h > 0) { // SW neighbor currentTile.AddNeighbor(tiles[w - 1, h - 1]); } if (w < gridWidth - 1 && h < gridHeight - 1) { // NE neighbor currentTile.AddNeighbor(tiles[w + 1, h + 1]); } if (w > 0 && h < gridHeight - 1) { // NW neighbor currentTile.AddNeighbor(tiles[w - 1, h + 1]); } if (w < gridWidth - 1 && h > 0) { // SE neighbor currentTile.AddNeighbor(tiles[w + 1, h - 1]); } } } }
Next, let's add the ability to change a tile's color. This will come in handy later when we visualize the search algorithm. Update the Tile class by adding a SetColor method:
public class Tile : MonoBehaviour { ... private Renderer rend; public void Awake() { ... rend = GetComponent<Renderer>(); } public void SetColor(Color color) { rend.material.SetColor("_Color", color); } }
Let's test this out by changing the color of a tile. In the GridCreator class, add the following (temporary - we'll remove this again since it's just for testing purposes) code after calling the AddNeighbours() method:
foreach (Tile neighbor in tiles[4, 5].GetNeighbors()) { neighbor.SetColor(Color.green); }
Feel free to chose any other tile. If we now run the program, you should get the following result:
Once we confirmed that our neighbour code works, remove the above for loop again since we don't want to keep colorizing those tiles.
In the next chapter, we will start implementing the search algorithm.
Awesome post! Keep up the great work! 🙂
work. If you’re evsn remotely interested, feel free to shoot me an e-mail.
Hello! I simply want to offer you a huge thumbs up for your great info you have
got right here on this post. I'll be coming back to
your website for more soon.
I was suggested this website by my cousin. I'm not sure whether this post is written by him as nobody else know
such detailed about my problem. You are amazing! Thanks!
Heу woսld you mind stating which bloɡ platform you're working with?
I'm ⅼooking to start my own bⅼog ѕoon but I'm having a difficult time
ɗeⅽiding between BlogEngine/Wordpгess/B2evolution and Ɗrupal.
Thе reason I ask iѕ becаuse your layout seems ⅾifferent then most blogs and I'm looking for something cоmpletely unique.
P.S My apologies for beÑ–ng off-topic but I had to ask!
Hi bellyache,
It's wordpress using http://mtomas.com/1/tiny-forge-free-mobile-first-wordpress-theme
lynxcoding