public Habitacion(int iX, int iY, TipoCasilla iTipo) //Constructor { X = iX; Y = iY; Tipo = iTipo; Puerta_Aba = Puerta_Arr = Puerta_Izq = Puerta_Der = false; //Todas inician cerradas }
public CasillaGrid(CasillaGrid casilla) { posicion = casilla.getPosicion(); coordenadas = casilla.getPosicionGrid(); adyacentes = casilla.getAdyacentes(); tipo = casilla.getTipoCasilla(); }
// actualiza el grafo tras haber clickado sobre una casilla (cambia aristas de alrededor, etc) public void updateGraph(TipoCasilla prevType, double prevValue, int r, int c) { Vector2[] directions = { new Vector2(0, 1), new Vector2(1, 0), new Vector2(0, -1), new Vector2(-1, 0) }; foreach (Vector2 v in directions) { int ni = r + (int)v.y; int nj = c + (int)v.x; if (ni >= 0 && ni < rows && nj >= 0 && nj < columns) { if (puzzle.GetType(r, c) == (int)TipoCasilla.Rocas) { graph.deleteEdge(new DirectedEdge((int)(c + r * columns), (int)(nj + ni * columns), values[puzzle.GetType(ni, nj)])); graph.deleteEdge(new DirectedEdge((int)(nj + ni * columns), (int)(c + r * columns), prevValue)); } else if (prevType != TipoCasilla.Rocas) { graph.modifyEdge(new DirectedEdge((int)(nj + ni * columns), (int)(c + r * columns), values[puzzle.GetType(r, c)])); } else if (puzzle.GetType(ni, nj) != (int)TipoCasilla.Rocas) { graph.AddEdge(new DirectedEdge((int)(c + r * columns), (int)(nj + ni * columns), values[puzzle.GetType(ni, nj)])); graph.AddEdge(new DirectedEdge((int)(nj + ni * columns), (int)(c + r * columns), values[puzzle.GetType(r, c)])); } } } }
// Notifica el intento de movimiento al tablero de bloques (si lo hay), cuando se recibe un clic completo de ratón (apretar y soltar) // Podría reaccionarse con un sonido si el intento falla, aunque ahora no se hace nada // La he puesto pública para que se puedan simular pulsaciones sobre un bloque desde el gestor public bool OnMouseUpAsButton() { if (board.getManager().getTank().ready()) { if (board.getManager().getTank().isClicked()) { //IA //aestrella?????????? //board.getManager ().getTank ().setCurrent(this.position); board.getManager().AESTRELLA(this.position); Debug.Log("IA TIME"); return(true); } else if (this.position != board.getManager().getTank().getCurrent()) { //Cambio de tipo if (this.type != TipoCasilla.F) { if (this.type == TipoCasilla.R) { this.type = TipoCasilla.L; } else { this.type++; } board.getManager().changeMatrix(this.position, (uint)type); } changeColor(); changeText(); return(false); } } return(false); /*if (board == null) throw new InvalidOperationException("This object has not been initialized"); * * Debug.Log("Trying to move " + ToString() + "..."); * if (board.CanMove(this)) { * * board.UserInteraction(); // Aviso de que lo he tocado para que se pongan los contadores a cero (por si contenían algo) * MovableBlock block = board.Move(this, BlockBoard.USER_DELAY); * Debug.Log(ToString() + " was moved."); * * return true; * } * * Debug.Log(ToString() + " cannot be moved."); * return false;*/ }
public Position position; // posicion logica dentro de la matriz logica de puzzle public void Initialize(Tablero tablero, uint type) { if (tablero == null) { throw new ArgumentNullException(nameof(tablero)); } this.tablero = tablero; this.type = (TipoCasilla)type; this.initialType = this.type; this.value = GameManager.instance.values[type]; this.initialValue = this.value; UpdateColor(); }
// al ser pulsado cambia al siguiente tipo (al llegar al ultimo da la vuelta) public bool OnMouseUpAsButton() { if (tablero == null) { throw new InvalidOperationException("This object has not been initialized"); } // si el tanque no esta ya en movimiento if (!GameManager.instance.isTankMoving()) { // si el tanque esta seleccionado, empezamos a moverlo (esta casilla sera el destino) if (GameManager.instance.isTankSelected()) { if (this.type != TipoCasilla.Rocas) { GameManager.instance.resolveGame((int)this.position.GetRow(), (int)this.position.GetColumn()); } else { StartCoroutine(GameManager.instance.changeCanMove(2.0f)); } } // si no, esta casilla cambiara al tipo correspondiente else { double prevValue = this.value; TipoCasilla prevType = this.type; if ((uint)this.type + 1 > 3) { this.type = (TipoCasilla)0; } else { this.type++; } this.value = GameManager.instance.values[(uint)this.type]; UpdateColor(); GameManager.instance.updatePuzzle(this.type, (int)this.position.GetRow(), (int)this.position.GetColumn()); GameManager.instance.updateGraph(prevType, prevValue, (int)this.position.GetRow(), (int)this.position.GetColumn()); } } return(false); }
/// <summary> /// Lo que hace este metodo es que cuando movemos la serpiente hacia alguna dirección el último elemento de la cola /// lo trasladamos a la cabeza haciendo el efecto de que se va moviendo de posicion en posicion /// </summary> /// <returns></returns> private IEnumerator Movimiento() { WaitForSeconds espera = new WaitForSeconds(0.15f); while (true) { Vector3 nuevaPosicion = cabeza.transform.position + direccion; // la nueva posicion del bloque siguiente será TipoCasilla casillaAOcupar = ObtenerMapa(nuevaPosicion); if (casillaAOcupar == TipoCasilla.Obstaculo) //si la casilla siguiente es un obstaculo { Muerte(); yield return(new WaitForSeconds(5)); //espera 5 segundos SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); //recarga la escena yield break; //sal de la corrutina } else { GameObject parteCuerpo = new GameObject(); if (casillaAOcupar == TipoCasilla.Item) { parteCuerpo = NuevoBloque(nuevaPosicion.x, nuevaPosicion.y); MoverItemAPosicionAleatoria(); IncrementarPuntos(); } else { parteCuerpo = cuerpo.Dequeue(); //sacara la primera de la cola EstablecerMapa(parteCuerpo.transform.position, TipoCasilla.Vacio); //antes de moverlo está vacío parteCuerpo.transform.position = nuevaPosicion; // a su posicion le pondrá la siguiente posicion que le corresponde EstablecerMapa(parteCuerpo.transform.position, TipoCasilla.Obstaculo); //después de moverlo ya lo hemos rellenado cuerpo.Enqueue(parteCuerpo); //lo encolamos el siguiente cacho } cabeza = parteCuerpo; //ahora la cabeza será esa pieza yield return(espera); } } }
//Esto es una corrutina private IEnumerator Movimiento() { //Definimos una vartiable local WaitForSeconds espera = new WaitForSeconds(0.15f); while (true) { //calculamos la nueva posicion del objeto donde esta la cola Vector3 nuevaPosicion = cabeza.transform.position + direccion; //esta variable tipocasilla revisa si esta vacia o con obstaculo TipoCasilla casillaAOcupar = ObtenerMapa(nuevaPosicion); if (casillaAOcupar == TipoCasilla.Obstaculo) { Debug.Log("Muerto!"); yield return(new WaitForSeconds(5)); SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); yield break; } else { /*obtenemos el último elemento o el que más tiempo lleva en la * lista de los que componen el cuerpo*/ GameObject parteCuerpo = cuerpo.Dequeue(); //establecemos la posición antes de moverse EstablecerMapa(parteCuerpo.transform.position, TipoCasilla.Vacio); parteCuerpo.transform.position = nuevaPosicion; //aquí ponemos pared ya con el obstaculo al haberse movido EstablecerMapa(nuevaPosicion, TipoCasilla.Obstaculo); cuerpo.Enqueue(parteCuerpo); cabeza = parteCuerpo; yield return(espera); } } }
// Inicializa con el tablero de bloques y el texto (siempre que haya hijo con componente TextMesh), sólo si todavía no tiene puesto ningún tablero de bloques // El tablero de bloques recibido no puede ser nulo, pero el texto sí (representa un bloque no visible) public void Initialize(BlockBoard board, uint value) { if (board == null) { throw new ArgumentNullException(nameof(board)); } this.board = board; this.gameObject.SetActive(value != null); // Se pondrá activo o no según el texto (esto lo hacemos para reactivar bloques que hubieran sido agujeros antes (en un reinicio) type = (TipoCasilla)value; if (value == 5) { print("HOLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); } valor = valores [value]; changeText(); changeColor(); //Debug.Log(ToString() + " initialized."); }
} //Tipo de casila public void Dibujar(TipoCasilla iTipo) //Se sobrecargó para hacer más legible el programa... { Tipo = iTipo; Dibujar(true); }
private void cmbTipo_SelectedIndexChanged(object sender, EventArgs e) { UltimoTipo = Casilla.Tipo = (TipoCasilla)cmbTipo.SelectedItem; }
private void EstablecerMapa(Vector3 posicion, TipoCasilla valor) { mapa[Mathf.RoundToInt(posicion.x), Mathf.RoundToInt(posicion.y)] = valor; }
// establece su valor, tipo y color a los iniciales public void Reset() { GameManager.instance.updateGraph(this.type, this.value, (int)this.position.GetRow(), (int)this.position.GetColumn()); this.value = this.initialValue; this.type = this.initialType; UpdateColor(); }
public void setTipoCasilla(TipoCasilla tipoCasilla) { tipo = tipoCasilla; }
// actualiza la matriz logica public void updatePuzzle(TipoCasilla type, int r, int c) { puzzle.SetType(r, c, (uint)type); }