Resumenes Objetos 2c2011

Reentrega TP integrador

publicado a la‎(s)‎ 2 nov. 2011 8:00 por gisela decuzzi   [ actualizado el 4 nov. 2011 9:10 ]

La gente que no hizo la entrega en fecha el 26-27 de Octubre del tp, como ya resolvimos el tp en clase como tp tienen que entregar resuelto el enunciado Mundo Epico.
Recuerden que toda entrega de tp integrador OBLIGATORIAMENTE consta de:
  • fileOut de Pharo con el código del tp
  • el workspace con el que probaron: TODOS los puntos y los casos posibles con el set de pruebas que hicieron
  • el diagrama de clases.
La gente que entregó el tp y se los devolvieron con debe reentregar, tienen que corregir lo que se le marcó y reentregar. La reentrega consta de:
  • Primera entrega hecha y corregida
  • Segunda entrega con:
    • fileOut
    • workspace
    • diagrama de clases

Enunciado TP Integrador

publicado a la‎(s)‎ 15 oct. 2011 17:41 por gisela decuzzi   [ actualizado el 15 oct. 2011 17:41 ]

La familia

El dominio

Se sabe que hay locales en varias zonas de Buenos Aires (por ejemplo: Retiro, Almagro, Palermo Sensible, Parque Avellaneda, etc) controladas por diferentes familias poderosas pertenecientes a la mafia, que manejan sus negocios y se rigen por estrictas normas de honor.

El honor lo vamos a manejar por unidades a las que vamos a llamar "puntos de honor", que vamos a describir más adelante.

 

El negocio de cada familia consiste en conrolar locales, entre los que vamos a considerar

Talleres clandestinos                    Restaurantes               Casinos

Cada local es controlado por una sola familia, y además sabemos en qué zona está.

 

Vamos a considerar que cada integrante está en todo momento en un local perteneciente a su familia.

 

No es ninguna noticia que las familias son muy ambiciosas. Las familias se atacan entre sí para conquistar alguna propiedad ajena, eliminando a su competencia con el objetivo de obtener más poder. A los integrantes de cada familia que pueden participar en los ataques se los considera integrantes activos, y los otros son los que se quedan cuidando el local en donde están. Para cada integrante se indica si es activo o no.

 

Los integrantes llevan encima sus instrumentos de trabajo a.k.a. armas. Dentro del arsenal que pueden manejar, vamos a considerar

  • Cuchillos: otorgan a quien lo posee una cantidad de puntos de honor que se establece para cada cuchillo; tienen una potencia destructiva de 1.
  • Ametralladoras: otorgan a quien la posee una cantidad de puntos de honor que es igual para todas las ametralladoras; tienen una potencia destructiva que se establece para cada ametralladora.
  • Bombas: no otorgan puntos de honor, y tienen 1000 de potencia destructiva.

Un arma se considera heavy si tiene más de 200 de potencia destructiva, u otorga más de 10 puntos de honor.

 

El honor se maneja así:

  • El honor de un integrante es la suma de los puntos de honor que le otorgan sus armas más una cantidad de puntos de honor básicos que son de él.
  • El honor de una familia es: una reserva de puntos de honor que es patrimonio común de la familia, más 20 puntos por cada integrante capo, más 10 puntos por cada local ocupado por la familia.

Un integrante es capo si tiene más de 100 puntos de honor y tiene al menos un arma heavy.

 

A la hora de conquistar un local perteneciente a otra familia, las familias pueden decidir enviar a un grupo de sus integrantes a atacar un local perteneciente a una zona determinada, con el fin de apropiarse de dicho lugar.

También pueden ir por la vía rápida, atacar toda una zona y quedarse con ella (es decir, con todos los locales que la comprenden).

En todos los casos, los atacantes son todos los integrantes activos de la familia que ataca; los atacantes capos son los integrantes activos que son capos.

 

Los ataques no siempre son exitosos, por varios factores.

Cada tipo de local tiene sus condiciones particulares para que un ataque contra él sea exitoso:

  • Restaurante: que los atacantes sean  más de 5, por lo menos 3 tengan armas heavies y el local este vacío de clientes (no se pide modelar a los clientes, sólo importa cuántos hay en el local en el momento del ataque).
  • Taller Clandestino: que haya más atacantes capos que defensores del local en total, y además haya un atacante capo con más puntos de honor que todos los defensores.
  • Casino: nunca conviene atacarlos.

Para realizar un ataque exitoso a una zona, esta debe estar completamente tomada por una sola familia (o sea, todos los locales tienen que estar ocupados por gente de la misma familia).

Además, es necesario que el grupo atacante tenga al menos el doble de integrantes que los ubicados en toda la zona (en todos los locales de la zona, sean activos o no).

 

Si el ataque a un local o zona es exitoso, todos los defensores mueren, y un atacante activo cualquiera pasa a cada local conquistado; además el local, o todos los locales de la zona, pasa/n a la familia victoriosa.

Si un ataque (ya sea a un local o a una zona) no es exitoso, para cada integrante activo de la familia atacante sucede que: si tiene menos de 200 puntos de honor muere, si no pierde todas sus armas.

 

Se pide:

Antes que nada


1.        Obtener para una familia

a.         El conjunto de integrantes activos, y el de los integrantes activos capos.

b.         El conjunto de armas heavies.

c.         Las zonas en las que tiene presencia, i.e. ocupa al menos un local.

 

2.        Obtener la familia más honorable (con más puntos de honor) entre las que tienen presencia en una determinada zona.

 

3.        Ataques a locales

a.         Lograr que las familias entiendan el mensaje perdistePorMasacre: unLocal, que libera el local y mata (o sea, simplemente saca de todos lados) a los integrantes de la familia que están en el mismo.

b.         Realizar el ataque de un local con las consecuencias indicadas más arriba, tanto si el ataque es exitoso como si no.

 

4.        Realizar el ataque a una zona con las consecuencias indicadas más arriba, tanto si el ataque es exitoso como si no.

 

5.        Más estadísticas

a.         Saber para una familia, dado un conjunto de zonas, qué le conviene atacar en esas zonas; o sea:

¿Está bien que la respuesta tenga locales y zonas mezclados? Sí.

¿Esta bien que me incluya en la respuesta una zona y también locales de esa zona? Si.

b.         Saber si dos familias están en conflicto, i.e. si ocupan locales en exactamente las mismas zonas (i.e. tienen que coincidir todas las de una familia con todas las de la otra).

Clase 7 - Métodos y variables de clase

publicado a la‎(s)‎ 15 oct. 2011 17:39 por gisela decuzzi   [ actualizado el 15 nov. 2011 8:08 ]

Clase 6 - Herencia

publicado a la‎(s)‎ 15 oct. 2011 17:38 por gisela decuzzi   [ actualizado el 15 nov. 2011 8:09 ]

Resumen

 - Herencia como forma de compartir codigo entre instancias de distintas clases.
 - Clase como clasificación de conceptos
 - Abstracciones ricas: Tiene sentido subclasificar cuando tiene una relación conceptual y cuando hay comportamiento diferente y en común.
 - Concepto de clase abstracta
 - Relacion entre herencia y polimorfismo
 - super: es una referencia al mismo objeto que self.  Cambia el method lookup para empezar desde la clase inmediatamente superior a donde está escrito el método.
 - Method lookup V. 3.47

¿Qué tengo que leer para saber más de herencia, repasar, ser un groso, sacarme un 10 en objetos o levantarme minitas?

Para todo, menos para levantar minitas, pueden leer aca:

- Objetos en general: http://uqbar.no-ip.org/uqbarWiki/index.php/Paradigma_de_Objetos
- Herencia: http://uqbar.no-ip.org/uqbarWiki/index.php/Herencia
- Method Lookup: http://uqbar.no-ip.org/uqbarWiki/index.php/Paradigma_de_objetos_-_method_lookup
- Redefinición: http://uqbar.no-ip.org/uqbarWiki/index.php/Redefinici%C3%B3n
- super: http://uqbar.no-ip.org/uqbarWiki/index.php/Super
- Como crear subclases en Squeak/Pharo: http://uqbar.no-ip.org/uqbarWiki/index.php/C%C3%B3mo_crear_una_subclase_en_Squeak

Clase 5 - Responsabilidad y Delegación

publicado a la‎(s)‎ 14 sept. 2011 11:54 por gisela decuzzi   [ actualizado el 15 sept. 2011 10:41 por Mariana Matos ]

Repaso

Para repasar un poco y empezar con el tema usamos el enunciado de Micros, particularmente la parte de:
  • Hacer que una persona suba al micro
  • Saber si una persona quiere subir al micro
  • Saber si un micro puede subir a una persona
  • Subir a alguien si se puede
Llegamos a algo como:

Micro>>subirSiPodesA: persona
    (self puedeSubirA: persona)
        ifTrue: [self subirA: persona].
Micro>>puedeSubirA: persona
    ^self tieneLugar and: [persona quiereSubirA: self].
Micro>>subirA: persona
    self esElPrimero ifTrue: [primerPasajero := persona].
    pasajeros := pasajeros + 1.

Rebelión en la granja:

[Versión Miércoles]
Vaca

  • Cuando come aumenta el peso en lo que comió / 2 y le da sed.
  • Cuando bebe se le va la sed y pierde 500 g de peso.
  • Conviene vacunarla una vez, o sea, si no se la vacunó conviene vacunarla, y si ya se la vacunó no conviene volverla a vacunar.
  • Tiene hambre si pesa menos de 200 kg.
Cerdo
  • Cuando come aumenta el peso en lo que comió – 200 g (si come menos de 200 g no aumenta nada); si come más de 1 kg se le va el hambre, si no no.
  • Siempre conviene vacunarlo.
  • Cuando bebe se le va la sed, y le da hambre.
  • Si come más de tres veces sin beber le da sed.
Dispositivos
Comederos
  • cada comedero da de comer una cantidad fija que varía para cada comedero, puede atender a los animales con hambre que pesen menos de lo que soporta el comedero, que también es un valor que depende del comedero.
  • Un comedero normal necesita recarga si le quedan menos de 10 raciones, cuando se lo recarga se le cargan 30 raciones.
Bebederos
  • Dan de beber a un animal, pueden atender a los animales con sed.
  • Un bebedero necesita recarga cada 20 animales que atiende, lo que se le hace al recargarlo no se registra en el sistema (sí que se lo recarga para volver a contar desde ahí 20 animales atendidos).
Vacunatorios
  •  vacunan a un animal,
  • pueden atender a los animales que conviene vacunar y no fueron vacunados por él
  • Un vacunatorio necesita recarga si se queda sin vacunas, al atenderlo se le recargan 50 vacunas.
Estación de atención
  • Una estación de atención tiene muchos dispositivos y atiende animales. Atender a un animal para una estacion es hacerlo pasar por cada uno de sus dispositivos, ademas las estaciones se acuerdan de los animales que atendio y nos saben decir distintas cosas (ver parte C).
Se pide:
Parte A)
  1. hacer que un animal coma
  2. saber si un animal tiene hambre
  3. saber si un animal tiene sed
  4. hacer que un animal beba
Parte B)
  1. saber si un dispositivo puede atender a un animal
  2. saber si un dispositivo necesita recarga
  3. recargar un dispositivo
  4. hacer que un dispositivo atienda a un animal
  5. poder decirle a un dispositivo que atienda a un animal solo si puede.
Parte C)
  1. Saber si un animal puede ser atendido en una estación. Esto pasa cuando alguno de sus dispositivos puede atender al animal.
  2. Atender a un animal. Esto es hacerlo pasar por los dispositivos que lo pueden atender.
  3. Recargar los dispositivos que necesiten recarga.
  4. Poder saber para una estación:
    1. Si un animal fue atendido
    2. Cuantos animales fueron atendidos
    3. De los animales atendidos poder saber los que conviene vacunar
    4. La suma del peso de todos los animales atendidos
    5. El animal atendido mas pesado.
  5. Dadas dos estaciones poder saber que animales fueron atendidos en ambas.

[Versión Jueves]
Dominio limitado a comederos y bebederos con cerdos, vacas y gallinas (que siempre pesan 4 kilos, siempre tienen hambre y sed).
  1. Saber si un animal puede ser atendido por un dispositivo.
  2. Conocer el conjunto de dispositivos que pueden atender a un animal en un centro de atención
  3. Que un animal sea atendido por un dispositivo.
  4. Para los cerdos, cuánto comió la última vez que comió?
  5. Para los cerdos, cuánto fue el máximo que comió?
  6. Conocer todos los animales que se atendieron en todos los dispositivos de un centro de atención, sin repetidos

Cosas para seguir leyendo




Clase 4 - Clases

publicado a la‎(s)‎ 7 sept. 2011 12:25 por gisela decuzzi

La clase la dividimos en:

Repaso

    • Escribimos de nuevo los métodos de pepita con ciudades
    • Hablamos de clonación
    • Hablamos de método look up
    • Importante acordarse que (con lo que vimos hasta acá)
      • ¿Donde están los metodos? -> en el objeto (o en su prototipo)
      • ¿Donde están las variables? -> son del objeto (las puede tener porque se las agregue a él o porque vinieron definidas por su padre)
      • ¿Quién es self? -> el objeto que recibió el mensaje
      • ¿Cómo obtengo un objeto muy similar a otro -> clono
Después de la clase iban a cambiar varias de las respuestas a las preguntas. Esto era lo que veníamos haciendo usando un esquema prototipado, existen otros y a partir de hoy en paradigmas vamos a usar otro esquema un poquito distinto: clases

Clase

    • La clase es un objeto igual a los que veníamos viendo
      • una clase modela un concepto, es algo muy abstracto la clase Golondrina define lo que es ser una golondrina, es algo mas abstracto que antes que teniamos a peptia
      • el mensaje por excelencia que le vamos a mandar es new para obtener una instancia (recordar que todos nuestros objetos van a ser instancia de una clase)
    • Podemos ver a una clase como un molde de objetos
    • Hablamos del nuevo metodo look up
      • ¿Donde estan los métodos? -> en la clase de la que es instancia mi objeto
      • ¿Donde estan las variables? -> están en el objeto (las defino en la clase)
      • ¿Quién es self? -> el objeto que recibio el mensaje
      • ¿Como obtengo un objeto con el mismo comportamiento que otro? -> <nombre de la clase> new
      • ¿Puedo redefinir como hice con prototipos? -> por ahora no, en las próximas clases veremos

Especialmente para los miércoles:
Vimos de nuevo el tema de con qué objetos podes hablar en la definicion de un método y por qué este método está mal:
Golonodrina>>initialize
lugar  := bsAs.
Entonces... repasemos las 3 leyes de la objetomática que mando Guille por mail

Primera ley)  Un objeto solo interactuará con otros objetos a través de mensajes.
Segunda ley) Un objeto solo debe hablar con objetos que conozca a través de sus variables, parámetros u objetos literales.
Tercera ley)   Un objeto no le pedirá cosas a otros objetos para él trabajar con eso, le delegará el trabajo a su objeto conocido.



Para seguir practicando

  • En clase empezamos con el ejercicio del comedero (Ejercicio 3 de la guía dos de objetos) pueden terminarlo y hacer su continuacion que está en el ejercicio 2 de la guía 3
  • Pueden hacer los ejercicios de las guías 1, 2 y 3 de objetos que están e la página.

Clase 3 - Bloques y Colecciones

publicado a la‎(s)‎ 1 sept. 2011 16:45 por gisela decuzzi   [ actualizado el 1 sept. 2011 18:07 ]

Esta clase vimos con mucho mas detalle Colecciones y Bloques (ademas de repasar lo que ya habiamos visto).
Empezamos hablando de los bloques. Hicimos mucho MUCHO hincapié que un bloque es algo que ya conociamos: un objeto que entiende mensajes. Particularmente recalcamos que el bloque representa código y por lo general lo que vamos a querer hacer con el código es evaluarlo y esto se logra a traves del mensaje value.

Hablamos sobre la ventaja y el uso de los bloques por parte de los objetos booleanos y por qué escribir
pepita energia < 50 ifTrue: (pepita come: 100)

No se comporta como querríamos, ya que lo que buscamos es que solamente coma si su energia es < 50, por lo que digimos que queríamos diferir la evaluación de ese código (pepita come: 100)  y que para lograr esto contamos con los objetos bloques.

Para que quede claro hablamos de los objetos booleanos true y false e hicimos una posible implementación para ifTrue: llegamos a qué:
true>>ifTrue: bloque
    bloque value.
false>>ifTrue: bloque
    "no hacemos nada"
Después dijimos que en Pharo es muy similar la implementación solo que lo implementa devolviendo algo (pero que no hacía al caso del tema de los bloques).

NOTA: Así como los números ya vienen, los booleanos también y los podemos usar libremente por todo nuestro Pharo. Eso incluyue al Object Browser por lo que no es necesario definirlos ni escribir los métodos que usamos en el pizarrón.

Como comentario al margen hablamos de que no es lo mismo devolver (retornar) que mostrar. Digimos que mostrar es exponer algo al mundo mientras que retornar es algo interno a nuestro programa.

Hablamos de bloques con parámetros e implementamos nuestro bloque que espera tres parámetros y da una solución para la raíz de un polinomio cuadrático. Nos quedó algo asi: [:a :b :c | (b negated + ((b raisedTo: 2)+ (4*a*c)) sqrt)/(2*a)]
Para evaluarlo dijimos que necesitabamos un mensaje con 3 parámetros y dijimos que los bloques entienden el mensaje value:value:value:
Por ejemplos si queremos que se evalúe de forma que a valga 2 b 3 y c 4 teniamos que evaluar:
[:a :b :c | (b negated + ((b raisedTo: 2)+ (4*a*c)) sqrt)/(2*a)] value: 2 value: 3 value: 4.

Como verán el código que está dentro del loque no es lo mas sencillo y está lleno de paréntesis para los que no estan muy cancheros con cuestiones del lenguaje y su presedencia acá tienen un apunte cortito y muy muy interesante (con muchos ejemplos).

Seguimos avanzando para entrar en el tema de colecciones, quisimos que pepita se fuera de viaje y como buena golondrina (?) se llevaba su equipaje.
Empezamos diciendo que pepita se llevaba unas zapatillas nike, una cartera luisBoton y una guitarra gibson. Ahora como pepita no es una golondrina muy acaudalada se toma de esos viajes baratos pero que NO permiten pasarse en el peso... asi que queríamos saber el peso de la valija de pepita, pasamos por varias versiones y nos dimos cuenta que no sabiamos cuantos items se iba a llevar pepita en cada momento, ni queriamos tener que modificar código cada vez que pepita se lleve un nuevo elemento en su valija.
Llegamos a la conclusión que lo que queríamos era modelar un conjunto, y como estamos en el paradigma orientado a objetos dijimos que necesitabamos un objeto que modelara la idea de conjunto y que me sirviera cada vez que quiero tener muchas cosas de algo, por ejemplo en nuestro caso... nos serviría para modelar la valija en sí que es (para nosotros) un conjunto de items.
Nos quedamos con la idea de conjunto y hablamos de lo que queriamos hacer, como modela smalltalk esta idea, hablamos del objeto set que es objeto que entiende mensajes para agregar, sacar, contar cosas y varias cosas más.
Hicimos una listita de mensajes que entienden las colecciones:
  • add:
  • remove:
  • includes:
  • size
  • isEmpty
  • count:
  • sum:
  • select:
  • collect:
Pueden ver mas mensajes y de hecho lo pueden tener siempre con ustedes el apunte de la guía de lenguajes (sí, el siempre incluye el parcial).
Finalmente... hicimos el tp presencial.

¿Como seguimos?

Leyendo! Este resumen para empezar y los apuntes (con los links que les dejamos ahora y en las clases anteriores)
Practicando! Mucho, pueden hacer toda la guía 1 de objetos sin problemas.
Adjunto en este post pueden encontrar un apunte de colecciones y bloques mas explicado para ampliar lo que vimos en clase.

La materia sigue y cada vez se hace mas complicada, les recomendamos que se mantengan al día porque a partir de acá arrancamos para aprender nuevos conceptos asi que si no tenemos claros la base hace que todo sea cuesta arriba y eso no esta bueno.

Próxima clase

La clase que viene vamos a hacer un nuevo tp presencial en el laboratorio por lo que les aconsejamos que no falten :).

Clase 2 - Self - Polimorfismo - Clonacion

publicado a la‎(s)‎ 25 ago. 2011 6:20 por gisela decuzzi   [ actualizado el 25 ago. 2011 6:35 ]

Clase 2 - Self - Polimorfismo - Clonacion

Esta clase fue bastante mas larga que la anterior y vimos unos cuantos conceptos nuevos y muy importantes.
Hablamos de self, dijimos que es una pseudovariable que referencia al objeto que recibió el mensaje y nos permite mandarle mensajes con lo que hablamos un poquito de Reutilización de código.
Hicimos mucho (MUCHO) hincapié en que repetir código está mal. Para seguir leyendo sobre estas ideas les dejamos este artiulo de la wikipedia DRY.
A medida que fuimos avanzando en la clase necesitamos nuevas herramientas para no repetir código entonces hablamos de clonación, que es una implementación del esquema prototipado (OJO, los que conocen otros esquemas NO los confundan, más adelante vamos a ver otros y vamos a explicar la diferencia con los prototipos). Hablamos de como se implementaen el object browser y dijimos que podemos clonar a nuestros objetos.
Hablamos del nuevo método Lookup donde primero busca el código en el objeto receptor del mensaje y después en su prototipo, dijimos que se pueden redefinir métodos. Esto nos trajo algunas consecuencias:
  1. El código ya no está unicamente en el objeto al que le mando el mensaje
  2. Es importante entender quién es self en cada momento (dijimos que es MUY importante entender la diferencia entre... objeto que recibió el mensaje y objeto que contiene el método)
Hablamos de uno de nuestros conceptos favoritos en la materia Polimorfismo, lo vimos con un ejemplo y reconocimos en distintos casos los objetos que son polimorficos y quién aprovecha ese polimorfismo.
En un momento quisimos manejar condiciones y hacer que pepita viaje hasta algun lugar sólo si puede, con lo cual vimos objetos booleanos y hablamos al pasar que en smalltalk no es necesario el concepto de estructura de control ajeno a su sintaxis (OBJETO MENSAJE) con lo que los booleanos entienden mensajes, particularmente hablamos de 3 mensajes que le podemos mandar:
  • ifTrue:
  • ifFalse:
  • ifTrue: ifFalse: (este es un mensaje con 2 parámetros NO son 2 mensajes)
Hablamos de los objetos bloque que modela smalltalk y algunos mensajes que entienden (value, valPolimorfismo|ue:). Vimos algunos ejemplos en el pizarron de los bloques:
  • [2+3] (objeto bloque que contiene una única sentencia donde le manda el mensaje + con el parámetro 3 al objeto 2)
  • [2+3] value. (el mismo objeto bloque que tenía antes solo que le envio el mensaje value que sería como decirle ejecutate, cuando lo seleccionemos y lo ejecutemos el objeto resultado será el objeto 5)
  • [:num|num+3]  (objeto bloque que espera un parámetro)
  • [:num|num+3] value: 2.

¿Cómo seguimos?

  • Practicando: mucho! No hay tp para la próxima clase pero sería muy sano que intenten resolver los ejercicios de la guía uno (del 1 al 4-a) los van a poder resolver sin problemas. Les recomendamos MUCHO MUCHO que hagan también el ejercicio 7 de la guía 1 (que pueden encontrar acá).
  • Leyendo
    • Ya pueden leer el segundo capítulo del apunte que está aca
    • En esta página se habla un poco del manejo de booleanos. La primera parte (true vs True) todavia no la vimos pero lo que sigue es muy interesante como para prestarle atención.
    • En esta página se habla de las diferencias entre objetos y procedural basándose en un ejercicio de la guía uno.
    • Hay que leer el apunte de objetos básicos del smalltalk

Clase 1 - Objeto Mensaje

publicado a la‎(s)‎ 20 ago. 2011 5:49 por gisela decuzzi   [ actualizado el 20 ago. 2011 6:14 ]

Vimos



Para la clase que viene

Leer el apunte de objetos capítulo 1 (Ojo, no confundir con el apunte de objetos básicos)
Instalar el object browser (Les recomendamos que usen la version #stable). Sobre dudas de como usarlo tienen el manual en la página, y aca pueden encontrar una guía rápida. Cualquier consulta la mandan al grupo de la materia, al cual ya se deberían de haberse suscripto :)

TP1

Para la clase que viene (miércoles 24/08 o jueves 25/05) hay que entregar el TP1 (impresa la exportacion de la leccion, SI, CON TODOS LOS CHIRIMBOLOS RAROS. NO SE ADMITEN TPS EN WORD).
Tienen que pasar al Object Browser / LOOP lo mismo que hicimos en clase, es decir.
Codificas a nuestra golondrina favorita: pepita. Permitiendo que pueda:
  • volar una determinada cantidad de kilometros (cuando pepita vuela su energia disminuye)
  • comer una determinada cantidad de gramos de alpiste (cuando pepita come su energia aumenta)
  • poder saber la energia de pepita
Tienen que hacer un workspace probando los métodos que hicieron, cuando guardan el workspace (con control-s) en la exportación de la lección ya viene, asi que no se olviden de guardarlo antes de cerrarlo.

1-9 of 9