Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 14 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mar Ene 17, 2012 11:52 am
Mensajes: 21
Ubicación: Galicia,España

Nota Publicado: Jue Ene 19, 2012 12:47 pm 
Arriba  
Mi profesora me mandó hacer el juego del ahorcado en C pero me quedé estancado y ella no me quiere decir el fallo,a ver si alguien me pueda echar una cable que me estoy desesperando ya porque lo tengo que entregar y no sé hacerlo :( Además lo tengo que hacer con lo más básico de todo porque no hemos dado más...como mucho for,while,srand(para numeros aleatorios) y arrays bidimensionales como mucho...

Aquí os dejo mi código:
Código:
/*Juego del ahorcado en C*/
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# define f 6
# define c 10
int main ()
{
    char frase[f][c],letra,palabra[f][c]={"perro","gato","ordenador","pizarra","lapiz","carpeta"};
    int cont,intentos=6,fallos=0,i,j,aciertos=0;
   
    printf("BIENVENIDO AL JUEGO DEL AHORCADO\n");           
   
           
    printf ("Tienes 6 intentos \n");
   

    srand(time(NULL));   
    palabra = rand() % f; /*Seleccionamos una palabra aleatoria*/
 
    /*hay que escribir tantos guiones como letras haya*/
    for(i=0;i<26;i++){
                        frase[f][c]=0;}
    for(i=0;palabra!='\0';i++){
                        j=palabra-97;
                        frase[f][c]++;}
    for(i=0;i<26;i++){
             letra=i+97;
             printf("%c %c \n",letra,frase[f][c]; } /*aquí se tienen que escribir los guiones*/
                       
             for(cont=0;cont<=frase[f][c];cont++) {
                       printf ("_\t");}
           
    for (cont=0;cont<6;cont++) {
               printf ("Introduce letra: \n");
               fflush(stdin);
               scanf ("%c",&letra); } /*leemos la letra introducida*/           
               
    for (cont=0;cont<7;cont++) {
        if (letra==frase[i][j]) { aciertos++; }
        else { fallos=fallos+1 } }
       
        if (fallos==0) { printf ("¡ Enhorabuena !\n"); }
        if (fallos==1) { printf (" __ \n");}
        if (fallos==2) { printf ("_|_\n");}
        if (fallos==3) { printf ("  _ _\n");
                         printf ("  | \n");
                         printf ("  | \n");
                         printf (" _|_  \n");}
        if (fallos==4) { printf ("  __ \n");
                         printf (" |  | \n");
                         printf (" | \n");
                         printf ("_|_ \n"); }
         
        if (fallos==5) { printf (" __ \n");
                         printf ("|  |\n");
                         printf ("|  o \n");
                         printf ("|  | \n");
                         printf("_|_   \n"); }
                                 
        if (fallos==6) { printf ("  _ _ \n");
                         printf (" |   | \n");
                         printf (" |   o \n");
                         printf (" |   | \n");
                         printf ("_|_ /|\ \n") ; }
                                           
                       
    printf ("La palabra es: %c \n",palabra);                   
 
   
    system ("PAUSE");
    return 0;
}

_________________
Usuario Ubuntu 11.10
Usuario Linux:547941

 Perfil Email  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Dom Abr 18, 2010 4:30 pm
Mensajes: 2790
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)

Nota Publicado: Jue Ene 19, 2012 1:02 pm 
Arriba  
pero con lo que te dio ya deberías poder hacerlo ... digamos el juego solo precisa de una variable y un condicional ...

_________________
... reinstalar un SO cuando produce un error es como tirar un bebe a la basura cuando se hace caca..

Trusted Network and Developer | Reglamento General de los Foros |WIKI-EL | Twitter @SISIAM
Debian| ArchLinux |Linux User #508809

 Perfil WWW  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mar Ene 17, 2012 11:52 am
Mensajes: 21
Ubicación: Galicia,España

Nota Publicado: Jue Ene 19, 2012 1:14 pm 
Arriba  
mcun escribió:
pero con lo que te dio ya deberías poder hacerlo ... digamos el juego solo precisa de una variable y un condicional ...

pues no soy capaz de seguir llevo toda la tarde y estoy bloqueado :@

_________________
Usuario Ubuntu 11.10
Usuario Linux:547941

 Perfil Email  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Jue Abr 26, 2007 11:00 pm
Mensajes: 1426

Nota Publicado: Jue Ene 19, 2012 2:43 pm 
Arriba  
Ya desde el comienzo tenes un error grave:

Código:
// Declaraste "palabra" como un array de cadenas,
char frase[f][c],letra,palabra[f][c]={"perro","gato","ordenador","pizarra","lapiz","carpeta"};

// ...

// Pero le estás pasando un entero a la variable.
palabra = rand() % f; /*Seleccionamos una palabra aleatoria*/

// En todo caso sería algo como:
char *p  = palabra[rand() % f]; // Donde "p" es la palabra que debe adivinar el usuario.


Te dejo el seudocódigo, estoy un poco vago para escribir en C :| :

Código:
Inicializar ListaDePalabras

// palabra y palabraParaMostrar tienen que tener el mismo largo.
palabra[MAXLEN] <- ListaDePalabras[RAND] // strcpy()
palabraParaMostrar[MAXLEN] <- memset('_')

while letra <- getch() // Leer la entrada del usuario.
    indice <- BuscarIndice(palabra, letra) // strchr()

    if (letra en palabra) // ¿Está la letra dentro de la palabra? indice > -1, o algo por el estilo.
        palabraParaMostrar[indice] = letra;

    printf(palabraParaMostrar)
    HacerDibujitoDelAhorcado()

Fin

_________________
"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."

"Finibus Bonorum Et Malorum", Cicerón

 Perfil WWW  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 12:00 am
Mensajes: 1361
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Jue Ene 19, 2012 3:47 pm 
Arriba  
Para la próxima vez que pidas ayuda en cualquier foro/sitio de programación siempre ayuda que pongas los errores que aparecen y/o la salida del programa, tanto la errónea como la que debería salir. Así no tenemos que revisar todo el código ni tenemos que averiguar qué falla, más si cabe cuando (yo ahora mismo) no tenemos un compilador al lado.

Dicho eso, vamos al tema:
Código:
palabra = rand() % f; /*Seleccionamos una palabra aleatoria*/

Se supone que "palabra" contiene una lista de palabras (perro, gato, ordenador, etc), y le estás asignando un valor numérico. Además, si no me equivoco, "rand()" devuelve un valor entre 0 y 1, u no creo que tenga sentido calcular el módulo de ese número.

Código:
for(i=0;i<26;i++){
                        frase[f][c]=0;}

Este es otro despropósito grave: "frase[f][c]" se supone que debería tener carateres y no valores númericos (como el que estás asignando). Suponiendo que se pueda asignar valores de esa forma (no estoy seguro) estás asignando siempre el mismo valor a la misma variable porque no estás utilizando el índice del bucle para nada. De hecho, un compilador bueno quitaría el bucle y dejaría simplemente la asignación.

Código:
for(i=0;palabra!='\0';i++){
                        j=palabra-97;
                        frase[f][c]++;}

Apostaría a que aquí tienes un bucle infinito en un 99.99% de los casos. "palabra" es un array (y estoy simplificando mucho las cosas) y lo quieres comparar como si fuera un único caracter. No modificas la variable "palabra" para nada dentro del bucle, con lo que es seguro que te metes en un bucle infinito. "frase[f][c]++" no lo veo sentido cuando lo tienes definido como char.

Código:
for(cont=0;cont<=frase[f][c];cont++) {
                       printf ("_\t");}

Aquí estás comparando valores enteros con caracteres.

Código:
for (cont=0;cont<6;cont++) {
               printf ("Introduce letra: \n");
               fflush(stdin);
               scanf ("%c",&letra); } /*leemos la letra introducida*/

El "fflush(stdin)" es muy mala práctica en sistema unix, y tan sólo funciona en windows (busca alternativas para hacer eso). Además pides 6 letras que las escribes en la misma variable, y dudo que la aplicación las tenga que pedir seguidas sin dar tiempo a ver resultados.

Código:
for (cont=0;cont<7;cont++) {
        if (letra==frase[i][j]) { aciertos++; }
        else { fallos=fallos+1 } }

Comparas siempre los mismos valores porque ni "i" ni "j" se modifican en el bucle (que a saber qué valores tienen). Además en el bucle anterior tienes como condición "cont<6" y ahora "cont<7" lo que me resulta muy extraño.

Código:
system ("PAUSE");

Esto es exclusivo de windows, así que ya lo puedes ir quitando.

Adicionalmente, parece que has estado utilizando "f" y"c" como variables cuando son constantes. Mi recomendación es que cuando definas constantes utilices MAYUSCULAS ya que es práctica habitual en todos los lenguajes.

Por cierto, me extraña que hagas este ejercicio y no utilices funciones. Si te han enseñado a hacer funciones ya puedes ir haciendo unas cuantas porque sino causa muy mala impresión. Además te ayuda a plantear mejor el código.
Te doy unos cuantos nombres (la implementación corre por tu cuenta)
Código:
char* getRandomWord(){....}  //devuelve una palabra aleatoria
void fillWordToPrint(char* randomWord, char* fillingWord, char value){...}  //sustituye los caracteres "no imprimibles" (_) por el caracter que se le pasa en función de la palabra.
/*
randomWord = ordenador
fillingWord = _________
value = r
resultado -> fillingWord = _r______r
*/
void printHangman(int fails){....}  //muestra por pantalla el monigote en base al número de fallos

_________________
Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mar Ene 17, 2012 11:52 am
Mensajes: 21
Ubicación: Galicia,España

Nota Publicado: Sab Ene 21, 2012 3:46 am 
Arriba  
Hasta ahora no hemos dados funciones,lo más "difícil" que me han explicado ha sido las matrices bidimensionales y "case",que en este ejercicio no lo veo necesario.

Muchas gracias a todos por ayudarme

Editado -- Sab Ene 21, 2012 9:46 am --

Lo que sigue sin salirme es poner tantos guiones bajos como letras haya,es decir,si la palabra tiene 5 letras,poner 5 guiones bajos

_________________
Usuario Ubuntu 11.10
Usuario Linux:547941

 Perfil Email  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Dom Abr 18, 2010 4:30 pm
Mensajes: 2790
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)

Nota Publicado: Sab Ene 21, 2012 8:39 am 
Arriba  
Kernl escribió:

Lo que sigue sin salirme es poner tantos guiones bajos como letras haya,es decir,si la palabra tiene 5 letras,poner 5 guiones bajos


eso lo haces con for ;) es un contador de lo mas sencillo, debes iterar por el array osea la palabra y luego imprimir un guion bajo por cada iteración eso lo haces con for

_________________
... reinstalar un SO cuando produce un error es como tirar un bebe a la basura cuando se hace caca..

Trusted Network and Developer | Reglamento General de los Foros |WIKI-EL | Twitter @SISIAM
Debian| ArchLinux |Linux User #508809

 Perfil WWW  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 12:00 am
Mensajes: 1361
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Sab Ene 21, 2012 3:32 pm 
Arriba  
Añadir a lo que ha dicho mcun que la condición de finalización del bucle debe ser que el caracter que estás extrayendo del array es '\0' (que indica el final de la cadena)

_________________
Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mar Ene 17, 2012 11:52 am
Mensajes: 21
Ubicación: Galicia,España

Nota Publicado: Dom Ene 22, 2012 4:13 am 
Arriba  
Una cosa,cuando lo quiero compilar en Code Blocks en la consola me aparece lo siguiente:

Citar:
sh:_ _ _ _ _ : Permission denied
Process returned 126(0x7E) execution tiem: 0.002s
Press ENTER to continue.


que quiere decir? no me marca los errores de sintaxis.Es la primera vez que utilizo este compilador y no sé que pasa

_________________
Usuario Ubuntu 11.10
Usuario Linux:547941

 Perfil Email  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Jue Abr 26, 2007 11:00 pm
Mensajes: 1426

Nota Publicado: Dom Ene 22, 2012 8:36 am 
Arriba  
Ese error pueden ser varias cosas, que no hayas configurado correctamente el proyecto, que no hayas puesto el nombre correcto al archivo de código fuente, que hayas querido compilar directamente el archivo sin crear un proyecto, etc., te dejo unos enlaces:

http://www.codeblocks.org/docs/manual_en.pdf
http://stackoverflow.com/questions/3788 ... -ubuntu-10
http://ubuntuforums.org/showthread.php?t=992403

_________________
"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."

"Finibus Bonorum Et Malorum", Cicerón

 Perfil WWW  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mar Ene 17, 2012 11:52 am
Mensajes: 21
Ubicación: Galicia,España

Nota Publicado: Mar Ene 24, 2012 12:14 pm 
Arriba  
Por favor necesito que me expliquéis una cosa de ese juego,¿me podeis decir cómo selecciono una palabra aleatoria del array palabras[F][C]?

aquí os dejo un trozo de código

Código:
char palabra[F][C]={"perro","gato","ordenador","pizarra","lapiz","carpeta"};
   

    srand(time(NULL));   
        palabra = rand() % F; /*Seleccionamos una palabra aleatoria*/
       
    printf ("%s",palabra[F][C]);


gracias de antemano y perdón por las molestias pero es que está costando mucho más de lo que pensaba...

_________________
Usuario Ubuntu 11.10
Usuario Linux:547941

 Perfil Email  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Jue Abr 26, 2007 11:00 pm
Mensajes: 1426

Nota Publicado: Mar Ene 24, 2012 1:48 pm 
Arriba  
Código:
#define NPALABRAS 6 /* Esto se escribe después de #include y antes que main() */

char *palabras[] = {"perro","gato","ordenador","pizarra","lapiz","carpeta"};

srand(time(NULL));
palabra = rand() % NPALABRAS;
printf ("%s", palabras[palabra]); /* "palabra" es el indice de una palabra dentro de "palabras" */

_________________
"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."

"Finibus Bonorum Et Malorum", Cicerón

 Perfil WWW  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mar Ene 17, 2012 11:52 am
Mensajes: 21
Ubicación: Galicia,España

Nota Publicado: Mié Ene 25, 2012 10:38 am 
Arriba  
hipersayan_x escribió:
Código:
#define NPALABRAS 6 /* Esto se escribe después de #include y antes que main() */

char *palabras[] = {"perro","gato","ordenador","pizarra","lapiz","carpeta"};

srand(time(NULL));
palabra = rand() % NPALABRAS;
printf ("%s", palabras[palabra]); /* "palabra" es el indice de una palabra dentro de "palabras" */

¿A ti te funciona este código? porque a mi no :S

_________________
Usuario Ubuntu 11.10
Usuario Linux:547941

 Perfil Email  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Jue Abr 26, 2007 11:00 pm
Mensajes: 1426

Nota Publicado: Mié Ene 25, 2012 10:59 am 
Arriba  
A mí sí. Este es el ejemplo completo:

ahorcado.c

Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NPALABRAS

int main()
{
    int palabra;
    char *palabras[] = {"perro","gato","ordenador","pizarra","lapiz","carpeta"};

    srand(time(NULL));
    palabra = rand() % NPALABRAS;
    printf ("%s\n", palabras[palabra]);

    return 0;
}


Y para compilarlo y ejecutarlo desde una consola:

Código:
gcc -o ahorcado ahorcado.c
./ahorcado

_________________
"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."

"Finibus Bonorum Et Malorum", Cicerón

 Perfil WWW  
Mostrar mensajes previos:  Ordenar por  
 [ 14 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC - 6 horas
Traducción al español por Huan Manwë
phpBB SEO