Nuevo en óxido: juego Hangman -- beginner campo con rust campo con hangman camp codereview Relacionados El problema

New to Rust: Hangman game


2
vote

problema

Español

Decidí probar mi mano en un juego de Hangman para familiarizarme un poco con el idioma.

  use std::io::{stdin, stdout, Write};  fn main() {     let stdin = stdin();     let mut stdout = stdout();      let to_guess = String::from("BENEDICT");      let mut letters: u128 = 0;      loop {         // Replace unguessed letters of to_guess by underscores         let current = to_guess.chars().map(|x| {             if x <= 127 as char && letters & (1 << x as u8) > 0 {                 x             } else {                 '_'             }         });         // Add spaces between letters         let current = current             .map(|x| x.to_string() + &' '.to_string())             .collect::<Vec<String>>()             .join(" ");          println!("Current word: {}", current.trim_end());          if !current.contains('_') {             println!("Congratulations!");             break;         }          print!("Enter new letter: ");         stdout.flush().unwrap();          let mut letter = String::new();         stdin.read_line(&mut letter).expect("Invalid letter");          if letter.trim().len() != 1 {             println!("Use only one ASCII letter");             continue;         }          let letter = letter.to_uppercase().chars().next().unwrap();          letters |= 1 << letter as u8     } }   

La palabra to_guess es dura, y hay un número ilimitado de conjeturas.

Para almacenar letras ya adivinadas, utilizo un 9988776665544337 y marcar el bit correspondiente. Debería estar bien ya que todas las letras ASCII están representadas por u8 & lt; 128.

¿Puedes ayudarme a revisar el código, hay "óxido" cosas que me perdí?

Original en ingles

I decided to try my hand at a Hangman game to familiarize myself a bit with the language.

use std::io::{stdin, stdout, Write};  fn main() {     let stdin = stdin();     let mut stdout = stdout();      let to_guess = String::from("BENEDICT");      let mut letters: u128 = 0;      loop {         // Replace unguessed letters of to_guess by underscores         let current = to_guess.chars().map(|x| {             if x <= 127 as char && letters & (1 << x as u8) > 0 {                 x             } else {                 '_'             }         });         // Add spaces between letters         let current = current             .map(|x| x.to_string() + &' '.to_string())             .collect::<Vec<String>>()             .join(" ");          println!("Current word: {}", current.trim_end());          if !current.contains('_') {             println!("Congratulations!");             break;         }          print!("Enter new letter: ");         stdout.flush().unwrap();          let mut letter = String::new();         stdin.read_line(&mut letter).expect("Invalid letter");          if letter.trim().len() != 1 {             println!("Use only one ASCII letter");             continue;         }          let letter = letter.to_uppercase().chars().next().unwrap();          letters |= 1 << letter as u8     } } 

The to_guess word is hardcoded, and there is an unlimited number of guesses.

To store letters already guessed, I use an u128 and flag the corresponding bit. It should be ok since all ASCII letters are represented by u8 < 128.

Can you help me review the code, are there "Rust" things I missed?

        

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Bienvenido a óxido. Aquí hay algunas sugerencias para comenzar:

Creación de declaraciones de uso idiomático

No es común en la oxidación para lograr una función al alcance directamente a través de una declaración de uso. En su lugar, se prefieren using (Stream reader = new FileStream(filePath, FileMode.Open)) { var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T)); return (T)serializer.Deserialize(reader); } 8 y io::stdout . Consulte la sección Creación de rutas de uso idiomático en el libro para obtener más información.

utilizando estructuras a código de autocontrol

Usted incluye esta oración en su explicación del código:

para almacenar letras ya adivinadas, uso un 99887766655443310 y la marca la bit correspondiente. Debería estar bien ya que todas las letras ASCII son representado por ON SAVE (if this is requested without a save/submit action just show data and validation results) this->Import->parseFile(data) //validate //show parse file issues to user if any return View(processedValues); if(no errors in parsefile) { //try database save Import->saveInDatabase //show validation errors if needed //if all ok you can redirect (or have user interaction) to delete } 1 & lt; 128.

Es preferible incluir esta información en el código en sí. En este caso, podemos introducir un 99887766555443312 :

  ON SAVE (if this is requested without a save/submit action just show data and validation results) this->Import->parseFile(data) //validate  //show parse file issues to user if any return View(processedValues);  if(no errors in parsefile) {   //try database save   Import->saveInDatabase   //show validation errors if needed    //if all ok you can redirect (or have user interaction) to delete } 3  

y modifique el código en consecuencia:

  ON SAVE (if this is requested without a save/submit action just show data and validation results) this->Import->parseFile(data) //validate  //show parse file issues to user if any return View(processedValues);  if(no errors in parsefile) {   //try database save   Import->saveInDatabase   //show validation errors if needed    //if all ok you can redirect (or have user interaction) to delete } 4  

Comprobando para ASCII

ON SAVE (if this is requested without a save/submit action just show data and validation results) this->Import->parseFile(data) //validate //show parse file issues to user if any return View(processedValues); if(no errors in parsefile) { //try database save Import->saveInDatabase //show validation errors if needed //if all ok you can redirect (or have user interaction) to delete } 5 trunca el personaje si ON SAVE (if this is requested without a save/submit action just show data and validation results) this->Import->parseFile(data) //validate //show parse file issues to user if any return View(processedValues); if(no errors in parsefile) { //try database save Import->saveInDatabase //show validation errors if needed //if all ok you can redirect (or have user interaction) to delete } 6 . Compruebe si hay este caso y solicite al usuario en consecuencia.

 

Welcome to Rust. Here's some suggestions to get you started:

Creating idiomatic use declarations

It is not common in Rust to bring a function into scope directly via a use declaration. Instead, io::stdin and io::stdout are preferred. See the section Creating Idiomatic use Paths in the book for more information.

Using structs to self-document code

You included this sentence in your explanation of the code:

To store letters already guessed, I use an u128 and flag the corresponding bit. It should be ok since all ASCII letters are represented by u8 < 128.

It is preferable to include this information in the code itself. In this case, we can introduce a struct:

#[derive(Clone, Copy, Debug, Default)] struct AsciiSet {     flag: u128, }  impl AsciiSet {     fn new() -> Self {         Self { flag: 0 }     }      fn push(&mut self, letter: u8) {         self.flag |= (1 << letter);     }      fn contains(&self, letter: u8) -> bool {         (self.flag & (1 << letter)) != 0     } } 

and modify the code accordingly:

let mut letters = AsciiSet::new();  loop {     // ...     if letters.contains(letter) { /* ... /* }      // ...     letters.push(letter); } 

Checking for ASCII

letter as u8 truncates the character if !letter.is_ascii(). Check for this case and prompt the user accordingly.

 
 

Relacionados problema

5  La forma correcta de colgar un hombre: parte final  ( The right way to hang a man final part ) 
El problema: Haciendo un juego de Hangman simple. Esta es una continuación de la siguiente pregunta: la forma correcta de colgar un hombre . Allí acababa d...

8  Juego de Hangman simple en C ++  ( Simple hangman game in c ) 
Estoy tratando de crear un juego de Hangman simple. El juego tiene un modo de edición para la primera ejecución en la que el usuario tiene que suministrar 6 p...

2  Juego Hangman completado  ( Completed hangman game ) 
Esto funciona en su mayor parte. Soy muy nuevo en la programación, así que sé consciente. import java.util.*; public class HangManP5 { private static Scan...

5  Revisión de código para Hangman en C ++  ( Code review for hangman in c ) 
Tengo el siguiente programa C ++: autoConnect.py1 que se supone que replica visualmente el juego clásico de Hangman. ¿El código está totalmente optimiza...

4  Hangman en Java  ( Hangman in java ) 
Tengo el siguiente código en Java: HangmanFunctions Clase: import java.util.ArrayList; import java.util.Random; public class HangmanFunctions { pr...

43  La forma correcta de colgar a un hombre  ( The right way to hang a man ) 
Problema: He visto algunas preguntas sobre Hangman. Por lo general, esto se hace de una manera muy hackeable, que generalmente no se puede generalizar más. ...

12  Juego Simple de Hangman  ( Simple game of hangman ) 
En mi búsqueda para convertirse en un programador maestro, he creado un juego simple de Hangman, por lo que pensé que lo subiría aquí y vería cómo podría ser ...

3  Juego de Hangman escrito en Python 3.5  ( Hangman game written in python 3 5 ) 
Esto recopila las conjeturas del usuario para la palabra. El usuario tiene 8 conjeturas, una conjetura correcta y una suposición repetida no afecta al conteo ...

3  Hangman en bash  ( Hangman in bash ) 
reglas 7 errores permitidos. Reglas de la Hangman. descargo de responsabilidad No tengo una figura (dibujo) del Hangman, ya que este proyecto se...

8  My Hangman Game creó usando Pyqt5 y Python 3.5  ( My hangman game created using pyqt5 and python 3 5 ) 
Este es mi juego de Hangman que creé con Pyqt5 y Python 3.5 en mi máquina Windows 7. ¿Qué piensas? ¿Hay algo en lo que pueda cambiar / mejorar en términos de ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos