Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TP7_ej10 #88

Open
santiagofp05 opened this issue Oct 5, 2024 · 1 comment
Open

TP7_ej10 #88

santiagofp05 opened this issue Oct 5, 2024 · 1 comment

Comments

@santiagofp05
Copy link

Hola, hice el ejercicio 10 del ahorcado y quería consultar si es eficiente y esta bien. Muchas gracias

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../Biblioteca/random.h"
#define DIM 15

int Jugar(char *palabra); //devuelve 1 si adivino y 0 si no
void leerCaracter(char *palabra, char *palabrausuario, int *intentos, int *gano);
void Controlar(char *palabra, char *palabrausuario, char letra, int *intentos);

int
main(void) {
    int aux, longitud;
    randomize();
    char *Palabras[]= {"murcielago", "carretera", "computadora", "bicicleta", "revolucion", "bicicleta", "marinero", "astronauta", "ventilador", "cangrejo", "invernadero", "palangana", "electricidad", "ferrocarril", "dinosaurio"};
    aux = randInt(0, DIM-1);
    longitud = strlen(Palabras[aux]);
    printf("Debes adivinar una palabra de %d letras y tiene 7 intentos\n", longitud);
    if (Jugar(Palabras[aux]) == 1) {
        printf("Adivinaste la palabra!!\n");
    }
    else {
        printf("Lo siento, la palabra era: ");
        for(int i=0; Palabras[aux][i] != 0; i++) {
            printf("%c", Palabras[aux][i]);
        }
    }
}

int Jugar(char *palabra) {
    char *palabrauser;
    int longitudpalabra;
    int valor = 7, valor1 = 0; //1 intento la cabeza, 1 el cuerpo, 2 las manos, 2 las piernas, 1 la cuerda
    int *intentos = &valor;
    int *gano = &valor1;
    longitudpalabra = strlen(palabra);
    palabrauser = malloc((longitudpalabra+1) * sizeof(char));
    for(int i=0; i<longitudpalabra; i++) {
        palabrauser[i] = '_';
    }
    palabrauser[longitudpalabra]='\0';
    while(*intentos > 0 && *gano == 0) {
        leerCaracter(palabra, palabrauser, intentos, gano);
    }
    return *gano;

}
void leerCaracter(char *palabra, char *palabrausuario, int *intentos, int *gano) {
    char c;
    do {
    *gano=1;
        printf("Ingrese una letra: ");
        while ((c = getchar()) != '\n' && *intentos>0) {
            if(toupper(c) < 'A' || toupper(c) > 'Z') {
                printf("El caracter ingresado no es una letra\n");
            }
            else {
                Controlar(palabra,palabrausuario,c, intentos);
            }
            for (int i=0; palabrausuario[i] != '\0' && *gano == 1; i++) {
                if (palabrausuario[i] == '_') {
                    *gano = 0;
                }
            }
        }
    } while (*intentos > 0 && *gano == 0);
}
void Controlar(char *palabra, char *palabrausuario, char letra, int *intentos) {
    int coincide=0;
    for (int i = 0; palabra[i] != '\0' ; ++i) {
        if (palabra[i] == letra) {
            palabrausuario[i] = letra;
            coincide++;
        }
    }
    if (coincide>0) {
        printf("La letra %c aparece %d veces y queda asi: ",letra, coincide);
        for (int i=0; palabrausuario[i] != 0; i++) {
            printf("%c", palabrausuario[i]);
        }
        printf("\n");
        return;
    }
    *intentos=*intentos-1;
    printf("La letra no aparece y le quedan %d intentos\n", *intentos);
}
@marcelogarberoglio
Copy link
Member

En general está bien. Algunos comentarios

¿Por qué no usaste printf con %s en vez de hacer este ciclo?
for(int i=0; Palabras[aux][i] != 0; i++) {
printf("%c", Palabras[aux][i]);
}

En jugar definís el puntero intentos para poder pasarle a la función leerCaracter el valor izquierdo de la variable valor, podrías pasar directamente &valor, no es necesario crear el puntero

Usar isalpha en vez de if(toupper(c) < 'A' || toupper(c) > 'Z') {

leerCaracter hace cosas de front (leer una letra) pero también controla la palabra y marca si ya salió o no. Tendría que haber una función que lea y otra que controle, y que en vez de ser void y retornar por parámetro de salida si ganó sea int (como comentamos en la revisión del parcial)

Controlar también mezcla front con back, y por convención debería llamarse controlar en vez de Controlar

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants