diff --git a/package-lock.json b/package-lock.json index 91c5266..660b2e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "pilas-bloques-exercises", - "version": "1.4.13", + "version": "1.4.15", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index def6abc..528ebc4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pilas-bloques-exercises", - "version": "1.4.13", + "version": "1.4.15", "description": "Exercises for Pilas Bloques", "homepage": "http://pilasbloques.program.ar", "author": { diff --git a/src/actores/segundoCiclo/Capy/Tacho.ts b/src/actores/segundoCiclo/Capy/Tacho.ts index b7b057b..7cb3d38 100644 --- a/src/actores/segundoCiclo/Capy/Tacho.ts +++ b/src/actores/segundoCiclo/Capy/Tacho.ts @@ -1,15 +1,30 @@ /// class Tacho extends ActorAnimado { + lleno; static _grilla = 'actor.tacho.png' constructor(lleno = false) { super(0, 0, {cantColumnas: 2}); this.definirAnimacion("vacio", [0], 1); this.definirAnimacion("lleno", [1], 1); - + this.lleno = lleno; if(lleno) this.cargarAnimacion("lleno") else this.cargarAnimacion("vacio") } + + vaciar() { + this.cargarAnimacion("vacio") + this.lleno = false; + } + + llenar() { + this.cargarAnimacion("lleno") + this.lleno = true; + } + + estaLleno(): boolean { + return this.lleno; + } } diff --git a/src/escenas/ReciclandoPapeles.ts b/src/escenas/ReciclandoPapeles.ts new file mode 100644 index 0000000..9f27c37 --- /dev/null +++ b/src/escenas/ReciclandoPapeles.ts @@ -0,0 +1,86 @@ +/// +/// +/// +/// +/// + +class ReciclandoPapeles extends EscenaActividad { + cuadricula : CuadriculaMultiple; + definidor: DefinidorColumnasFijo; + automata; + tachos; + papeles; + + iniciar() { + this.fondo = new Fondo('fondo.capy.png',0,0); + this.definidor = new DefinidorColumnasFijo(5,[5,6,8,4,7]); + this.cuadricula = new CuadriculaMultiple( + this.definidor, + 0,0, + {separacionEntreCasillas: 5}, + {grilla:'casilla.futbolRobots2.png', + cantFilas: 5, + cantColumnas: 16, + alto:45,ancho:45} + ); + this.cuadricula.cambiarImagenInicio('casillainiciomono.png'); + + var capy = new Capy() + capy.escala *= 0.5; + this.automata = new ActorCompuesto(0, 0, { subactores: [capy] }); + this.cuadricula.agregarActor(this.automata, 0, 0); + this.automata.escala *= 0.3; + this.automata.y += 40; + + this.papeles=[] + this.tachos=[] + + this.cuadricula.forEachFila((nroFila: number) => this.agregarTacho(nroFila)) + this.cuadricula.forEachFila((nroFila: number) => this.agregarPapel(nroFila)) + + } + + agregarPapel(fila: number) { + var elPapel = new Papel() + this.cuadricula.agregarActor(elPapel, fila, 0) + elPapel.aprender(Flotar, { Desvio: 2 }); + this.papeles.push( new ActorCompuesto(0, 0, { subactores: [elPapel] })); + } + + agregarTacho(fila: number) { + var elTacho = new Tacho() + this.cuadricula.agregarActor(elTacho, fila, this.definidor.tamanos[fila]-1) + this.tachos.push( new ActorCompuesto(0, 0, { subactores: [elTacho] })); + this.tachos.escala *= 0.8; + } + + estaResueltoElProblema(){ + return this.hayTachosLlenosAlFinalDeLasFilas() && this.cuadricula.cantFilas === this.cantidadDeTachosLlenos() && !this.hayPapelesSinLevantar(); + } + + hayTachosLlenosAlFinalDeLasFilas(){ + return this.tachos.every( tacho => tacho.subactores[0].estaLleno() ); + } + + hayPapelesSinLevantar(): boolean { + return this.papeles.every( papel => papel.subactores[0].vivo ); + } + + cantidadDeTachosLlenos(): number { + var cant: number = 0; + this.tachos.forEach( tacho => cant += tacho.subactores[0].estaLleno() ); + return cant; + } + + ultimasCasillas(){ + return this.cuadricula.filterCasillas(casilla => casilla.esFin()); + } + + actualizar(): void { + super.actualizar(); + if( !this.tachos[this.automata.casillaActual().nroFila].subactores[0].estaLleno() && + this.automata.tieneAlgoEnLaMano() && + this.automata.casillaActual() === this.tachos[this.automata.casillaActual().nroFila].subactores[0].casillaActual() ) + this.tachos[this.automata.casillaActual().nroFila].subactores[0].llenar(); + } +} diff --git a/src/escenas/libroPrimaria/EscenaDesdeMapa.ts b/src/escenas/libroPrimaria/EscenaDesdeMapa.ts index 4cfaf36..afcfaad 100644 --- a/src/escenas/libroPrimaria/EscenaDesdeMapa.ts +++ b/src/escenas/libroPrimaria/EscenaDesdeMapa.ts @@ -139,7 +139,9 @@ abstract class EscenaDesdeMapa extends EscenaActividad { let nroColumna: number = casilla.nroColumna; let ids: string[] = mapa[nroFila][nroColumna].split("&"); ids.forEach(id => { - if (id != '' && id != ' ' && id != '-' && id != '_') { // si no es casilla libre + if(id === '+'){ + this.guardarPosicionFinal([nroColumna, nroFila]) + }else if (id != '' && id != ' ' && id != '-' && id != '_') { // si no es casilla libre let actor = this.mapearIdentificadorAActor(id, nroFila, nroColumna); cuadricula.agregarActorEnCasilla(actor, casilla, true); } @@ -497,6 +499,12 @@ class GeneradorDeCasillaNula implements GeneradorDeCasilla { esAleatorioPara(generador: GeneradorDeMapasAleatorios): boolean { return false; } } +/** Corresponde a las casillas indicadas con `+`. */ +class GeneradorDeCasillaFinal implements GeneradorDeCasilla { + generarSemillaDeCasilla(generador: GeneradorDeMapasAleatorios): SemillaDeCasilla { return new SemillaDeCasilla('+'); } + esAleatorioPara(generador: GeneradorDeMapasAleatorios): boolean { return false; } +} + /** Corresponde al modificador `?` (recursivo). */ class GeneradorDeCasillaMaybe implements GeneradorDeCasilla { constructor(private generadorInterno: GeneradorDeCasilla, private proba?: number) { } diff --git a/src/gramaticaAleatoria.ne b/src/gramaticaAleatoria.ne index 603d034..59b5429 100644 --- a/src/gramaticaAleatoria.ne +++ b/src/gramaticaAleatoria.ne @@ -44,7 +44,8 @@ Atom -> Id {% d => new GeneradorDeCasillaSimple(d[0]) %} | Col {% id %} | Nil {% id %} | Void {% id %} - | "(" _ Term _ ")" {% d => d[2] %} + | End {% id %} + | "(" _ Term _ ")" {% d => d[2] %} Id -> [a-zA-Z0-9]:+ {% d => d[0].join("") %} Bag -> "$" {% d => new GeneradorDeCasillaBolsa() %} | "$" _ Id {% d => new GeneradorDeCasillaBolsa(d[2]) %} @@ -56,4 +57,6 @@ Macro -> "#" _ Id {% d => new GeneradorDeCasillaMacro(d[2]) %} And -> Atom _ "&" _ Atom {% d => new GeneradorDeCasillaAnd(d[0], d[4]) %} +End -> "+" {% d => new GeneradorDeCasillaFinal() %} + Void -> "_" {% d => new GeneradorDeCasillaNula() %} \ No newline at end of file