|
Ver temas sin respuesta | Ver temas activos
Foros Linux » Desarrollo » Programación
Página 1 de 1
|
[ 14 mensajes ] |
|
| Autor |
Mensaje |
Kernl

Forista Nuevo
Registrado: Mar Ene 17, 2012 11:52 am Mensajes: 21 Ubicación: Galicia,España
|
 Publicado: Jue Ene 19, 2012 12:47 pm |
|
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
|
|
|
|
 |
mcun

Moderador
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)
|
 Publicado: Jue Ene 19, 2012 1:02 pm |
|
|
|
 |
Kernl

Forista Nuevo
Registrado: Mar Ene 17, 2012 11:52 am Mensajes: 21 Ubicación: Galicia,España
|
 Publicado: Jue Ene 19, 2012 1:14 pm |
|
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
|
|
|
|
 |
hipersayan_x

Forista Distinguido
Registrado: Jue Abr 26, 2007 11:00 pm Mensajes: 1426
|
 Publicado: Jue Ene 19, 2012 2:43 pm |
|
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
|
|
|
|
 |
akodo

Moderador
Registrado: Mié Nov 28, 2007 12:00 am Mensajes: 1361 Ubicación: En la X del explorer (pulse para llamar)
|
 Publicado: Jue Ene 19, 2012 3:47 pm |
|
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)
|
|
|
|
 |
Kernl

Forista Nuevo
Registrado: Mar Ene 17, 2012 11:52 am Mensajes: 21 Ubicación: Galicia,España
|
 Publicado: Sab Ene 21, 2012 3:46 am |
|
|
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
|
|
|
|
 |
mcun

Moderador
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)
|
 Publicado: Sab Ene 21, 2012 8:39 am |
|
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
|
|
|
|
 |
akodo

Moderador
Registrado: Mié Nov 28, 2007 12:00 am Mensajes: 1361 Ubicación: En la X del explorer (pulse para llamar)
|
 Publicado: Sab Ene 21, 2012 3:32 pm |
|
|
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)
|
|
|
|
 |
Kernl

Forista Nuevo
Registrado: Mar Ene 17, 2012 11:52 am Mensajes: 21 Ubicación: Galicia,España
|
 Publicado: Dom Ene 22, 2012 4:13 am |
|
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
|
|
|
|
 |
hipersayan_x

Forista Distinguido
Registrado: Jue Abr 26, 2007 11:00 pm Mensajes: 1426
|
 Publicado: Dom Ene 22, 2012 8:36 am |
|
|
|
 |
Kernl

Forista Nuevo
Registrado: Mar Ene 17, 2012 11:52 am Mensajes: 21 Ubicación: Galicia,España
|
 Publicado: Mar Ene 24, 2012 12:14 pm |
|
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
|
|
|
|
 |
hipersayan_x

Forista Distinguido
Registrado: Jue Abr 26, 2007 11:00 pm Mensajes: 1426
|
 Publicado: Mar Ene 24, 2012 1:48 pm |
|
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
|
|
|
|
 |
Kernl

Forista Nuevo
Registrado: Mar Ene 17, 2012 11:52 am Mensajes: 21 Ubicación: Galicia,España
|
 Publicado: Mié Ene 25, 2012 10:38 am |
|
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
|
|
|
|
 |
hipersayan_x

Forista Distinguido
Registrado: Jue Abr 26, 2007 11:00 pm Mensajes: 1426
|
 Publicado: Mié Ene 25, 2012 10:59 am |
|
A mí sí. Este es el ejemplo completo: ahorcado.cCó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
|
|
|
|
 |
|
|
|
Página 1 de 1
|
[ 14 mensajes ] |
|
¿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
|
|