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 scala:
Empecemos desarrollo de la serie, la serie tiene como responsabilidad generarse y si lo hacemos de esta manera podemos utilizar la potencia del polimorfismo, para que no quede acoplado la generación de la serie con el desarrollo del juego:
package com.blog.serie
import scala.util.Random
abstract class Serie {
var semilla = Random.nextInt(2000) + 1;
def generate(): Seq[Int];
val serie : Seq[Int]= generate();
}
Luego implementemos las series:
package com.blog.model.serie
import scala.util.Random
/**
* @author emanuel
*
*/
class SeriePar extends Serie {
override def generate(): Seq[Int] = for(i <- 0 to 3) yield (i + semilla) * 2
}
Una serie impar:
package com.blog.model.serie
import scala.util.Random
import scala.collection.immutable.List
/**
* @author emanuel
*
*/
class SerieImpar extends Serie {
override def generate(): Seq[Int] =
for(i <- 0 to 3) yield if ((semilla%2)==0) (i * 2) + semilla + 1 else (i * 2) + semilla
}
Serie normal
package com.blog.model.serie
import scala.util.Random
class SerieNormal extends Serie {
override def generate(): Seq[Int] = for(i <- 0 to 3) yield (i + semilla)
}
Serie de fibonacci;
package com.blog.model.serie
import scala.util.Random
/**
* @author emanuel
*
*/
class SerieFibonacci extends Serie {
override def generate(): Seq[Int] = {
semilla = Random.nextInt(20) + 1
def fibo(n:Int) : Int = n match {
case 0 => 1
case 1 => 1
case _ => fibo(n-1) + fibo(n-2)
}
for(i <- 0 to 3) yield fibo(i + semilla)
}
}
Ya tenemos un conjunto interesante de series, ahora a programar el juego:
package com.blog.model
import com.blog.model.serie._
import scala.util.Random
class Juego {
var serie : Serie = null
var puntos = 0
def generarSerie():Unit = {
val selector = Random.nextInt(4);
selector match {
case 0 => serie = new SerieNormal()
case 1 => serie = new SeriePar()
case 2 => serie = new SerieFibonacci()
case _ => serie = new SerieImpar()
}
}
generarSerie()
def getValor0() = serie.serie.seq(0)
def getValor1() = serie.serie.seq(1)
def getValor3() = serie.serie.seq(3)
def isValid(i: Int):Boolean =
if (i == serie.serie.seq(2)) {
puntos= puntos+1
generarSerie()
true
} else {
generarSerie()
false
}
}
El Juego es el encargado de crear la serie, mostrar los valores y validar si la respuesta es correcta. Ahora programemos la interfaz en este caso utilizaremos la consola:
package com.blog.model
object Principal extends App {
var juego = new Juego
var op = "ok"
while (op == "ok") {
println("Serie " + juego.getValor0() + " , "+ juego.getValor1() + " ___ " + juego.getValor3())
println()
print(" Indique el valor faltante : ")
val i = readInt()
if (juego.isValid(i)) {
println(" Ganaste !! Puntaje : " + juego.puntos)
} else {
println(" Perdiste !! Puntaje : " + juego.puntos)
}
println(" Si desea continuar ingrese ok : ")
op = readLine()
}
println(" chau !! ")
}
Y eso es todo a jugar se a dicho!!
Dejo el repositorio git: https://github.com/emanuelpeg/serieScala