Interfaces gráficas con Ruby

En esta ocasión les mostraré como hacer un “Concéntrese” con Ruby. Lo sé, la página es sobre Java, Php y C++ pero bueno, me parece que es buen momento para mostrar cosas sencillas y rápidas que se pueden hacer en otros lenguajes y que uno piensa “Naa, eso está muy complicado!” :P

¿Cómo empezar?

Ruby es un lenguaje de programación que se puede manejar orientado a objetos, como Java, Php y C++, con la diferencia que todas sus variables declaradas son de tipo privado. Es sencillo de manejar y aprenderlo es fácil, ya que es de la línea de Phyton y para los programadores suele ser muy claro, relajado y hasta suave de trabajar :D

Pero bueno, arranquemos, primero que todo importantísimo aclarar que este artículo está trabajado sobre Linux, específicamente en Ubuntu, pero que para los amantes de Windows, la diferencia es relativamente muy poca.

Empecemos por instalar Ruby en nuestro equipo. Como vamos a trabajar interfaces gráficas es importante tener una librería gráfica a usar, como Swing en Java, en este caso usaremos GTK2.

¿GTK2?

GTK2 es un librería para crear interfaces gráficas, publicada bajo licencia pública LGPL. La idea es descargarla y copiarla en el directorio lib de nuestro Ruby. Descargar

A programar!

Un concéntrese clásico es una ventana con un cierto número de fichas las cuales tienen un a imagen al reverso de éstas. El concéntrese que vamos a hacer cumple con ciertas características de la Programación Orientada a Objetos, como la Herencia, Overriding de métodos y manejo de eventos; además vamos a manejar el concepto de Thread (hilo) para la ejecución del programa.

Nuestro concéntrese comienza definiendo la clase BotonConcentrese, la cual es una herencia de la clase Botón de GTK, además se hace uso de variables globales las cuales permitirán el buen funcionamiento del mismo.

Clase Botón

$click = 0
$botones = 6
$bloqueados = 0
$registrados = Array.new

#Clase Boton
class BotonConcentrese < Gtk::Button
	#Constructor
	def initialize(nombre, numero)
	    super(nombre)
	    @numero = numero
	    signal_connect("clicked"){
		Thread.new{jugar(self)}
	    }
	  end

        #Accesor
	  def getNumero
	    return @numero
	  end
end

En la primera línea se puede observar la forma en que la clase está heredando de Botón, a continuación se definen sus métodos como el constructor, el accesor getNumero (el cual retorna el valor asignado al botón), y jugar.
Es en este método donde se encuentra la interactividad del juego. El cual recibe como parámetro un botón, es decir el botón que haya sido oprimido por el usuario, es aquí donde cada botón del Concéntrese tiene relacionada una imagen, pero resulta que cada imagen tiene una copia que debe estar asignada en otro botón, es por eso que en esta parte se asigna teniendo en cuenta que solo exista una copia y no varias.

	#Metodo Principal Jugar
	  def jugar(boton)
		  $click = $click+1
		  image = Gtk::Image.new(boton.getNumero + ".jpg")
		  imagen = Gtk::Window.new
		  imagen.add(image)
		  imagen.show_all
		  #Puntaje - Actualizacion de Inferfaz
		  if $click==2
			$click = 0
			if $primeraOpcion.getNumero == boton.getNumero
				#desactivando los botones
				boton.set_sensitive(false)
				$primeraOpcion.set_sensitive(false)
				$primeraOpcion = BotonConcentrese.new("?", "0")
				$bloqueados = $bloqueados + 2
			end

		  else
		     $primeraOpcion = boton
		  end 

		  sleep (2)
		  imagen.destroy
		  if $bloqueados == $botones
			puts "Juego Completo!"
			terminar = Gtk::Image.new("terminado2.jpg")
			terminado = Gtk::Window.new
			terminado.add(terminar)
			terminado.show_all
			sleep (3)
			terminado.destroy
			Gtk.main_quit
		  end
	  end

A continuación entonces la serie de código en el cual se controla y se crean los botones aleatoriamente:

#Metodo para controlar la creacion de los botones
def estaRegistrado(num)
  cont = 0
  $registrados.each do |x|
    if x == num
      cont = cont + 1
    end
  end

  if cont < 2
    return false
  end

  if cont == 2
     return true
  end
  return true
end

#Creacion de los metodos
for j in 0..($botones-1)
  numero = (rand(5)%3)+1
  while estaRegistrado(numero) && $registrados.length != 0 do
     numero = (rand(5)%3)+1
  end
  $registrados << numero
  box1.pack_start(BotonConcentrese.new(Gtk::Stock::DIALOG_QUESTION, numero.to_s), true, true, 0)
end

Esta mini-aplicación hace que cuando se escoja algún botón, éste se cierre por sí solo, gracias a los Hilos que se ejecutan. Subo el comprimido con los fuentes para los que quieran descargarlo y probarlo. Y como siempre, no olviden dejar sus comentarios y consultar la fuente: Fuente

One Response to “Interfaces gráficas con Ruby”

  1. darvein says:

    Se ve buenísimo
    te faltó algunas capturas de pantalla, pero da igual voy a probarlo.
    saludos!

Leave a Reply