Cuestión 803 Mastermind es un juego de mesa, de ingenio y reflexión, para dos jugadores. Hay una serie de fichas de colores, un jugador (la banca) escoge una combinación de 4 colores (que se pueden repetir) y el otro jugador tiene que adivinar dicha combinación. Para ello prueba una combinación y la banca le responde con unas fichas blancas y negras, tantas negras como fichas de color bien colocadas y tantas blancas como fichas de color mal colocadas. Termina al averiguarse la combinación (es decir, se consigue una combinación con cuatro negras), o bien se agota el tablero (depende del tamaño, aunque generalmente son 15 combinaciones). Vamos a realizar un programa que simule el juego de la banca (el jugador que escoge 4 colores y los oculta). Los colores vamos a simularlas con números, la banca sacará N números (en ppio 4) entre 1 y M (que será en ppio 6). O sea, que escogemos 4 fichas y cada una puede adoptar uno de 6 colores. El jugador tiene que intentar adivinar la combinación secreta para ello prueba una combinación en la banca responderá con una cadena de caracteres con tantas 'n' como números bien colocados y tantas 'b' como números que existen pero no están bien colocados. El juego termina cuando algún jugador averigua la combinación oculta de la banca, es decir, se consigue una combinación con cuatro negras, o bien se agota el tablero , dependiendo esto del tamaño, limitándose generalmente a 15 combinaciones. Para la implementación de este juego se definen las siguientes estructuras: struct jugada { int colores[N]; int num; char banca[N+1]; banca struct jugada * sig; }; // almacena la jugada // turno // cadena de caracteres con respuesta de la // puntero al siguiente elemento; typedef struct jugada NODO; Como se puede observar, cada una de las jugadas se va almacenando en una lista enlazada. Se pide: Programar la función compara_solucion que que recibe como parámetros 2 vectores de N números, uno con la combinación del jugador (jugada) y otro con la combinación solución de la banca (real). La función debe devolver por parámetro una cadena de caracteres de tamaño N+1 con tantos caracteres ’n’ como números bien colocados y tantos caracteres ’b’ como números que existen pero no están bien colocados. La cadena de caracteres debe contener el carácter fin de cadena ‘\0’ .El prototipo de esta función es: void compara_solucion(int jugada[N], int real[N], char nota[N+1]); Para probar esta función puede disponer del siguiente código. #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 4 //Numero de numeros a adivinar. #define M 6 //Numero de valores q pueden tomar los numeros. 1 void compara_solucion(int jugada[N], int real[N], char nota[N+1]); void main(void) { int i,j; int real[N]={1,3,3,5}; int jugadas[4][N]={{3,3,3,3},{6,5,4,3},{4,3,2,3},{1,3,6,3}}; char nota[N+1]; for(j=0;j<4;j++) { printf("solucion: "); for(i=0;i<N;i++) { printf("%d",real[i]); } printf(" jugada: "); for(i=0;i<N;i++) { printf("%d",jugadas[j][i]); } compara_solucion(jugadas[j],real,nota); printf(" Respuesta: %s\n",nota); } } void compara_solucion(int jugada[N], int real[N], char nota[N+1]) { /************************INICIO CODIGO ALUMNO************************/ /************************ FIN CODIGO ALUMNO*************************/ } La solución debe ser: REAL JUGADA RESPUESTA 1335 1335 1335 1335 3333 6543 4323 1363 nn bb nb nnb COMENTARIOS Los elementos bien colocados no cuentan para ver los descolocados El 3 solo esta descolocado 1 vez 2 JUEGO COMPLETO MASTER MIND Una vez acabas las tres funciones de este ejercicio, puede incluir el código de las funciones para poder jugar al juego master mind. En la ejecución se genera un fichero llamado “mastermind.txt” donde podrá ver sus jugadas y cuantos pasos ha necesitado para averiguar la combinación secreta de la banca. #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 4 //Numero de numeros a adivinar. #define M 6 //Numero de valores q pueden tomar los numeros. struct jugada { int colores[N]; // almacena la jugada int num; // turno char banca[N+1]; // cadena de caracteres con la respuesta de la banca struct jugada * sig; // puntero al siguiente elemento; }; typedef struct jugada NODO; void void NODO NODO compara_solucion(int jugada[N], int real[N], char nota[N+1]); imprime_jugadas(NODO *); * inserta_final(NODO * raiz, NODO * nuevo); * reserva_jugada(void); void main(void) { int i,fin=1,cont=0; int aux,auxj=1; char jugada[N+1]; char nota[N+1]; int real[N]; NODO * top=NULL, *nuevo; // generamos al azar combinaci\’{o}n de "colores" a adivinar for(i=0;i<N;i++) { srand(i+time(NULL)); real[i]=1+rand() % M; //printf("%d ",real[i]); } printf("\n"); while(fin) { nuevo=reserva_jugada(); nuevo->num=cont+1; auxj=1; while(auxj) // Por si los numeros introducidos no son validos { printf("Introduzca jugada:\n"); scanf("%s",jugada); //guardamos jugada como cadena de carateres auxj=0; //suponemos numeros correctos for(i=0;i<N;i++) //convertimos cadena jugada de caracteres // a cadena de numeros y comprobamos que son v\’{a}lidos 3 { aux=jugada[i]-48; if(aux<1 || aux>M) // Si algun numero no es correcto //volvemos a pedir { printf("Jugada erronea, vuelva a introducirla\n"); auxj=1; i=N; } else { nuevo->colores[i]=aux; } } //end for } //end (while(auxj)) // Vemos El resultado de nuestra jugada: compara_solucion(nuevo->colores,real,nuevo->banca); printf("La respuesta de la banca es %s\n",nuevo->banca); nuevo->num=++cont; fin=0; for(i=0;i<N;i++) { if(nuevo->banca[i]!=’n’) { fin=1; } } top=inserta_final(top,nuevo); } //end while (fin) printf("\n\nGANASTE !!!\n"); imprime_jugadas(top); system("pause"); } NODO * reserva_jugada(void) { NODO *nuevo; nuevo=(NODO*)malloc(sizeof(NODO)); if(nuevo==NULL) { printf("Error en reserva dinamica de memoria\n"); exit(1); } nuevo->sig=NULL; return nuevo; } 4