rust-code01

 avatar
unknown
rust
2 years ago
8.4 kB
4
Indexable
const MINA: &str = "*";
const ESPACIO_SIN_ABRIR: &str = ".";
const ESPACIO_ABIERTO: &str = "-";
const LETRAS: &str = "ABCDEF";
const FILAS: i32 = LETRAS.len();
const COLUMNAS: i32 = 6;
static mut tablero : Vec<i32> = Vec::new();
const HA_GANADO: bool = false;
const HA_PERDIDO: bool = false;


fn inicializar_tablero(){
   
    let mut tablero : Vec<i32> = Vec::new();
    /*
    Rellena el tablero
    */
    for fila in (0..FILAS){
        tablero.push([]);
        for columna in 0..COLUMNAS{
            tablero[fila].push(ESPACIO_SIN_ABRIR);
        }
    }
}    


fn numero_a_letra(numero: i32) -> String{
    /*
    Convierte el número (comenzando en 0) a la letra
    */
    return LETRAS[numero];
}

fn index(x: &str) -> i32{
    if (x == 'a' || x == 'A'){
        return 0;
    }else if (x == 'b' || x == 'B'){
        return 1;
    }else if(x == 'c' || x == 'C') {
        return 2;
    }else if(x == 'd' || x == 'D') {
        return 3;
    }else if(x == 'e' || x == 'E') {
        return 4;
    }else if(x == 'f' || x == 'F') {
        return 5;
    }else if(x == 'g' || x == 'G') {
        return 6;
    }else if(x == 'h' || x == 'H') {
        return 7;
    }else if(x == 'i' || x == 'I') {
        return 8;
    }else if(x == 'j' || x == 'J') {
        return 9;}
}

fn letra_a_numero(letra: &str) -> i32{
    /*
    Devuelve el número que le corresponde a la letra COMENZANDO EN 0. Por ejemplo
    A: 0
    B: 1
    
    Nota: si en algún momento se deseara que el tablero fuera más grande, solo sería cuestión de agregar más letras a la cadena"""
    */
    let numero: i32 = LETRAS.index(letra);
    return numero;
}    


fn obtener_indices_a_partir_de_coordenadas(coordenadas: &str) -> i32{

    /*
    Devuelve, a partir de una coordenada como A1, las coordenadas
    reales de la matriz; es decir, los índices. Por ejemplo, para
    A1 devolvería [0, 0]
    */
    let letra: String = coordenadas[0:1];
    let fila: i32 = letra_a_numero(letra);
    let columna: i32 = int(coordenadas[1:2]) - 1;
    return fila, columna;
}  


fn colocar_minas_en_tablero(posiciones: i32){

    let mut tablero : Vec<i32> = new Vec::new();

      for posicion in 0..posiciones:
        let fila: i32 = obtener_indices_a_partir_de_coordenadas(posicion);
        let columna: i32 = obtener_indices_a_partir_de_coordenadas(posicion);
        tablero[fila][columna] = MINA;
}  


fn iniciar_tablero_con_string(posiciones_string: &vec<String>) -> i32{

    // Convertimos a mayúscula para que podamos comparar de mejor manera"""

    let mut posiciones_string: String = posiciones_string.upper();
    let mut posiciones_separadas : Vec<i32> = new Vec::new();

    let primera_posicion: &i32 = &posiciones_string[2]; //"""posiciones_string[0:2];"""
    let segunda_posicion: &i32 = &posiciones_string[4]; //"""posiciones_string[2:4];"""
    let tercera_posicion: &i32= &posiciones_string[6];  //"""posiciones_string[4:6];"""

    if !primera_posicion in 0..posiciones_separadas:
        posiciones_separadas.push(primera_posicion);
    if !segunda_posicion in 0..posiciones_separadas:
        posiciones_separadas.push(segunda_posicion);
    if !tercera_posicion in 0..posiciones_separadas:
        posiciones_separadas.push(tercera_posicion);

    colocar_minas_en_tablero(posiciones_separadas);
}  


fn obtener_minas_cercanas(fila: i32, columna: i32) -> String{

    let conteo: i32 = 0;
    let mut tablero : Vec<i32> = new Vec::new();

    if fila <= 0:
        let fila_inicio: i32 = 0;
    else:
        let fila_inicio: i32 = fila - 1;


    if fila + 1 >= FILAS:
        let fila_fin: i32 = FILAS - 1;
    else:
        let fila_fin: i32 = fila + 1;


    if columna <= 0:
        let columna_inicio: i32 = 0;
    else:
        let columna_inicio: i32 = columna - 1;



    if columna + 1 >= COLUMNAS:
        let columna_fin: i32 = COLUMNAS - 1;
    else:
        let columna_fin: i32 = columna + 1;



    for f in fila_inicio..fila_fin + 1:
        for c in columna_inicio..columna_fin + 1:
            //""" Si es la central, la omitimos"""
            if f == fila && c == columna:
                ...continue;

            if tablero[f][c] == MINA:
                conteo += 1;

    let conteoS: String = conteo.to_string();

    return conteoS;
}
   

fn imprimir_tablero() -> String{

    println!("");
    let ultima_casilla: bool = false;
    //""" Imprimir esquina superior izquierda"""
    println!("  ", end="");


    //""" Imprimir resto de encabezado"""
    let columna: i32;    
    for columna in 0..COLUMNAS:        
        println!(let columnaS: Strig = (columna + 1).to_string(), end=" ");
        //""" Salto de línea"""
    println!("");

    //""" Imprimir contenido..."""
    let numero_fila: i32 = 0;
    let mut tablero : Vec<i32> = new Vec::new();

    for fila in 0..tablero:
        let letra: String = numero_a_letra(numero_fila);
        println!(letra, end=" ");
        for (numero_columna, dato) in 0..fila.enumerate():
        """El tablero tiene los verdaderos datos, pero nosotros imprimimos otros para que el usuario no "descubra" lo que hay debajo"""
            let verdadero_dato: Strig = "";
            let dato: Strig;
            let numero_fila : Strig;
            let numero_columna: String;

            if dato == MINA:
                if HA_GANADO || HA_PERDIDO:
                    verdadero_dato = MINA;
                else:
                    verdadero_dato = ESPACIO_SIN_ABRIR:
            else if dato == ESPACIO_ABIERTO:
                verdadero_dato = obtener_minas_cercanas(numero_fila, numero_columna);
            else if dato == ESPACIO_SIN_ABRIR:
                verdadero_dato = ".";

            println!(verdadero_dato, end=" ");
        println!("");
        numero_fila += 1;

    if HA_GANADO:
        println!("GANASTE");
    else if HA_PERDIDO:
        println!("PERDISTE");
}  

fn abrir_casilla(coordenadas: &str) -> bool{

    let mut tablero : Vec<i32> = new Vec::new();

    let fila: i32 = obtener_indices_a_partir_de_coordenadas(coordenadas);
    let columna: i32 = obtener_indices_a_partir_de_coordenadas(coordenadas);

    """ Qué había en la casilla?"""
    let mut elemento_actual: Vec<i32> = tablero[fila][columna];
    """ Si hay una mina, pierde y ya no se modifica nada"""
    if elemento_actual == MINA:
        HA_PERDIDO = true;
        return;

        """ Si es un elemento sin abri, lo abre"""
    if elemento_actual == ESPACIO_SIN_ABRIR:
        tablero[fila][columna] = ESPACIO_ABIERTO;
        """ Comprobamos si hay casillas sin abrir"""
    if no_hay_casillas_sin_abrir():
        HA_GANADO = true;
}

fn no_hay_casillas_sin_abrir() -> bool{

    let mut tablero : Vec<i32> = new Vec::new();    
    let fila: i32;
    let columna: i32;

    for fila in 0..tablero:
        for columna in 0..fila:
            if columna == ESPACIO_SIN_ABRIR:
                return false;
    return true;
}

fn solicitar_coordenadas() -> String{

    let coordenadas: String;
    while true:
    coordenadas = input("Ingresa el string con las posiciones de las minas: ");
    if coordenadas.len() == COLUMNAS:
        return coordenadas;
    else:
        println!("Coordenadas no válidas. Intenta de nuevo");
}  


fn solicitar_casilla() -> String{

    let casilla: String;

    while true:
        casilla = input("Ingresa la casilla del tablero que quieres abrir: ")
        casilla = casilla.upper();

        if casilla.len() != 2:
            println!("Debes introducir una letra y un número");
            ...continue;
        if !casilla[0].is_alphabetic():
            println!("El primer valor debe ser una letra");
            ...continue;
        if !casilla[1].is_digit():
            println!("El segundo valor debe ser un número");
            ...continue;
        if !casilla[0] in 0..LETRAS:
            println!("La letra debe estar en el rango " + LETRAS);
            ...continue;
        if (casilla[1]).parse().unwrap() <= 0 || (casilla[1]).parse().unwrap() > COLUMNAS:
            println!("El número debe estar en el rango 1-{COLUMNAS}");
            ...continue;
        return casilla;

}

fn main(){

    inicializar_tablero();
    let coordenadas: String = solicitar_coordenadas();
    iniciar_tablero_con_string(coordenadas);
    imprimir_tablero();

    while !HA_PERDIDO && !HA_GANADO:
        let casilla: String = solicitar_casilla();
        abrir_casilla(casilla);
        imprimir_tablero();
}
Editor is loading...