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!!! a jugar se a dicho!!
Dejo el repositorio git: