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.
Vamos a desarrollar este juego en Rust:
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:
use rand::{thread_rng, Rng};
pub fn iniciar_secuencia() -> [u16;4] {
let semilla:u8 = thread_rng().gen_range(0..3);
match semilla {
0 => return generar_secuencia_par(),
1 => return generar_secuencia_inpar(),
_ => return generar_fibonacci()
}
}
//Esta función genera la serie y para eso utiliza diferentes funciones que generan diferentes tipos de secuencias :
fn generar_secuencia_par() -> [u16;4] {
let mut resultado:[u16;4] = [0; 4];
let semilla:u16 = thread_rng().gen_range(0..30);
for i in 0..4 {
resultado[i] = semilla * 2 + (i as u16) * 2;
}
resultado
}
fn generar_secuencia_inpar() -> [u16;4] {
let mut resultado:[u16;4] = [0; 4];
let semilla:u16 = thread_rng().gen_range(0..30);
for i in 0..4 {
resultado[i] = semilla * 2 + (i as u16) * 2 + 1;
}
resultado
}
fn generar_fibonacci() -> [u16;4] {
let mut _resultado:[u16;4] = [0; 4];
let semilla:u16 = thread_rng().gen_range(0..30);
for i in 0..4 {
if i < 2 {
_resultado[i] = semilla;
} else {
_resultado[i] = _resultado[i-1] + _resultado[i-2];
}
}
_resultado
}
Y listo!! ahora en el main tenemos que llamar a esta función y ver si esta bien el resultado:
use std::io;
use crate::serie::iniciar_secuencia;
mod serie;
fn main() {
let mut puntos = 0u8;
loop {
let serie:[u16;4] = iniciar_secuencia();
println!("Serie: ");
for i in 0..2 {
print!(" {} ", serie[i]);
}
println!("_____ {} ", serie[3]);
println!("Ingrese el valor faltante: ");
let mut input = String::new();
io::stdin().read_line(&mut input).expect("error: unable to read user input");
let x = input.trim().parse().expect("Error!! debe ser un numero.");
if serie[2].eq(&x) {
println!("Ganaste !! ");
puntos = puntos + 1;
} else {
println!("Perdiste !! ");
}
println!("Puntos : {} ", puntos);
println!("Desea continuar jugando? (y/n): ");
let mut continuar = String::new();
io::stdin().read_line(&mut continuar).expect("error: unable to read user input");
if continuar.trim().ne("y"){
return;
}
}
}