Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Dayleap

#11
 ; esto forma parte de un programa mayor ; el porblema esta en que cuando lo ejecuto y le introduzco por teclado un valor tal que resp pasa a ser igual a ... por ejemplo '3f', es decir: resp[0]=3 resp[1]=f entonces me deberia de volver a pedir que escoja un nuevo nivel de dificultad pero no lo hace. Lo que hace es retornarme la parte entera del array y , si no tiene parte entera me devuelve un 0; LO QUE QUIERO QUE HAGA ES QUE SI INTRODUZCO UN CARACTER ME LO DETECTE Y ME DIGA QUE VUELVA A INTRODUCIR LA DIFICULTAD. MUCHAS GRACIAS  ;D
int main(){
int control=0,n,i,dif;
char resp[4];
printf("Nivel actual %i \n", dificultad);

do{
printf("Elige el nuevo nivel[1..100]: \n");
fflush(stdin);
scanf(" %s",  &resp);

n=strlen(resp);          //COMPROBACIONES
if(n<1||n>=4){control=1;}

for(i=0;i<n;i++){   //letras
if(resp[i]<'0'&& resp[i]>'9'){
control=2;}}
switch(control){
case 1:
printf("\nHas seleccionado un n\243mero no v\240lido\n\n");break;
case 2:
printf("El numero ha de contener solo digitos\n");break;
case 0:
dif=atoi(resp);
if(dif>=1&&dif<=100){
printf("\nHas establecido numero de intentos máximo como: %i \n\n", dif);control=0;}
else{printf("\nHas establecido un n\243mero no v\240lido\n\n");
control==1;
}
}
}while(control==3 || control==2 || control==1);
return 0;}
#12
Si , tambien funciona eso que dices. El tema es que tenia un controlador porque tenia que cumplir muchas mas condiciones al final entonces cree la variable tipo int controlador y cuando sea igual a 1 acaba el bucle
#13
Gracias MAFUS intentare volver a escribirlo desde el principio a ver si corrigo el fallo  muchas gracias por contestar, publicare si soy capaz de corregir algo el codigo o no




Cita de: MAFUS en 28 Abril 2016, 21:36 PM
Bueno, vamos con unos pocos fallos, los más fáciles:

Controla las asignaciones porqué lo que haces es mirar igualdad:
donde escribes j==4 e intentos==100
debe haber j=4 e intentos=100

Tienes un fallo en scanf: el nombre de un array ya es un puntero.
donde escribes scanf("%s", &resp)
debes haber scanf("%s", resp)

Para contar el número de asteriscos, barras verticales y barras bajas en cada iteración estos deben empezar a contar a partir de 0. Así después de do{ debe haber
asteriscos=0, barras=0, bajas=0;

Para el problema de lógica: sea cual sea lo que ha ocurrido acabas haciendo que j=4 y por tanto se detiene ese bucle y por tanto siempre comparas cad==resp[0]. Hay que reescribir eso totalmente.

Bueno, el fallo estaba en donde inicializaba las variables asteriscos, baras y bajas al cambiarlo y pornerlo dentro del do{}while ya funciona correctamente sacando una pequeña cosa que no se como hacer para que pare de ejecutarse el bucle ya que solo para cuando el numero de intentos es igual a 100


MOD EDIT: NO hacer doble post.
#14
Hola buenas, os pido ayuda con este programa. Lo que quiero es ordenar unos caracteres de tal manera que primero se impriman '*' , luego '|' y final mente' _ '. Para eso tiene que  comparar un array predefinido con valor= 1234 , con otro que introducimos por teclado. Si estos dos son iguales el programa para de ejecutarse; sino sigue. Si el valor es correcto ha de escribir ****. Si un numero esta escrito en el array pero esta en una posicion incorrecta | y si no esta en el array una _. Por ejemplo : introducimos 1245 y nos devuelve **|_ , otro ejemplo; introducimos 3524 y devuelve *||_
Muchas gracias!!Y tened paciencia por favor , soy nuevo en programacion.

ADEMAS si no fuera mucho pedir podriais decirme a que se debe este fallo en concreto:

si escribimos cualquier numero mayor de 4 lo da por bueno, cuando deberia de escribir una barra baja ya que en el array solo hay numeros  menores de 4.

#include<stdio.h>
#include<time.h>
#include<ctype.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>

int main (){
char cad[5]="1234";
char resp[5];
char resul[5];
char correc[5]="****";
int asteriscos=0, barras=0, bajas=0, intentos=0, controlador=0,i,j,k,q;
  do{
 
 
intentos ++;
printf("Escribe una cadena de 4 numeros + ENTER: ");
scanf("%s", &resp);
for(i=0;i>4;i++){
if(resp[i]<'0'||resp[i]>'9'){
printf("No pueden ser caracteres, tienen que ser numeros");}
else continue;}
if (strlen(resp)!=4 ){//si la cadena escrita es demasiado larga o corta
printf("Error de longitud de cadena ");}




for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){


if (i == j && cad[i]==resp[j]){
asteriscos=asteriscos+1;j==4;}

if(i != j && cad[i]==resp[j]){
barras=barras+1;j==4;}

else {
bajas=bajas+1;j==4;
}
}
}



for(q=0;q<asteriscos;q ++){
resul[q]='*';}
for(q=asteriscos; q<asteriscos+barras; q++){
resul[q]='/';}
for(q=asteriscos+barras; q<4; q++){
resul[q]='_';}
for(k = 0; k<4; k++){
printf("%c", resul[k]);}

printf("\n");

if(strcmp(resul,cad)==0){
intentos==100;}
}while(intentos<100);return 0;}


MOD EDIT: Titulo y etiqueta GeSHi corregidos.
#15
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.
#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);
}
#16
Cita de: 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.


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//FUNCIONES CREADAS:

#define ARRAY_COUNT(x) sizeof((x))/sizeof((x)[0])
void impresionCARATULA();
void JugarPart(int dificultad);
void Gene_Num_Aleatorios(int array_numeros_aleatorios[], size_t size);
int NivelDificultad();
int MENU();

int main(){
   // int num_jugador;
   int opcion;
   int dificultad = 100;

   impresionCARATULA();
   do {
       opcion = MENU();
       switch(opcion) {
   case 1:
       JugarPart(dificultad);
       break;
   case 2:
    JugarPart(100);
       break;
   case 3:
       dificultad = NivelDificultad();
       break;
   case 4:
       printf("Has selecionado Listar historial de partidas\n");
       break;
   case 0:
       printf("Has seleccionado Salir\n");
       opcion = 0;
       break;
   default:
       printf("Has seleccionado una opcion no valida\n");
       break;
}
   } while(opcion);
   
   return 0;
}

//CODIGO DE LAS FUNCIONES CREADAS:

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

int MENU() { //imprimir el menú
int opcion;

   putchar('\n');
   puts("1) Jugar partida");
   puts("2) Jugar partida de prueba");
   puts("3) Establecer nivel de dificultad");
   puts("4) Listar historial de partidas");
   puts("0) Salir\n");
   printf("   Elija opcion >> ");
   scanf("%i", &opcion);

   return opcion;
}

int NivelDificultad() {
   int c1;
   int dificultad;

   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 {
           puts("Has selecionado un numero no valido");
           c1 = 1;
       }
   } while(c1);
   return dificultad;
}  

void Gen_Num_Aleatorio(int array_numeros_aleatorios[], size_t size) {
   int i;
   
   srand(time(NULL));
   for(i = 0; i < size; i++) {
       array_numeros_aleatorios[i] = rand() % 10; //del 0 al 9
   }
}

void JugarPart(int dificultad) {
   int numeros[4];
   int i;
   /* Declara aquí las variables que vayas a usar para la lógica
    * del juego.
    */    


   printf("Has seleccionado Jugar Partida con dificultad %i\n", dificultad);
   Gen_Num_Aleatorio(numeros, ARRAY_COUNT(numeros));
   for(i = 0; i < dificultad; ++i) {
    /* Inserta aquí tu lógica para que
    * el jugador adivine los números
    */
   }
}

Muchas gracias MAFUS!
lo que hace gen_num_aleatorios era generar un numero aleatorio de 4 digitos el cual luego tendremos que adivinar
#17
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 
#18
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
#19
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:
#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);
}
#20
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:
#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);
}