Cuando quiero aprender un nuevo lenguaje desarrollo un juego de series, es decir aparece una serie con un valor faltante y el jugador debe completarlo.
Uno de los requerimientos no funcionales es que se pueda agregar una serie nueva fácilmente, para cumplirlo vamos a utilizar las ventajas de herencia y polimorfismo.
Vamos a desarrollar este juego en Crystal :
Comencemos haciendo un nuevo proyecto:
crystal init app secuenciaCrystal
cd secuenciaCrystal
y luego probamos compilar :
shards build
Y todo debería funcionar.
Ahora utilizaremos visual code con un plugin para crystal, para importar el proyecto, vamos a abrir carpeta y seleccionamos la carpeta donde estamos trabajando :
Ahora vamos a hacer un archivo secuencia.cr que va a tener las clases de secuencias:
abstract class Secuencia
@secuencia : Array(Int32)
getter secuencia
def initialize()
@secuencia = generarSecuencia()
end
abstract def generarSecuencia() : Array(Int32)
end
class SecuenciaPar < Secuencia
def generarSecuencia() : Array(Int32)
Array(Int32).new(4) { |i|
i * 2 * rand(100) + rand(10) * 2
}
end
end
class SecuenciaInPar < Secuencia
def generarSecuencia() : Array(Int32)
Array(Int32).new(4) { |i|
i * 2 * rand(100) + rand(10) * 2 + 1
}
end
end
Luego hacemos otro archivo para juego:
require "./secuencia.cr"
class Juego
getter puntos
@secuencia : Secuencia
def initialize()
@puntos = 0
@secuencia = generarSecuencia()
end
def generarSecuencia() : Secuencia
i = rand(2)
case i
when 0
SecuenciaPar.new
else
SecuenciaInPar.new
end
end
def valor1()
@secuencia.secuencia[0]
end
def valor2()
@secuencia.secuencia[1]
end
def valor4()
@secuencia.secuencia[3]
end
def esta_bien?(num : Int32?) : Bool
if @secuencia.secuencia[2] == num
@puntos = @puntos + 1
@secuencia = generarSecuencia()
true
else
@puntos = @puntos - 1
@secuencia = generarSecuencia()
false
end
end
end
Y por ultimo tenemos el programa propiamente dicho:
require "./secuenciaCrystal/*"
require "./juego.cr"
module SecuenciaCrystal
puts "Bienvenido a Secuancia Crystal"
juego = Juego.new
while true
puts juego.valor1.to_s + " " + juego.valor2.to_s + " ______ " + juego.valor4.to_s + " \n"
puts "Ingere el valor \n"
valorStr = gets.to_s
valor = (valorStr).to_i32
if juego.esta_bien?(valor)
puts " Ganaste !! Tus puntos : " + juego.puntos.to_s
else
puts " Perdiste !! Tus puntos : " + juego.puntos.to_s
end
puts "Ingere 0 para salir y otro valor para continuar"
if gets() == "0"
break
end
end
puts "Bye!"
end
Como se puede apreciar el diseño del juego permite generar una interfaz de consola o gráfica o en otra tecnología esta es la mayor ventaja de separar nuestros objetos de la capa de presentación.
Funcionando es muy divertido:
Dejo el repo: https://github.com/emanuelpeg/secuenciaCrystal
Funcionando es muy divertido:
Dejo el repo: https://github.com/emanuelpeg/secuenciaCrystal