EXAMEN! AYUDA MASTER MIND COLORES

Iniciado por javierdieguez, 2 Abril 2013, 19:30 PM

0 Miembros y 1 Visitante están viendo este tema.

javierdieguez

Buenas, llevo ya rato intentando y lo único que sé es sacar el código de este juego pero para que me diga los errores y los aciertos. Esto lo hemos hecho un amigo y yo pero no es lo que especificaba el enunciado:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define CIFRAS 4
   
int comprobarLetra(char a,char combinacion[]);
int main()

{
time_t t;
 
int i,j,azar,intentos,colocadas,descolocadas,repetida,jugar,ola;
char num[6]={'A','B','C','D','E','F'};
char combinacion[CIFRAS]={' ',' ',' ',' '}; // 5 6 4 7
char jugada[CIFRAS]={' ',' ',' ',' '};
char volver_jugar;
 

jugar=intentos=repetida=azar=0;
 
srand((unsigned)time(&t));
 
   for(i=0;i<4;i++)
   {
       do
       {   azar=rand()%5;
           /*metemos la letra en el array*/
           /*comprobamos que no se repita, y en caso de repetirse, sobreescribiremos esa letra, por eso no salimos del do...while, para que la "i" siga valiendo lo mismo y estemos sobreescribiendo en la misma posición*/
           repetida=comprobarLetra(letra[azar],combinacion);
           combinacion=letra[azar];
       }while (repetida==1);
 
   }
 
   printf("\nLa combinación aleatoria es: ");
   for(j=0;j<CIFRAS;j++) printf("%c ",combinacion[j]);
   printf("\n\nIntroduce una letra por posicion, de la A a la F");
 
   do
   {
   for(j=0;j<CIFRAS;j++)
   {
   printf("\nLetra %d: ",j+1);
   scanf("%c",&jugada[j]);
   fflush(stdin);
   }
   intentos++;
 
   colocadas=0;
   descolocadas=0;
   for (i=0;i<CIFRAS;i++)
   {
   for (j=0;j<CIFRAS;j++)
   {
   if (combinacion==jugada[j])
   if (i==j) colocadas++;
   else
    descolocadas++;
   }
   }
 
   printf("\nTu jugada es: ");
   for(i=0;i<CIFRAS;i++) printf("%c ",jugada);
   printf("LETRAS BIEN COLOCADAS: %d] [LETRAS MAL COLOCADAS: %d] >>>>>>>",colocadas,descolocadas);
   if(colocadas==4) printf("\n\nENHORABUENA! HAS GANADO!(%d intentos)\n",intentos);
   else
   {
   printf("\n\nOTRA PARTIDA<S/N>?");
   scanf("%c",&volver_jugar);
   fflush(stdin);
   if (volver_jugar=='S') jugar=1;
   else jugar=0;
   }
   }while (colocadas<CIFRAS && jugar==1);
 
 
   system("pause");
 
 
   return 0;
}

int comprobarLetra(char a,char combinacion[]){
     int i,j,repetida=0;
     for(i=0;i<4;i++) //Recorremos cada elemento del array (EMPIEZAN POR 0!)
     {         
                if(combinacion==a)
                {
                       repetida=1;
                }
     }
     return (repetida);
}


El enunciado al que recalco es el siguiente y hace mencion a colores cuando se acierta o se falla:

2. Programa en C el juego ADIVINA COMBINACIÓN, este consiste en generar  3 dígitos aleatorios del 0 al 9 y almacenar cada uno de ellos en una cadena. El jugador intentará adivinar los 3 dígitos introduciendo los valores en sus supuestas posiciones, dispondrá de 4 oportunidades para adivinar la combinación, el programa le responderá en cada oportunidad con una pista por pantalla indicando:
Verde: Acierta valor y posición
Amarillo: Acierta valor pero no en la posición correcta
Rojo: No acierta ningún valor.

Por ejemplo, si la generación aleatoria es 5-6-8

Jugador introduce valores:
1 2 5
rojo rojo amarillo

Jugador introduce valores:
5 2 6
verde rojo amarillo

Jugador introduce valores:
5 6 8
verde verde verde
Acierta combinación en tres jugadas. Adios.

Notas:     
Se debe usar una función aleatorio para generación de aleatorios (no procedimiento), los valores del usuario se leen en el procedimiento leer_combinación, se compararán con la cadena que contiene los valores aleatorios en la función compara (esta funcion muestra las pistas, gestiona los aciertos para el fin de programa)

int aleatorio(); (0.5p)
void leer_combinacion(int *v1,int *v2,int *v3);(0.5p)
int compara (int v1,int v2,int v3, char cadena[]);(1.5p)
main();(0.5p)



POR FAVOR, tenemos mi clase este examen mañana y no sabes como sacarlo, seguro que alguno de vosotros lo habréis hecho, muchas gracias!

Almapa

Un par de cosas que he cambiado para poder hacerlo funcionar:
- La variable "letra", supongo que es lo que se ha definido previamente como num[6]
-Todos los bucles "for" en los que metes la variable "combinacion" debes poner "combinacion" pues de lo contrario no estarás recorriendo el array elemento a elemento.
- La línea "combinacion=letra[azar]; " durante la definición de la combinación aleatoria correcta, debe estar fuera del "while" pues si no se repite la letra debe asignarla también en la posición correspondiente.

Creo que eso es todo, a mi me funciona bien habiendo hecho esos cambios.

Un saludo.

javierdieguez


Almapa

Mira a ver que te parece este código, he modificado el tuyo tal cual lo pide en el enunciado, con las funciones que pide y los parámetros que utiliza cada función.

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define CIFRAS 3
int resultado[2];
char num[10]={'0','1','2','3','4','5','6','7','8','9'};
int aleatorio();
void leer_combinacion(int *v1,int *v2,int *v3);
int compara (int v1,int v2,int v3, char cadena[]);



////Función main
int main()
{
//Definiión de variables    
time_t t;
int v1,v2,v3;
int i,j,azar,intentos,repetida,jugar=1,ola;
char cadena[CIFRAS];
char jugada[CIFRAS];
char volver_jugar;
 

intentos=repetida=azar=0;
srand((unsigned)time(&t));

//Bucle con la función aleatorio para generar la solución
for(i=0;i<CIFRAS;i++)
{
  cadena[i]=num[aleatorio()];
}

printf("\nLa combinación aleatoria es: ");
for(j=0;j<CIFRAS;j++) printf("%c ",cadena[j]);

//Bucle para obtener las entradas del jugador y comprobar si son correctas.
while (jugar==1)
{
  intentos++;
  leer_combinacion(&v1,&v2,&v3);
 
  printf("\nTu jugada es: ");
  printf("\n%i %i %i ",v1,v2,v3);
  compara(v1,v2,v3,cadena);

 
  if(resultado[0]==CIFRAS) printf("\n\nENHORABUENA! HAS GANADO!(%d intentos)\n",intentos);
  else
  {
      printf("\n\nOTRA PARTIDA<S/N>?");
      scanf("%c",&volver_jugar);
      fflush(stdin);
      if (volver_jugar=='S' || volver_jugar=='s') jugar=1;
      else jugar=0;
  }
}
 
system("pause");
return 0;
}


//// Función aleatorio

int aleatorio()
{
  return (rand()%10);
}

//// Función compara
int compara(int v1,int v2,int v3, char cadena[])
{
   
  int i;
  int jugada;
  for (i=0;i<CIFRAS;i++)
  {
      if (i==0) jugada=atoi(&cadena[i])/100; else if (i==1) jugada=atoi(&cadena[i])/10; else jugada=atoi(&cadena[i]);
      if (jugada==v1)
      {
      if (i==0) {printf("verde");resultado[0]++;} else {printf("amarillo");resultado[1]++;}
      }
      if (jugada==v2)
      {
      if (i==1) {printf("verde");resultado[0]++;} else {printf("amarillo");resultado[1]++;}
      }
      if (jugada==v3)
      {
      if (i==2) {printf("verde");resultado[0]++;} else {printf("amarillo");resultado[1]++;}
      }
      if (jugada!=v1 && jugada!=v2 && jugada!=v3) printf("rojo");
  }
  return 1;
 
}

//// Función leer_combinación
void leer_combinacion(int *v1,int *v2,int *v3)
{
    int j;
    printf("\n\nIntroduce un numero, del 0 al 9");
    printf("\nNumero 1: ");
    scanf("%i",v1);
    printf("\nNumero 2: ");
    scanf("%i",v2);
    printf("\nNumero 3: ");
    scanf("%i",v3);
    fflush(stdin);
}