// se crea el grafo a partir de la matriz logica private void CreateGraph() { graph = new EdgeWeightedDigraph((int)(rows * columns)); // adyacencias de cada casilla (derecha, abajo, izquierda, arriba) Vector2[] directions = { new Vector2(0, 1), new Vector2(1, 0), new Vector2(0, -1), new Vector2(-1, 0) }; // si la casilla no es de tipo Roca, le establecemos union // con todas sus adyacentes que tampoco sean de tipo Roca for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { if (puzzle.GetType(i, j) != (int)TipoCasilla.Rocas) { foreach (Vector2 v in directions) { int ni = i + (int)v.y; int nj = j + (int)v.x; if (ni >= 0 && ni < rows && nj >= 0 && nj < columns) { if (puzzle.GetType(ni, nj) != (int)TipoCasilla.Rocas) { DirectedEdge a = new DirectedEdge((int)(j + columns * i), (int)(nj + columns * ni), values[puzzle.GetType(ni, nj)]); graph.AddEdge(a); } } } } } } }
// genera las casillas del tipo que le indique puzzle (matriz logica de tipos) private void GenerateCasillas(TankPuzzle puzzle) { if (puzzle == null) { throw new ArgumentNullException(nameof(puzzle)); } var rows = casillas.GetLength(0); var columns = casillas.GetLength(1); bool tankInitialized = false; for (int r = 0; r < rows; r++) { for (int c = 0; c < columns; c++) { Casilla casilla = casillas[r, c]; if (casilla == null) { casilla = Instantiate(casillaPrefab, new Vector3(-((casillas.GetLength(1) / 2.0f) * POSITION_FACTOR_C - (POSITION_FACTOR_C / 2.0f)) + c * POSITION_FACTOR_C, 0, (casillas.GetLength(0) / 2.0f) * POSITION_FACTOR_R - (POSITION_FACTOR_R / 2.0f) - r * POSITION_FACTOR_R), Quaternion.identity); casillas[r, c] = casilla; } casilla.position = new Position((uint)r, (uint)c); casilla.Initialize(this, (uint)puzzle.GetType(r, c)); if (!tankInitialized && puzzle.GetType(r, c) == 0) { GameManager.instance.setTankPosition(casilla.transform.position); puzzle.InitialTankPosition = casilla.position; puzzle.TankPosition = puzzle.InitialTankPosition; tankInitialized = true; } } } }