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