/*                 ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
		   º    PROGRAMA DEL MASTER MIND      º
		   ºÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄº
		   º Noms  :  - M¢nica Salas          º
		   º          - S¡lvia de la Orden    º
		   º Curs  :  95-96                   º
		   º Login :  EI00228                 º
		   º Data  :  12-12-95                º
		   º Assignatura : F.INFORMATICA      º
		   ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¼
*/


#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <ctype.h>
#include <dos.h>
#include <string.h>

void generar_combinacio(char comb[],char *op)
{
     int i,a,b,c,d,num,epl,epa;
     do{
     randomize();
     a=0;b=0;c=0;d=0;
     do
     {
	a=random(7);b=random(7);c=random(7);d=random(7);
     }
     while((a==0) || (b==0) || (c==0) || (d==0));
     num=(a*1000)+(b*100)+(c*10)+(d);
     itoa(num,comb,10);
     //cprintf(comb);
     //getch();
    }
    while(op=="S");
}

int encerts_plens(char comb[],char cadena[],int z, int j)
{
    int cad,epl,x,x2;
    char *cad2;

    epl=0;
    for (x=0;x<4;x++)
    {
	if(comb[x]==cadena[x])
	{
		epl++;

		/*textcolor(5);           // Escribe de un color diferente si
		gotoxy(z+x,j-1);        // el numero es un acierto pleno de
		cprintf("%c",cadena[x]);// la combinaci¢n.*/
	}
    }
    textcolor(11);
    return(epl);
}

int encerts_parcials(char comb[],char cadena[],int z, int j)
{
    int epa,x,x2,exist;

    epa=0;exist=0;
    for (x2=0;x2<4;x2++)
    {   //               No se ha encontrado, (y) no es un acierto pleno
	if((comb[0]==cadena[x2]) && (exist==0) && (comb[0]!=cadena[0]))
	{
		epa++;exist=1;           // Exist vale uno cuando ya ha encon-
					 // trado el numero. Evita aciertos
					 // duplicados.

		/*textcolor(9);            // Escribe de un color diferente si
		gotoxy(z+x2,j-1);        // el numero es un acierto parcial
		cprintf("%c",cadena[x2]);// de la combinaci¢n.*/

	}
    }
    exist=0;
    for (x2=0;x2<4;x2++)
    {
	if((comb[1]==cadena[x2]) && (exist==0)&& (comb[1]!=cadena[1]))
	{
		epa++;exist=1;
		/*textcolor(9);
		gotoxy(z+x2,j-1);
		cprintf("%c",cadena[x2]);*/
	}
    }
    exist=0;
    for (x2=0;x2<4;x2++)
    {
	if((comb[2]==cadena[x2]) && (exist==0) && (comb[2]!=cadena[2]))
	{
		epa++;exist=1;
		/*textcolor(9);
		gotoxy(z+x2,j-1);
		cprintf("%c",cadena[x2]);*/
	}
    }
    exist=0;
    for (x2=0;x2<4;x2++)
    {
	if((comb[3]==cadena[x2]) && (exist==0) && (comb[3]!=cadena[3]))
	{
		epa++;exist=1;
		/*textcolor(9);
		gotoxy(z+x2,j-1);
		cprintf("%c",cadena[x2]);*/
	}
    }
    return(epa);
}

void entrada(void)
{
     int x,y;

     clrscr();
     textbackground(1);
     textcolor(9);
     sound(700);delay(200);sound(100);delay(200);sound(300);
     delay(200);sound(500);delay(200);nosound();
     for(x=4;x<82;x++)
	{
		gotoxy(x,y);cprintf("ß");
	}
     for(x=2,y=5;x<80;x++)
	{
		gotoxy(x,y);cprintf("ß");
	}
     for(x=1,y=1;y<15;y++)
	{
		gotoxy(x,y);cprintf("Û");
	}
     for(x=79,y=1;y<15;y++)
	{
		gotoxy(x,y);cprintf("Û");
	}
     for(x=1,y=15;x<80;x++)
	{
		gotoxy(x,y);cprintf("ß");
	}
     textcolor(11);gotoxy(35,3);cprintf("MASTER MIND");
     gotoxy(7,7);cprintf("   Este es un juego de estrategia donde el objetivo es adivinar un");
     gotoxy(7,8);cprintf("n§ de cuatro cifras generado por el ordenador. Para ello tienes 10");
     gotoxy(7,9);cprintf("intentos. Se te informar  de los aciertos plenos y de los parciales");
     gotoxy(7,10);cprintf("(aquellos n£meros que se encuentran pero no en el orden correcto)");
     gotoxy(7,11);cprintf("Los n£meros est n comprendidos entre el 1 y el 6");
     gotoxy(20,17);cprintf("Pulse cualquier tecla para continuar...  ");
     getch();

}

void representar_grafico(void)
{
     int x,y,i,y1,x2,y3;

     clrscr();
     delay(300);sound(600);delay(300);sound(700);delay(300);
     sound(300);delay(300);nosound();
     textbackground(1);
     textcolor(11);
     y=9;i=1;
     for(x=10;y<19;y++)
     {
	gotoxy(x,y);printf("%d",i++);
     }
    gotoxy(20,7);cprintf("Jugada");
    gotoxy(35,7);cprintf("Encerts plens");
    gotoxy(55,7);cprintf("Encerts parcials");
    gotoxy(35,3);cprintf("MASTER MIND");
    textcolor(9);y1=20;x2=1;y3=2;
    do
	{
		gotoxy(x2,1);cprintf("ß");
		gotoxy(x2,5);cprintf("ß");
		gotoxy(x2,20);cprintf("ß");
		x2++;
	}
    while (x2<80);
    for (y3=1;y3<y1;y3++)
	{
		gotoxy(79,y3);cprintf("Û");
	}
    for (y3=1;y3<y1;y3++)
	{
		gotoxy(1,y3);cprintf("Û");
	}

}

void entrada_combinacio(char cadena[],int z,int j)
{
    int a,x,cad,i;
    textcolor(15);
    gotoxy(z,j);

    for (x=0;x<4;x++)
    {
	cadena[x]=0;
    }
    for (x=0;x<4;x++)
    {
	while ((cadena[x]<49) || (cadena[x]>54))
	{
		cadena[x]=getch();
	}
	gotoxy(z+x,j);printf("%c",cadena[x]);
    }
    for(i=0;i<4;i++)
    {	if ((!isdigit(*cadena)) || ((*cadena)>'6') || ((*cadena)<'1'))
	{
		cadena=NULL;
	}
	else cadena++;
    }
}

void comparacio(char comb[],char cadena[])
{
    char *p,*pp,*op;
    int epl,epa,total,c,c2,z,j;

    op="S";
    while(*op=='S')
    {
	representar_grafico();
	c=9;epl=0;epa=0;z=20;j=9;
	for (total=0;total<10;total++)
	{
		entrada_combinacio(cadena,z,j);j++;
		epa=encerts_parcials(comb,cadena,z,j);
		epl=encerts_plens(comb,cadena,z,j);
		gotoxy(40,c);textcolor(11);cprintf("%i",epl);
		gotoxy(60,c);c++;textcolor(11);cprintf("%i",epa);
		if (epl==4)
		{
	    textcolor(11);
			sound(700);delay(50);sound(500);delay(50);
			sound(700);delay(50);sound(500);delay(50);
			sound(700);delay(50);sound(500);delay(50);
			sound(700);delay(50);sound(500);delay(50);
			sound(700);delay(50);sound(500);delay(50);nosound();
			clrscr();gotoxy(25,10);
			cprintf("GANASTE !!!!");
			total=10;

		}
	}
	if ((total==10) && (epl<4))
	{
	textcolor(11);
		sound(200);delay(700);sound(100);delay(700);nosound();
		clrscr();gotoxy(25,10);
		cprintf("LO SIENTO HA PERDIDO, OTRA VEZ SERA");

	}
	delay(1800);
	clrscr();
	gotoxy(25,10);
	cprintf("DESEA CONTINUAR (S) o (N)? ");
    gotoxy(55,10);
	cscanf("%s",op);op=strupr(op);
	if (op=="S")
	{
		representar_grafico();
	}
    }
}

void main(void)
{
    char numero[5];
    char cadena[5];

    _setcursortype(_NOCURSOR);
    entrada();
    generar_combinacio(numero,"S");
    comparacio(numero,cadena);
}

