13/01/2014
Desde los juegos de cartas en tiempo real hasta las mascotas virtuales que cobran vida en nuestra pantalla, la programación nos permite construir mundos y criaturas sorprendentes. Imagina poder no solo interactuar con un bebé dragón, sino también entender cómo funciona por dentro, cómo come, duerme o incluso cómo crece. Este artículo te guiará a través de los conceptos fundamentales de la programación orientada a objetos utilizando Ruby, mostrando cómo puedes diseñar y cuidar a tu propio dragón bebé virtual.

- El Nacimiento de un Dragón Virtual: Clases y Objetos
- Dando Vida a tu Dragón: El Método Initialize y las Variables de Instancia
- Interactuando con tu Dragón: Métodos Públicos
- El Mundo Interior del Dragón: Métodos Privados y Lógica Interna
- Ejecutando la Simulación de tu Dragón
- Comparando Estructuras de Datos: Arrays vs. Hashes
- Preguntas Frecuentes sobre tu Dragón Virtual
- ¿Cómo puedo darle un nombre específico a mi dragón al crearlo?
- ¿Qué sucede si mi dragón tiene mucha hambre o necesita ir al baño?
- ¿Puedo crear varios dragones a la vez?
- ¿Cuál es la diferencia entre métodos públicos y privados?
- ¿Cómo puedo hacer que mi dragón sea interactivo, recibiendo comandos del usuario?
- Conclusión
El Nacimiento de un Dragón Virtual: Clases y Objetos
En el corazón de cualquier creación en programación orientada a objetos (POO) están las clases y los objetos. Piensa en una clase como el plano o la receta para construir algo, y un objeto como la cosa real que construyes a partir de ese plano. Por ejemplo, en el mundo real, la 'clase' coche define lo que un coche es (tiene ruedas, un motor, puertas, etc.), mientras que tu coche específico, el rojo que aparcas en casa, es un 'objeto' o una 'instancia' de la clase coche.
En Ruby, crear una clase es tan sencillo como definirla con la palabra clave class. Por ejemplo, si quisiéramos crear un simple dado:
class Dado def rodar 1 + rand(6) end end dados = [Dado.new, Dado.new] dados.each do |dado| puts dado.rodar endAquí, Dado es nuestra clase. Dado.new crea un nuevo objeto (una instancia) de esa clase. El método rodar define una acción que nuestro objeto dado puede realizar.
Dando Vida a tu Dragón: El Método Initialize y las Variables de Instancia
Cuando un objeto nace, a menudo necesita un estado inicial. ¿Cómo se llama nuestro dragón? ¿Tiene hambre desde el principio? Para esto, usamos el método especial initialize. Este método se ejecuta automáticamente cada vez que creas un nuevo objeto de una clase. Además, para que nuestro dragón recuerde su nombre, su nivel de hambre o si está dormido, utilizamos variables de instancia. Estas variables pertenecen a un objeto específico y persisten mientras el objeto exista. Se distinguen por comenzar con un @.
Así es como podría lucir la creación de nuestro bebé dragón:
class Dragon def initialize(nombre) @nombre = nombre @dormido = false @panzaLlena = 10 # 10 es lleno, 0 es hambriento @intestinoLleno = 0 # 0 es vacío, 10 es 'necesita ir al baño' puts @nombre + ' nace.' end # ... (métodos de interacción y privados irán aquí) end mascota = Dragon.new 'Norbert' # Esto imprimirá: Norbert nace.Al llamar a Dragon.new 'Norbert', el método initialize se activa, asignando 'Norbert' a la variable de instancia @nombre y estableciendo el estado inicial de sueño, panza e intestino.
Interactuando con tu Dragón: Métodos Públicos
Una vez que tu dragón ha nacido, querrás interactuar con él. Los métodos públicos son las acciones que podemos realizar directamente sobre nuestro objeto dragón. Son la interfaz que ofrecemos al 'usuario' (en este caso, nosotros mismos como programadores o los comandos que un jugador podría dar).
Aquí hay algunos ejemplos de acciones que podemos realizar:
class Dragon # ... (initialize y variables de instancia) def alimentar puts 'Alimentas a ' + @nombre + '.' @panzaLlena = 10 pasoDelTiempo end def caminar puts 'Haces caminar a ' + @nombre + '.' @intestinoLleno = 0 pasoDelTiempo end def dormir puts 'Colocas a ' + @nombre + ' en la cama.' @dormido = true 3.times do if @dormido pasoDelTiempo end if @dormido puts @nombre + ' ronca, llenando el cuarto con humo.' end end if @dormido @dormido = false puts @nombre + ' despierta lentamente.' end end def lanzar puts 'Lanzas a ' + @nombre + ' en el aire.' puts 'Sonríe, sus cejas se mueven.' pasoDelTiempo end def acunar puts 'Acunas a ' + @nombre + ' suavemente.' @dormido = true puts 'Rápidamente se queda dormido...' pasoDelTiempo if @dormido @dormido = false puts '...pero despierta cuando te detienes.' end end # ... (métodos privados) endCada vez que llamamos a un método como mascota.alimentar, el estado interno del dragón cambia (@panzaLlena se restablece, por ejemplo) y se invoca pasoDelTiempo para simular el paso del tiempo y sus consecuencias.
El Mundo Interior del Dragón: Métodos Privados y Lógica Interna
Así como un coche tiene un pedal de acelerador (interfaz pública), también tiene un motor complejo y sistemas internos que el conductor no necesita entender directamente. De manera similar, nuestro dragón tiene una lógica interna que gestiona sus necesidades. Los métodos privados son funciones internas que solo la propia clase puede llamar, no están expuestas al 'exterior'. Se definen con la palabra clave private.

Estos métodos son cruciales para el comportamiento autónomo del dragón:
class Dragon # ... (initialize y métodos públicos) private def hambriento? @panzaLlena <= 2 end def ganas? @intestinoLleno >= 8 end def pasoDelTiempo if @panzaLlena > 0 @panzaLlena = @panzaLlena - 1 @intestinoLleno = @intestinoLleno + 1 else if @dormido @dormido = false puts '¡Se despierta de repente!' end puts '¡' + @nombre + ' está hambriento! En su desesperación, ¡te COMIO!' exit # ¡El juego termina si el dragón te come! end if @intestinoLleno >= 10 @intestinoLleno = 0 puts '¡Uy! ' + @nombre + ' tuvo un accidente...' end if hambriento? if @dormido @dormido = false puts '¡Se despierta de repente!' end puts 'El estómago de ' + @nombre + ' retumba...' end if ganas? if @dormido @dormido = false puts 'Se despierta de repente!' end puts @nombre + ' hace la danza del baño...' end end endEl método pasoDelTiempo es el corazón de la simulación. Se llama después de cada acción pública y decrementa la panza, incrementa el intestino y verifica si el dragón tiene hambre o necesita ir al baño, reaccionando en consecuencia. Es vital que pasoDelTiempo sea privado, ya que es una función interna de mantenimiento, no una acción que el 'usuario' pueda invocar directamente.
Ejecutando la Simulación de tu Dragón
Para ver a tu dragón en acción, puedes crear una instancia y llamar a sus métodos:
mascota = Dragon.new 'Norbert' mascota.alimentar mascota.lanzar mascota.caminar mascota.dormir mascota.acunar mascota.dormir mascota.dormir mascota.dormir mascota.dormirLa salida de este código te mostrará cómo el dragón reacciona a tus comandos y cómo su estado interno cambia con el tiempo, incluso llevando a la temida situación de ser devorado si no lo alimentas a tiempo.
Comparando Estructuras de Datos: Arrays vs. Hashes
Aunque no es directamente sobre nuestro dragón, comprender diferentes formas de almacenar información es crucial en programación. Ruby ofrece estructuras como Array y Hash, cada una ideal para distintos escenarios:
| Característica | Array (Arreglo/Matriz) | Hash (Tabla Hash/Diccionario) |
|---|---|---|
| Organización | Elementos ordenados por índice numérico (0, 1, 2...). | Elementos desordenados (o con un orden no garantizado en versiones antiguas de Ruby), asociados por pares clave-valor. |
| Acceso a elementos | Por índice numérico: mi_array[0]. | Por clave: mi_hash['nombre'], mi_hash[:simbolo]. |
| Uso principal | Listas ordenadas de ítems, colas, pilas. | Almacenamiento de datos donde cada pieza tiene una etiqueta, como configuraciones o registros de usuario. |
| Ejemplo | dias_semana = ['Lun', 'Mar', 'Mié'] | persona = { 'nombre' => 'Ana', 'edad' => 30 } |
Mientras que los Array son perfectos para listas donde el orden importa, los Hash son ideales para colecciones de datos donde cada elemento tiene una etiqueta descriptiva, como el color de diferentes partes de un código.
Preguntas Frecuentes sobre tu Dragón Virtual
¿Cómo puedo darle un nombre específico a mi dragón al crearlo?
Al crear una nueva instancia de la clase Dragon, pasas el nombre como un argumento al método new. Este argumento es capturado por el método initialize de la clase. Por ejemplo: mi_dragón = Dragon.new 'Smaug'.
¿Qué sucede si mi dragón tiene mucha hambre o necesita ir al baño?
La lógica interna del dragón, gestionada por el método privado pasoDelTiempo, verifica constantemente su estado. Si la panza se vacía por completo (@panzaLlena llega a 0), el dragón te 'comerá' y el programa terminará (exit). Si el intestino se llena demasiado (@intestinoLleno llega a 10), el dragón tendrá un 'accidente'. Estas condiciones están diseñadas para forzar al 'cuidador' a atender las necesidades del dragón.
¿Puedo crear varios dragones a la vez?
¡Absolutamente! Cada vez que llamas a Dragon.new, estás creando una nueva instancia independiente de la clase Dragon. Cada dragón tendrá su propio nombre, su propio nivel de panza, intestino y estado de sueño. Puedes tener un ejército de dragones virtuales si lo deseas:
dragón_1 = Dragon.new 'Falkor' dragón_2 = Dragon.new 'Drogon' dragón_1.alimentar dragón_2.lanzar¿Cuál es la diferencia entre métodos públicos y privados?
Los métodos públicos son aquellos que puedes llamar directamente desde fuera del objeto (ej. mascota.alimentar). Son la 'interfaz' del objeto. Los métodos privados, marcados con la palabra clave private, solo pueden ser llamados desde dentro de la propia clase o por otros métodos de la misma clase (ej. pasoDelTiempo es llamado por alimentar). Sirven para encapsular la lógica interna y mantener el código más organizado y seguro, evitando que usuarios externos manipulen el estado interno de formas no deseadas.
¿Cómo puedo hacer que mi dragón sea interactivo, recibiendo comandos del usuario?
Para que tu dragón responda a comandos ingresados por el usuario, necesitarías un bucle que lea la entrada del teclado y luego, basándose en esa entrada, llame al método apropiado del dragón. Esto se conoce como un 'método de envío' o 'despachador de comandos'. Podrías usar algo como gets.chomp para leer la entrada del usuario y luego una estructura case o if/elsif para decidir qué método llamar. Por ejemplo:
# Esto es un pseudo-código para la interacción: # loop do # puts '¿Qué quieres hacer con ' + mascota.nombre + '?' # comando = gets.chomp.downcase # # case comando # when 'alimentar' # mascota.alimentar # when 'caminar' # mascota.caminar # when 'dormir' # mascota.dormir # when 'salir' # break # else # puts 'Comando no reconocido.' # end # endConclusión
Crear un bebé dragón virtual en Ruby es mucho más que un simple ejercicio de codificación; es una inmersión práctica en los principios fundamentales de la programación orientada a objetos. Has aprendido a definir clases, crear objetos, gestionar su estado con variables de instancia, y a controlar sus acciones mediante métodos públicos y métodos privados. La capacidad de construir simulaciones y criaturas interactivas es una de las habilidades más gratificantes que ofrece la programación. Ahora que tienes las herramientas básicas, te animamos a experimentar, añadir nuevas interacciones, o incluso permitir que tu dragón evolucione y aprenda, ¡el cielo es el límite para tu imaginación!
Si quieres conocer otros artículos parecidos a Crea y Cuida a Tu Propio Dragón Bebé Virtual puedes visitar la categoría Entrenamiento.
