Vamos a hacer un pequeño juego en el cual el usuario elige un número y si es igual a un número que se calcula aleatoriamente, gana de otro modo pierde.
use std::io;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("The secret number is: {}", secret_number);
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {}", guess);
}
Primero, importamos rand :: Rng que define los métodos que implementan los generadores de números aleatorios.
La función rand :: thread_rng nos dará el generador de números aleatorios en particular que vamos a utilizar: uno que sea local al hilo de ejecución actual y que el sistema operativo sembró. Luego llamamos al método gen_range en el generador de números aleatorios. El método gen_range toma dos números como argumentos y genera un número aleatorio entre ellos. Es inclusivo en el límite inferior pero exclusivo en el límite superior, por lo que debemos especificar 1 y 101 para solicitar un número entre 1 y 100.
La segunda línea que agregamos a la mitad del código imprime el número secreto. Esto es útil mientras desarrollamos el programa para poder probarlo, pero lo eliminaremos de la versión final.
Al Intenta ejecutar el programa varias veces:
$ cargo run
Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
Finished dev [unoptimized + debuginfo] target(s) in 2.53 secs
Running `target/debug/guessing_game`
Guess the number!
The secret number is: 7
Please input your guess.
4
You guessed: 4
$ cargo run
Running `target/debug/guessing_game`
Guess the number!
The secret number is: 83
Please input your guess.
5
You guessed: 5
Ahora que tenemos la entrada del usuario y un número aleatorio, podemos compararlos:
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
let mut guess = String :: new ();
io :: stdin (). read_line (& mut guess) .expect ("Error al leer la línea");
let guess: u32 = guesss.trim (). parse ().expect ("¡Escriba un número!");
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
}
Con : let guess: u32 = guesss.trim(). parse().expect ("¡Escriba un número!"); creamos una variable llamada guess. Pero espera, ¿el programa ya no tiene una variable llamada guess? Lo hace, pero Rust nos permite sobreescribir el valor anterior. Esta característica se usa a menudo en situaciones en las que desea convertir un valor de un tipo a otro. Esto nos permite reutilizar el nombre de la variable de guess en lugar de obligarnos a crear dos variables únicas, como por ejemplo, guess_str y guess.
Ojo, tenemos que hacer esto porque no podemos comparar números con String por lo que llevamos todo a números.
La expresión guesss.trim(). parse(). El método trim eliminará cualquier espacio en blanco al principio y al final.
Aquí podemos ver un tipo llamado std :: cmp :: Ordering que es de la biblioteca estándar. Ordering es otra enumeración, pero las variantes para Ordenar son Menor, Mayor e Igual. Estos son los tres resultados que son posibles cuando compara dos valores.
Veamos un ejemplo de lo que sucedería con la expresión de coincidencia utilizada aquí. Digamos que el usuario pone 50 y el número secreto generado aleatoriamente esta vez es 38. Cuando el código compara 50 a 38, el método cmp devolverá Ordering :: Greater, porque 50 es mayor que 38. La expresión de coincidencia obtiene el Ordering: : Mayor valor y comienza a verificar el patrón.
¡Ejecutemos el programa ahora!
$ cargo run
Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
Finished dev [unoptimized + debuginfo] target(s) in 0.43 secs
Running `target/debug/guessing_game`
Guess the number!
Please input your guess.
76
You guessed: 76
Too big!
Y con este pequeño juego me despido hasta la próxima!