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 C# para ello creamos el proyecto con :
Vamos a desarrollar este juego en C# para ello creamos el proyecto con :
$ dotnet new console -lang C#
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:
Luego de esto abrimos nuestro editor favorito, podemos utilizar visual code.
using System;
namespace dotNetSecuencia.model
{
public abstract class Secuencia
{
protected int[] nros = new int[4];
public Secuencia() {
this.generar();
}
public int[] Nro {
get {
return nros;
}
}
public abstract void generar();
}
}
Ahora vamos a ver las implementaciones de secuencia:
using System;
namespace dotNetSecuencia.model
{
public class SecuenciaPar : Secuencia
{
public override void generar() {
int semilla = new Random ().Next (99) * 2;
for (int i = 0; i<4; i++) {
this.nros[i] = (semilla + i * 2);
}
}
}
}
Y ahora la secuencia Impar:
using System;
namespace dotNetSecuencia.model
{
public class SecuenciaImpar : Secuencia
{
public override void generar() {
int semilla = new Random ().Next (99) * 2;
for (int i = 0; i<4; i++) {
this.nros[i] = (semilla + i * 2) + 1;
}
}
}
}
Y ahora la secuencia Fibonacci :
using System;
namespace dotNetSecuencia.model
{
public class SecuenciaFibonacci : Secuencia
{
public override void generar() {
int until = new Random ().Next (15);
this.nros[0] = 0;
this.nros[1] = 1;
this.nros[2] = 1;
this.nros[3] = 2;
for (int i = 0; i<until; i++) {
this.nros[0] = this.nros[1];
this.nros[1] = this.nros[2];
this.nros[2] = this.nros[3];
this.nros[3] = this.nros[1] + this.nros[2];
}
}
}
}
Ahora vamos a ver el juego, este tiene la responsabilidad de verificar si el usuario acertó y tambien debe llevar los puntos:
using System;
namespace dotNetSecuencia.model
{
public class Juego
{
private int puntaje = 0;
private Secuencia secuencia = null;
public Juego()
{
this.generarSecuencia();
}
public int Nro1 {
get {
return this.secuencia.Nro[0];
}
}
public int Nro2 {
get {
return this.secuencia.Nro[1];
}
}
public int Nro4 {
get {
return this.secuencia.Nro[3];
}
}
public int Puntaje {
get {
return this.puntaje;
}
}
public void generarSecuencia()
{
int semilla = new Random ().Next (3);
switch (semilla)
{
case 0 :
this.secuencia = new SecuenciaPar();
break;
case 1 :
this.secuencia = new SecuenciaImpar();
break;
default:
this.secuencia = new SecuenciaFibonacci();
break;
}
}
public bool isOk(int valor) {
bool result = false;
if (this.secuencia.Nro[2] == valor) {
this.puntaje++;
result = true;
} else {
this.puntaje--;
}
this.generarSecuencia();
return result;
}
}
}
Ahora programemos la interfaz por consola por supuesto :
using System;
using dotNetSecuencia.model;
namespace dotNetSecuencia
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Bienvenido !!");
Juego juego = new Juego();
String respuestaStr;
do {
Console.WriteLine("La secuencia es : ");
Console.WriteLine(" " + juego.Nro1 + " " + juego.Nro2 + " __ " + juego.Nro4 );
respuestaStr = Console.ReadLine();
int respuesta = Convert.ToInt32(respuestaStr);
if (juego.isOk(respuesta)) {
Console.WriteLine("Ganaste!! Tu puntaje es " + juego.Puntaje);
} else {
Console.WriteLine("Perdiste!! Tu puntaje es " + juego.Puntaje);
}
Console.WriteLine("Quieres seguir Jugando [n/s] ? ");
respuestaStr = Console.ReadLine();
} while (respuestaStr != "n");
}
}
}
Y eso es todo!!! a jugar se a dicho!!
Dejo el repositorio git: