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 - Raskera

#1
Programación C/C++ / Juego mastermind
26 Abril 2019, 19:57 PM
El programa pide q el ordenador adivine un número q yo pienso y me he encallado en como seguir...
Ayudaaaaaa!!!

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define MAXDIGIT 6
#define XIFRES 4
#define MAXTRIES 100

void endevina (int);
void comptaEncerts (int[],int[],int*,int*);
void mostra (int[]);
void randNoRep(int[]);

int main(void){
    int num;

    printf("Pensa un nombre de %d xifres sense repetir i entre 0 i %d.\n Entra 1 per a que l'endevini altrament s'atura.\n",XIFRES,MAXDIGIT-1);
    scanf("%d",&num);

    srand((unsigned) time (NULL));

    while(num==1){
        endevina(1000* pow(XIFRES,MAXDIGIT));

        printf("Pensa un nombre de %d xifres sense repetir i entre 0 i %d.\n Entra 1 per  a que l'endevini altrament s'atura.\n", XIFRES,MAXDIGIT-1);
        scanf("%d",&num);
    }
    return 0;
}

void endevina(int MaxIter){
    int tries[MAXTRIES][XIFRES+2], nMorts, nFerits, i, j, k, mentida=0, control=0, val[XIFRES],valnou[XIFRES];

    randNoRep(val);
    mostra(val);
    printf("\n");
    printf("Entra quantes xifres tens ben situades:\n");
    scanf("%d",&nMorts);
    printf("Entra quantes xifres estan mal situades:\n");
    scanf("%d",&nFerits);
/*Si te la llet d'adivinar-lo a la primera.*/
   if(nMorts==XIFRES){
       printf("He endevinat lo numero en %d intents.\n", control+1);
       return;
   }
/*Posem lo numero generat en una matriu on les dues ultimes columnes s'omplin segons els ferits i morts.*/
    for(i=0; i<XIFRES; i++){
       tries[control]= val;
    }
    tries[control][XIFRES]=nMorts;
    tries[control][XIFRES+1]=nFerits;

    for(j=0; j<MAXTRIES; j++){
        randNoRep(valnou);

        comptaEncerts(val, valnou, &nMorts, &nFerits);

        control++;

        for(k=0; k<control; k++){
                if(tries[k][XIFRES]!=nMorts && tries[k][XIFRES+1]!=nFerits){
                randNoRep(valnou);
                mentida++;
                k=-1;
                if(mentida>=MaxIter){
                     printf("Hum... Crec que menteixes.. Em dono!\n");
                    return;
                    }
                }
               
                /*if(tries[k][XIFRES]==nMorts && tries[k][XIFRES+1]==nFerits) {
                mostra(valnou);*/
       
        }
       
    }
   
    return;
}


void comptaEncerts (int data1[], int data2[], int *nMorts, int *nFerits){
    int i,j;
    /*Comprovació de morts que hi ha.*/
    *nMorts=0;
    for(i=0; i<XIFRES; i++){
        if(data1==data2){
            nMorts++;
        }
    }
    /*Comprovació de ferits que hi ha.*/
    *nFerits=0;
    for(i=0; i<XIFRES; i++){
        for(j=0; j<i; j++){
            if(data1==data2[j]){
                nFerits++;
            }
        }
        for(j=i+1; j<XIFRES; j++){
              if(data1==data2[j]){
                nFerits++;
                }
        }
    }
return;
}

void mostra(int data[]){
    int i;
    for(i=0; i<XIFRES; i++){
        printf("%1d",data);
    }
return;
}

void randNoRep(int val[XIFRES]) {
    int i,j;

    val[0]=rand()%MAXDIGIT;

    for(i=1; i<XIFRES; i++){

            val=rand()%MAXDIGIT;
          for(j=0; j<i; j++){
                   if( val==val[j]) {
            val=rand()%MAXDIGIT;
            j = -1; /*Pq així tenim que que j valdrà 0.*/
                    }
          }
    }

    return;
}