lunes, 4 de diciembre de 2017

Juego de Serie en C# y mono!!

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# y mono :

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:

using System;
using System.Collections.Generic;

namespace SecuenciaCSharep
{
public abstract class Secuencia
{
protected IList<int> values = new List<int>();

protected abstract void generate();

public Secuencia ()
{
this.generate();
}

public IList<int> getValues(){
return values;
}

}
}

Ahora vamos a ver las implementaciones de secuencia:

using System;

namespace SecuenciaCSharep
{
public class SecuenciaPar : Secuencia
{
protected override void generate () {
int semilla = new Random ().Next (99);
for (int i = 0; i<4; i++) {
this.values.Add (semilla * i * 2);
}
}

public SecuenciaPar ()
{
}
}
}

Y ahora la secuencia Impar: 

using System;

namespace SecuenciaCSharep
{
public class SecuenciaInPar : Secuencia
{
protected override void generate () {
int semilla = new Random ().Next (99);
for (int i = 0; i<4; i++) {
this.values.Add ((semilla * i * 2) + 1);
}  

}

public SecuenciaInPar ()
{
}
}
}

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 SecuenciaCSharep
{
public class Juego
{
private Secuencia secuencia;

private int puntaje = 0;

public void generar() {
int i = new Random ().Next (2);

switch (i) {
case 0:
secuencia = new SecuenciaPar ();
break;
default: 
secuencia = new SecuenciaInPar ();
break;
}
}

public Juego ()
{
this.puntaje = 0;
generar ();
}

public int getValue0() {
return secuencia.getValues()[0];
}

public int getValue1() {
return secuencia.getValues()[1];
}

private int getValue2() {
return secuencia.getValues()[2];
}

public int getValue3() {
return secuencia.getValues()[3];
}

public int getPuntaje() {
return this.puntaje;
}

public bool isOK(int n) {
if (this.getValue2 () == n) {
this.puntaje++;
this.generar ();
return true;
}
this.puntaje --;
this.generar ();
return false;
}

}
}

Ahora programemos la interfaz en este caso utilizaremos mono+Gtk:

using System;
using Gtk;
using SecuenciaCSharep;

public partial class MainWindow: Gtk.Window
{
private Juego juego;

public MainWindow (): base (Gtk.WindowType.Toplevel)
{
Build ();
juego = new Juego ();
this.regenerate ();
}

protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal = true;
}

protected void OnButton1Clicked (object sender, EventArgs e)
{
int n = (int)this.spinbutton2.Value;
MessageDialog msd; 
if (juego.isOK (n)) {
msd = new MessageDialog (this, DialogFlags.Modal, MessageType.Info, ButtonsType.None, "Ganaste!! Puntaje : " + juego.getPuntaje());
} else {
msd = new MessageDialog (this, DialogFlags.Modal, MessageType.Info, ButtonsType.None, "Perdiste  Puntaje : " + juego.getPuntaje());
}
msd.Show ();
this.regenerate ();
}

private void regenerate() {
this.label1.Text = juego.getValue0 ().ToString();
this.label2.Text = juego.getValue1 ().ToString();
this.label3.Text = juego.getValue3 ().ToString();
this.spinbutton2.Value = 0;
}
}

Y eso es todo!11 a jugar se a dicho!!

Dejo el repositorio git: