The following program works when valid input is entered. When invalid input is entered it goes into a loop and stops working. I have included the code along with how I want the code to behave when invalid input is entered.
Code:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_QUERIES 12
#define N_DIGITS 4
int isValid(int N){
//Create an array each index represent a digit
int digit[10]={0};
int lastDigit = 0;
//If Number is 4 digit
int lower = 1;
int upper = 9;
int x = 0;
for(;x<(N_DIGITS-1);x++){
upper=upper*10+9;
lower=lower*10;
}
if(N>=lower && N<upper){
//Iterate through each digit in N
while(N>0){
lastDigit = N%10;
//if digit is 0 then N is not valid
if(lastDigit==0)
return 0;
//if this digit is already seen then that means digit is repeated
if(digit[lastDigit]==1)
return 0;
//if not seen earlier then mark it as seen
digit[lastDigit]=1;
N=N/10;
}
return 1;
}
else
return 0;
}
//Choose a 4 digit valid number
int choose_N(){
int N=0;
while(1){
N = rand();
if(isValid(N))
return N;
}
return -1;
}
int matches(int N,int M){
int dN=0;
int dM=0;
int m=0;
while(N>0 && M>0){
dN=N%10;
dM=M%10;
//if both the last digit of N and M are same them increment the count of match
if(dN==dM)
m++;
N=N/10;
M=M/10;
}
return m;
}
int hits(int N,int M){
//Array to track what all digits are there in N
int digitsN[10]={0};
int lastDigit = 0;
int i=1;
int hit=0;
while(N>0){
lastDigit=N%10;
//index at lastDigit in digitsN is seen so adding the index from right side e.g 4920 has index as 4321
digitsN[lastDigit]=i++;
N=N/10;
}
i=1;
while(M>0){
lastDigit=M%10;
//Check if last digit of M is somewhere in the N but not at the same index
if(digitsN[lastDigit]!=0 && digitsN[lastDigit]!=i)
hit++;
M=M/10;
i++;
}
return hit;
}
int main(){
srand(time(0));
int N = choose_N();
//printf("Number guessed = %d\n",N);
printf("***Welcome to the MATCH and HIT game***\n");
printf("The computer has selected a 4-digit number.\n");
printf("Try to deduce it in 12 rounds of queries.\n");
int round=1;
int M=0;
int numOfInputRead=0;
while(round<=MAX_QUERIES){
printf("\nRound #%d\n",round);
while(numOfInputRead==0){
fflush(stdin);
printf("Please enter your query (4 digits):");
numOfInputRead = scanf("%d",&M);
if(numOfInputRead==1 && isValid(M)==1)
break;
else{
printf("Invalid number. Please try again!\n");
numOfInputRead=0;
}
}
numOfInputRead=0;
int m = matches(N,M);
int h = hits(N,M);
printf("\n-> %d match and %d hits ",m,h);
if(m==N_DIGITS){
printf("\n**********************************\n");
printf("CONGRATULATIONS! You won the game!\n");
printf("**********************************\n");
return 0;
}
round++;
}
printf("\n**********************************\n");
printf("Sorry, out of queries. Game over!\n");
printf("**********************************\n");
return 0;
}