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++:
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:
Vamos a dividir nuestros archivos en .h y .cpp empecemos con secuencia.h :
#ifndef SECUENCIA_H
#define SECUENCIA_H
class Secuencia
{
protected:
int valores[4];
public:
Secuencia();
virtual void generarValores()=0;
int getValor(int index);
};
#endif // SECUENCIA_H
secuencia.cpp :
#include "secuencia.h"
Secuencia::Secuencia()
{
for(int i=0;i<4; i++){
valores[i]=0;
}
}
int Secuencia::getValor(int index){
return valores[index];
}
Ahora vamos a ver las implementaciones de secuencia, veamos secuenciapar.h :
#ifndef SECUENCIAPAR_H
#define SECUENCIAPAR_H
#include "secuencia.h"
class SecuenciaPar:public Secuencia
{
public:
SecuenciaPar();
void generarValores();
};
#endif // SECUENCIAPAR_H
secuenciapar.cpp :
#include "secuenciapar.h"
#include <stdlib.h>
#include <time.h>
SecuenciaPar::SecuenciaPar()
{
}
void SecuenciaPar::generarValores(){
srand(time(NULL));
int par = (rand() % 100) * 2;
srand(time(NULL));
int par2 = (rand() % 50) * 2;
for(int i = 0; i<4; i++){
valores[i] = par + (par2 * i);
}
}
secuenciaimpar.h :
#ifndef SECUENCIAIMPAR_H
#define SECUENCIAIMPAR_H
#include "secuencia.h"
class SecuenciaImpar:public Secuencia
{
public:
SecuenciaImpar();
void generarValores();
};
#endif // SECUENCIAIMPAR_H
secuenciaimpar.cpp :
#include "secuenciaimpar.h"
#include <stdlib.h>
#include <time.h>
SecuenciaImpar::SecuenciaImpar()
{
}
void SecuenciaImpar::generarValores(){
srand(time(NULL));
int par = ((rand() % 100) * 2)+1;
srand(time(NULL));
int par2 = ((rand() % 50) * 2);
for(int i = 0; i<4; i++){
valores[i] = par + (par2 * i);
}
}
Ahora vamos a ver el juego, este tiene la responsabilidad de verificar si el usuario acertó y tambien debe llevar los puntos:
#ifndef JUEGO_H
#define JUEGO_H
#include "secuencia.h"
class Juego
{
private:
int puntos;
Secuencia * secuencia;
void regenerar();
public:
Juego();
int getValor0();
int getValor1();
int getValor3();
bool validar(int numero);
int getPuntos();
};
#endif // JUEGO_H
juego.cpp :
#include "juego.h"
#include "secuenciapar.h"
#include "secuenciaimpar.h"
#include <stdlib.h>
#include <time.h>
Juego::Juego()
{
secuencia = 0;
this->puntos = 0;
this->regenerar();
}
void Juego::regenerar() {
if (secuencia != 0) delete secuencia;
srand(time(NULL));
int aleatorio = (rand() % 2);
switch (aleatorio) {
case 0:
secuencia = new SecuenciaPar();
break;
default:
secuencia = new SecuenciaImpar();
break;
}
secuencia->generarValores();
}
int Juego::getValor0(){
return this->secuencia->getValor(0);
}
int Juego::getValor1(){
return this->secuencia->getValor(1);
}
int Juego::getValor3(){
return this->secuencia->getValor(3);
}
bool Juego::validar(int numero) {
bool resultado = false;
if (numero == this->secuencia->getValor(2)) {
this->puntos++;
resultado = true;
} else {
this->puntos--;
}
this->regenerar();
return resultado;
}
int Juego::getPuntos(){
return this->puntos;
}
Ahora programemos la interfaz en este caso utilizaremos la consola:
#include <iostream>
#include <stdlib.h>
#include "juego.h"
using namespace std;
int main()
{
Juego juego;
cout << " ========== BIENVENIDO =========== "<<endl;
cout << endl;
while (true) {
cout << " La secuencia es : "<<endl;
cout << " " << juego.getValor0() << " " ;
cout << juego.getValor1() << " ? " << juego.getValor3()<<endl;
int valor = 0;
cout << " ";
cin >> valor;
if (juego.validar(valor)) {
cout << " Ganaste!! :D "<< endl;
} else {
cout << " Perdiste :( "<< endl;
}
cout << endl << " Sus puntos son : " << juego.getPuntos() << endl;
cout << " Desea continuar jugando ? (y/n) ";
char opt;
cin >> opt;
if (opt == 'n') return 0;
else cout << endl << endl;
}
}