/* Mastermind													*/
/* Jens Mller 02.01.1992										*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ext.h>

typedef	int	BOOLEAN;

#define	TRUE	1
#define	FALSE	0

#define	max_stellen	10

int		stellen = 4;
BOOLEAN	m_num[max_stellen], m_inp[max_stellen];
char	num[max_stellen + 2];
char 	inp[254];

/* Eingabe einer Zeichenkette									*/
void in_string(char *sign)	{
	int		pos = 0;
	char	taste;

	do	{
		taste = (char)getch();
		if(taste >= 0x20 && taste <= 0x7E && pos < max_stellen + 2)	{
			*sign = taste;
			sign++;
			pos++;
			putch(taste);
		}
		if(taste == 8 && pos > 0)	{
			sign--;
			pos--;
			printf("\b \b");
		}
	} while(taste != 0xD);
	*sign = 0;
	puts("");
}


/* alle Leerzeichen aus dem String entfernen					*/
void clr_space(char *str_line)	{
	int	source = -1;
	int	dest = -1;

	do	{
		source++;
		if(str_line[source] != 0x20)	{
			dest++;
			str_line[dest] = str_line[source];
		}
	} while(str_line[source]);
}


void loop(void)	{
	int		i, j, versuche, hilf_st;
	char	sign;
	BOOLEAN	prg_end, wrong, again;

	srand((unsigned)clock());
	do	{
		hilf_st = stellen;
		do	{
			prg_end = FALSE;
			again = FALSE;
			printf("\n Wieviel Stellen? (%d): ", stellen);
			in_string(inp);
			clr_space(inp);
			if(strlen(inp))
				if(inp[0] == 'Q' || inp[0] == 'q')	{
					printf("\n Programm beenden? (J): ");
					sign = (char)getch();
					printf("%c\n", sign);
					if(sign == 'J' || sign == 'j')
						prg_end = TRUE;
					else
						again = TRUE;
				} else
					hilf_st = atoi(inp);
		} while((hilf_st<1 || hilf_st>max_stellen || again) && !prg_end);
		puts("\n");
		if(!prg_end)	{
			stellen = hilf_st;
			for(i = 0; i<stellen; i++)
				num[i] = rand()%9 + '0' + 1;
			num[stellen] = 0;
			versuche = 0;
			do	{
				versuche++;
				printf(" %d. Eingabe: ", versuche);
				in_string(inp);
				clr_space(inp);
				if(strlen(inp))	{
					wrong = FALSE;
					if(inp[0] == 'Q' || inp[0] == 'q')
						printf("\n Die richtige Zahl lautete: %s\n", num);
					else {
						for(i = 0; i < stellen; i++)	{
							m_num[i] = FALSE;
							m_inp[i] = FALSE;
						}
						printf("                         ");
						for(i = 0; i < stellen; i++)
							if(num[i] == inp[i])	{
								printf("*");
								m_num[i] = TRUE;
								m_inp[i] = TRUE;
							} else
								wrong = TRUE;
						if(wrong)	{
							for(i = 0; i < stellen; i++)
								if(m_num[i] == FALSE)
									for(j = 0; j < stellen; j++)
										if(m_inp[j] == FALSE && num[i] == inp[j])	{
											printf("#");
											m_inp[j] = TRUE;
											break;
										}
							puts("");
						} else
							puts("\n\n >>> R I C H T I G <<<\n");
					}
				} else {
					versuche--;
					wrong = TRUE;
				}
			} while(wrong);
		}
	} while(!prg_end);
}


void main(void)	{
	puts("\x1B\x45\n MASTERMIND - ganz schnell programmiert");
	puts(" + nicht schn - aber von Jens Mller +\n");
	puts(" richtige Zahl an richtiger Stelle :  *");
	puts(" richtige Zahl an falscher  Stelle :  #\n");
	puts(" Abbruch mit 'Q'\n");
	loop();
	exit(0);
}

