Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Dayleap en 20 Abril 2016, 12:35 pm



Título: ayuda: programa en lenguaje c
Publicado por: Dayleap en 20 Abril 2016, 12:35 pm
Hola a todos abrí este tema ya que necesito ayuda urgente con este programa. Estoy estudiando telecomunicaciones y me han mandado hacer el juego mastermind en lenguaje c. No estan definidas todas las funciones principales del juego aun , tan solo NivelDificultad, MENU, JugarPartida, impresionCARATULA... en fin; la duda es la siguiente: Al ejecutar la función NivelDificultad, se supone que la variable dificultad tendria que cambiar su valor de 100 por el valor que devuelve la funcion NivelDificultad. Eso lo que haíia sería que al ejecutar seguidamente JugarPartida limitar el numero de intentos que se puede jugar. Pero no lo hace, no guarda el valor devuelto con la funcion NivelDificultad. Algun consejo por favor? todos seran bien recibidos; soy nuevo en esto asi que  tener piedad  ;D :rolleyes:
Código:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>


//FUNCIONES CREADAS:

void impresionCARATULA();
void JugarPart(int dificultad, int intentos);
void Gene_Num_Aleatorios();
int NivelDificultad(int dificultad);
int MENU(int *dir_opcion, int dificultad, int control, int intentos);



int main(){
int opcion, num_adivinar[4],num_jugador,  control,  dificultad, intentos;
control=1;

impresionCARATULA();
dificultad=100;
do{

control=MENU(&opcion,  dificultad,  control, intentos);}while(control==1);


}

//CODIGO DE LAS FUNCIONES CREADAS:


void impresionCARATULA(){//imprimir la caratula intentar que sea lo mas corto posible.
int i;
int aste;
int linea=0;
do{
linea ++;
if(linea != 4){
for(aste=0; aste<80;aste ++){// LINEA DE ASTERISCOS
printf("*");}
printf("\n");}
else{
for(aste=0;aste<32;aste ++){printf("*");}printf(" MASTER MIND ");for(aste=0;aste<35;aste ++){printf("*");}printf("\n");//Linea mastermind
}}while(linea<7);}


int MENU(int *dir_opcion, int dificultad, int control, int intentos){//imprimir el menú
printf("\n1) Jugar partida \n2) Jugar partida de prueba\n3) Establecer nivel de dificultad\n4) Listar historial de partidas\n0) Salir\n\n ¿Siguiente operacion?\t");
scanf("%i", dir_opcion);

switch(*dir_opcion){
case 1:
control=1;
JugarPart(dificultad, intentos);
break;

case 2:
control=1;
break;

case 3:
control=1;
NivelDificultad( dificultad);
break;
case 4:
control=1;
printf("Has selecionado Listar historial de partidas\n");
break;
case 0:
printf("Has seleccionado Salir\n");
control=0;
break;
default:
control=1;
printf("Has seleccionado una opcion no valida\n");
break;

}return control;
}
int NivelDificultad(int dificultad){
  int c1=0;
do{
printf("Seleccione un numero de 1 a 100 para establecer el numero de intentos: \t");
  scanf("%i", & dificultad);
if(1<dificultad && dificultad<100){
printf("Has establecido numero de intentos máximo como: %i \n\n", dificultad);
c1=0;}
else{printf("Has selecionado un numero no valido\n");c1=1;}}while(c1!=0);return dificultad;}

void Gen_Num_Aleatorio_y_Comp(int adivinar[],int n){

int i;
    int bande;
    int j;
int cont;
srand (time(NULL));
do{
for(cont=0; cont<4; cont++){
adivinar[cont]=(rand() %10); //del 0 al 10
for(j=0;j<4;j ++){
for(i=j+1;j<3;i++){
if(adivinar[j]==adivinar[i]){
bande=1;

}
else continue;
}
}

}}while(bande!=1);
printf("correcto");}


void JugarPart(int dificultad, int intentos){
    printf("Has seleccionado Jugar Partida con dificultad %i \n", intentos);

do{
intentos++;
printf("2f\t", dificultad);
 }while(intentos<dificultad);
}


Título: Re: ayuda: programa en lenguaje c
Publicado por: HardForo en 20 Abril 2016, 16:56 pm
Deberias ofrecer cash $$$  ;D


EDIT: creí que era una consigna de la cátedra que hicieras el cambio pero como dices que no .... te lo resuelvo


Título: Re: ayuda: programa en lenguaje c
Publicado por: Dayleap en 20 Abril 2016, 21:07 pm
si que estoy pidiendo ayuda, te digo que no se porque falla en eso el programa no estoy pidiendo que me lo hagan , sino solamente si me pueden explicar por que no cambia la dificultad


Título: Re: ayuda: programa en lenguaje c
Publicado por: HardForo en 20 Abril 2016, 21:19 pm
Es porque nunca asignas la dificultad:

Código
  1. dificultad = NivelDificultad();

ó

Código
  1. dificultad = NivelDificultad(&dificultad)  // pasas un puntero
  2.  


De todas formas hacerlo asi digamos que es poco ortodoxo, en todo caso NivelDificultad es un setter asi que en vez de devolver el problema al main() debrias ahi mismo asignar la dificultad


Título: Re: ayuda: programa en lenguaje c
Publicado por: MAFUS en 20 Abril 2016, 22:48 pm
He reconstruido un poco el código. No he llegado a entender tus intenciones en la función Gen_Num_Aleatorio_y_Comp, parece que querías que el ordenador mismo fuera adivinando los números; pero no se ve muy claro.
Sobran muchos argumentos a las funciones, las interconexiones entre ellas son muy difusas. Además debes recordar que en C los argumentos se pasan por valor, eso es, las funciones no modifican el valor de las variables que se les pasan, a no ser que explícitamente las pases por referencia o sean arrays.

Dicho esto aquí te dejo un código un poco reconstruido que deberás completar. Para que te sea fácil retomar el hilo: el programa, a la hora de iniciar el juego, en un array de 4 elementos de tipo entero introduce 4 números aleatorios de 0 a 9. El jugador tiene tantos intentos como marca la variable dificultad para adivinar. La opción 2 del menú inicia el juego con siempre 100 intentos.

Tu deberás incluir el código en la función JugarPart en donde lo tienes marcado con un comentario.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. //FUNCIONES CREADAS:
  6.  
  7. #define ARRAY_COUNT(x) sizeof((x))/sizeof((x)[0])
  8. void impresionCARATULA();
  9. void JugarPart(int dificultad);
  10. void Gene_Num_Aleatorios(int array_numeros_aleatorios[], size_t size);
  11. int NivelDificultad();
  12. int MENU();
  13.  
  14. int main(){
  15.    // int num_jugador;
  16.    int opcion;
  17.    int dificultad = 100;
  18.  
  19.    impresionCARATULA();
  20.    do {
  21.        opcion = MENU();
  22.        switch(opcion) {
  23.    case 1:
  24.        JugarPart(dificultad);
  25.        break;
  26.    case 2:
  27.     JugarPart(100);
  28.        break;
  29.    case 3:
  30.        dificultad = NivelDificultad();
  31.        break;
  32.    case 4:
  33.        printf("Has selecionado Listar historial de partidas\n");
  34.        break;
  35.    case 0:
  36.        printf("Has seleccionado Salir\n");
  37.        opcion = 0;
  38.        break;
  39.    default:
  40.        printf("Has seleccionado una opcion no valida\n");
  41.        break;
  42. }
  43.    } while(opcion);
  44.  
  45.    return 0;
  46. }
  47.  
  48. //CODIGO DE LAS FUNCIONES CREADAS:
  49.  
  50. void impresionCARATULA() { //imprimir la caratula intentar que sea lo mas corto posible.
  51.    int i;
  52.    int linea = 0;
  53.  
  54.    do {
  55.        linea++;
  56.        if(linea != 4) {
  57.            for(i = 0; i < 80; i++) {// LINEA DE ASTERISCOS
  58.                putchar('*');
  59.            }
  60.            putchar('\n');
  61.        }
  62.        else {
  63.            for(i = 0; i < 32; i++) {
  64.                putchar('*');
  65.            }
  66.            printf(" MASTER MIND ");
  67.            for(i = 0; i < 35; i++) {
  68.                putchar('*');
  69.            }
  70.            putchar('\n');//Linea mastermind
  71.        }
  72.    } while(linea < 7);
  73. }
  74.  
  75. int MENU() { //imprimir el menú
  76. int opcion;
  77.  
  78.    putchar('\n');
  79.    puts("1) Jugar partida");
  80.    puts("2) Jugar partida de prueba");
  81.    puts("3) Establecer nivel de dificultad");
  82.    puts("4) Listar historial de partidas");
  83.    puts("0) Salir\n");
  84.    printf("   Elija opcion >> ");
  85.    scanf("%i", &opcion);
  86.  
  87.    return opcion;
  88. }
  89.  
  90. int NivelDificultad() {
  91.    int c1;
  92.    int dificultad;
  93.  
  94.    do {
  95.        printf("Seleccione un numero de 1 a 100 para establecer el numero de intentos:\t");
  96.        scanf("%i", &dificultad);
  97.        if(1 <= dificultad && dificultad <= 100) {
  98.            printf("Has establecido numero de intentos máximo como: %i\n\n", dificultad);
  99.            c1 = 0;
  100.        }
  101.        else {
  102.            puts("Has selecionado un numero no valido");
  103.            c1 = 1;
  104.        }
  105.    } while(c1);
  106.    return dificultad;
  107. }  
  108.  
  109. void Gen_Num_Aleatorio(int array_numeros_aleatorios[], size_t size) {
  110.    int i;
  111.  
  112.    srand(time(NULL));
  113.    for(i = 0; i < size; i++) {
  114.        array_numeros_aleatorios[i] = rand() % 10; //del 0 al 9
  115.    }
  116. }
  117.  
  118. void JugarPart(int dificultad) {
  119.    int numeros[4];
  120.    int i;
  121.    /* Declara aquí las variables que vayas a usar para la lógica
  122.      * del juego.
  123.      */    
  124.  
  125.  
  126.    printf("Has seleccionado Jugar Partida con dificultad %i\n", dificultad);
  127.    Gen_Num_Aleatorio(numeros, ARRAY_COUNT(numeros));
  128.    for(i = 0; i < dificultad; ++i) {
  129.     /* Inserta aquí tu lógica para que
  130.     * el jugador adivine los números
  131.     */
  132.    }
  133. }


Título: Re: ayuda: programa en lenguaje c
Publicado por: HardForo en 20 Abril 2016, 23:49 pm
Está mucho mejor!

Aun faltaría usar alguna convención en el nombre las funciones y me gustó la macro  ;-)

Código
  1. #define ARRAY_SIZE(x) sizeof((x))/sizeof((x)[0])
  2.  

Que licencia tiene ? podré usarla ?  ;)


Título: Re: ayuda: programa en lenguaje c
Publicado por: MAFUS en 20 Abril 2016, 23:58 pm
Pues esa se me ocurrió cuándo estábamos con el otro post de un problema similar XD


Título: Re: ayuda: programa en lenguaje c
Publicado por: HardForo en 21 Abril 2016, 00:00 am
Me di cuenta   :xD :laugh:


Título: Re: ayuda: programa en lenguaje c
Publicado por: Dayleap en 21 Abril 2016, 09:37 am
Muchas gracias, me habeis ayudado muchísimo! Como se puede ver en el codigo soy un novato en c jajajajaja tiene muchos fallos aun pero trabajare sobre lo que me habeis mandado 


Título: Re: ayuda: programa en lenguaje c
Publicado por: Dayleap en 21 Abril 2016, 09:40 am
He reconstruido un poco el código. No he llegado a entender tus intenciones en la función Gen_Num_Aleatorio_y_Comp, parece que querías que el ordenador mismo fuera adivinando los números; pero no se ve muy claro.
Sobran muchos argumentos a las funciones, las interconexiones entre ellas son muy difusas. Además debes recordar que en C los argumentos se pasan por valor, eso es, las funciones no modifican el valor de las variables que se les pasan, a no ser que explícitamente las pases por referencia o sean arrays.

Dicho esto aquí te dejo un código un poco reconstruido que deberás completar. Para que te sea fácil retomar el hilo: el programa, a la hora de iniciar el juego, en un array de 4 elementos de tipo entero introduce 4 números aleatorios de 0 a 9. El jugador tiene tantos intentos como marca la variable dificultad para adivinar. La opción 2 del menú inicia el juego con siempre 100 intentos.

Tu deberás incluir el código en la función JugarPart en donde lo tienes marcado con un comentario.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. //FUNCIONES CREADAS:
  6.  
  7. #define ARRAY_COUNT(x) sizeof((x))/sizeof((x)[0])
  8. void impresionCARATULA();
  9. void JugarPart(int dificultad);
  10. void Gene_Num_Aleatorios(int array_numeros_aleatorios[], size_t size);
  11. int NivelDificultad();
  12. int MENU();
  13.  
  14. int main(){
  15.    // int num_jugador;
  16.    int opcion;
  17.    int dificultad = 100;
  18.  
  19.    impresionCARATULA();
  20.    do {
  21.        opcion = MENU();
  22.        switch(opcion) {
  23.    case 1:
  24.        JugarPart(dificultad);
  25.        break;
  26.    case 2:
  27.     JugarPart(100);
  28.        break;
  29.    case 3:
  30.        dificultad = NivelDificultad();
  31.        break;
  32.    case 4:
  33.        printf("Has selecionado Listar historial de partidas\n");
  34.        break;
  35.    case 0:
  36.        printf("Has seleccionado Salir\n");
  37.        opcion = 0;
  38.        break;
  39.    default:
  40.        printf("Has seleccionado una opcion no valida\n");
  41.        break;
  42. }
  43.    } while(opcion);
  44.  
  45.    return 0;
  46. }
  47.  
  48. //CODIGO DE LAS FUNCIONES CREADAS:
  49.  
  50. void impresionCARATULA() { //imprimir la caratula intentar que sea lo mas corto posible.
  51.    int i;
  52.    int linea = 0;
  53.  
  54.    do {
  55.        linea++;
  56.        if(linea != 4) {
  57.            for(i = 0; i < 80; i++) {// LINEA DE ASTERISCOS
  58.                putchar('*');
  59.            }
  60.            putchar('\n');
  61.        }
  62.        else {
  63.            for(i = 0; i < 32; i++) {
  64.                putchar('*');
  65.            }
  66.            printf(" MASTER MIND ");
  67.            for(i = 0; i < 35; i++) {
  68.                putchar('*');
  69.            }
  70.            putchar('\n');//Linea mastermind
  71.        }
  72.    } while(linea < 7);
  73. }
  74.  
  75. int MENU() { //imprimir el menú
  76. int opcion;
  77.  
  78.    putchar('\n');
  79.    puts("1) Jugar partida");
  80.    puts("2) Jugar partida de prueba");
  81.    puts("3) Establecer nivel de dificultad");
  82.    puts("4) Listar historial de partidas");
  83.    puts("0) Salir\n");
  84.    printf("   Elija opcion >> ");
  85.    scanf("%i", &opcion);
  86.  
  87.    return opcion;
  88. }
  89.  
  90. int NivelDificultad() {
  91.    int c1;
  92.    int dificultad;
  93.  
  94.    do {
  95.        printf("Seleccione un numero de 1 a 100 para establecer el numero de intentos:\t");
  96.        scanf("%i", &dificultad);
  97.        if(1 <= dificultad && dificultad <= 100) {
  98.            printf("Has establecido numero de intentos máximo como: %i\n\n", dificultad);
  99.            c1 = 0;
  100.        }
  101.        else {
  102.            puts("Has selecionado un numero no valido");
  103.            c1 = 1;
  104.        }
  105.    } while(c1);
  106.    return dificultad;
  107. }  
  108.  
  109. void Gen_Num_Aleatorio(int array_numeros_aleatorios[], size_t size) {
  110.    int i;
  111.  
  112.    srand(time(NULL));
  113.    for(i = 0; i < size; i++) {
  114.        array_numeros_aleatorios[i] = rand() % 10; //del 0 al 9
  115.    }
  116. }
  117.  
  118. void JugarPart(int dificultad) {
  119.    int numeros[4];
  120.    int i;
  121.    /* Declara aquí las variables que vayas a usar para la lógica
  122.      * del juego.
  123.      */    
  124.  
  125.  
  126.    printf("Has seleccionado Jugar Partida con dificultad %i\n", dificultad);
  127.    Gen_Num_Aleatorio(numeros, ARRAY_COUNT(numeros));
  128.    for(i = 0; i < dificultad; ++i) {
  129.     /* Inserta aquí tu lógica para que
  130.     * el jugador adivine los números
  131.     */
  132.    }
  133. }
Muchas gracias MAFUS!
lo que hace gen_num_aleatorios era generar un numero aleatorio de 4 digitos el cual luego tendremos que adivinar


Título: Re: ayuda: programa en lenguaje c
Publicado por: Dayleap en 21 Abril 2016, 11:32 am
Ya esta solucionado el problema estaba en volver a llamar a la variable dificultad en la función. Al ser una variable global y volver a llamarla dentro de la funcion , la cual esta en un bucle do while se reinicializa con el valor 100 en vez de con el que tu le has mandado.
Código:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>


//FUNCIONES CREADAS:

void impresionCARATULA();
void JugarPart( int intentos);
void Gene_Num_Aleatorios();
int NivelDificultad();
int MENU(int *dir_opcion, int control, int intentos);
int dificultad;

int main(){
int opcion, num_adivinar[4],num_jugador,  control,  intentos;
control=1;
dificultad =100;

impresionCARATULA();

do{
printf("%i\n", dificultad);
control=MENU(&opcion,   control, intentos);}while(control==1);


}

//CODIGO DE LAS FUNCIONES CREADAS:


void impresionCARATULA(){//imprimir la caratula intentar que sea lo mas corto posible.
int i;
int aste;
int linea=0;
do{
linea ++;
if(linea != 4){
for(aste=0; aste<80;aste ++){// LINEA DE ASTERISCOS
printf("*");}
printf("\n");}
else{
for(aste=0;aste<32;aste ++){printf("*");}printf(" MASTER MIND ");for(aste=0;aste<35;aste ++){printf("*");}printf("\n");//Linea mastermind
}}while(linea<7);}


int MENU(int *dir_opcion, int control, int intentos){//imprimir el menú
printf("\n1) Jugar partida \n2) Jugar partida de prueba\n3) Establecer nivel de dificultad\n4) Listar historial de partidas\n0) Salir\n\n ¿Siguiente operacion?\t");
scanf("%i", dir_opcion);


switch(*dir_opcion){
case 1:
control=1;
JugarPart( intentos);
break;

case 2:
control=1;
break;

case 3:
control=1;
dificultad=NivelDificultad();


break;
case 4:
control=1;
printf("Has selecionado Listar historial de partidas\n");
break;
case 0:
printf("Has seleccionado Salir\n");
control=0;
break;
default:
control=1;
printf("Has seleccionado una opcion no valida\n");
break;

}return control;
}
int NivelDificultad(){
  int c1=0, d;
printf("Nivel actual");
do{
printf("Elige el nuevo nivel[1..100] \t");
  scanf(" %i",  &d);
 
if(1>d || d>100){
printf("Has selecionado un numero no valido\n");c1=1;
c1=0;}
else{printf("Has establecido numero de intentos máximo como: %i \n\n", d);}
}while(c1!=0);

return d;}

void Gen_Num_Aleatorio_y_Comp(int adivinar[],int n){

int i;
    int bande;
    int j;
int cont;
srand (time(NULL));
do{
for(cont=0; cont<4; cont++){
adivinar[cont]=(rand() %10); //del 0 al 10
for(j=0;j<4;j ++){
for(i=j+1;j<3;i++){
if(adivinar[j]==adivinar[i]){
bande=1;

}
else continue;
}
}

}}while(bande!=1);
printf("correcto");}


void JugarPart( int intentos){
    printf(" dificultad = %i\n", dificultad);
printf("Has seleccionado Jugar Partida con dificultad %i \n", intentos);

do{
intentos++;
printf("2f\t", dificultad);
 }while(intentos<dificultad);
}


Título: Re: ayuda: programa en lenguaje c
Publicado por: HardForo en 21 Abril 2016, 12:47 pm
Si son 4 digitos, cambia esta linea:

Código
  1. array_numeros_aleatorios[i] = rand() % 9000 + 1000;
  2.  

Eso genera del 1000 al 9999


Título: Re: ayuda: programa en lenguaje c
Publicado por: MAFUS en 22 Abril 2016, 00:04 am
Lo irás viendo con el tiempo pero las funciones deben ser lo más independientes posibles. Deben pasársele los datos mínimos para realizar su trabajo.
Código:
control=MENU(&opcion,   control, intentos);}while(control==1);
por ejemplo, está mal diseñada. Le pasas una variable control para que te la saque otra vez y dentro de la función ésta sirve solo para saber si debe repetir el ciclo. Esto es mucha dependencia y se debe reestructurar.
Le pasas por referencia la 'opcion' pero la usa dentro y no debe variarla. Has gastado tiempo y recursos realizando un trabajo que podría haber hecho la función sola. Y de nuevo has creado una dependencia que se podría haber evitado.
La interfaz de las funciones siempre debe ser lo más simple posible.

Por otra parte has escrito algo sin sentido
Código:
printf("2f\t", dificultad);
Supongo que es una cadena de control para mostrar el dato dificultad. El doble error que hay en ella es que querías hacer %2f, pero resulta que dificultad en un entero, no un real. Tampoco tiene sentido terminarlo en \t, a lo mejor te referirías \n. Su código debería ser
Código:
printf("%2d\n", dificultad);

Como puedes ver la lista de errores, tanto técnicos como de lógica eran muchos y opté por reescribir el código, era más rápido que enumerarlos, de esta forma podrías comparar las dos formas de hacer y que sacaras tus conclusiones al ver las diferencias entre uno y otro.