The last problem Im having is finding the right code to fix the almost function when there are more than one of a number
ie: Code is 7880
if I say 7899, it will say 1 right, almost 2
How do I fix this?
everything else will work if the hidden code doesnt have duplicate numbers
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*Prototypes*/
void intcodearray(int codearr[]);
void getGuess(int guessarr[]);
int comparearray(int codearr[], int guessarr[], int flagarr[]);
void showresults(int flagarr[]);
void outputarray(int outarr[]);
/*main program input*/
int main(int argc, char *argv[])
{
int codearr[4], guessarr[4], flagarr[4]={0,0,0,0};
int max_tries=0;
int win = 0;
/*Introduction*/
printf("===========================================================\n");
printf("\t\t\tCODEBREAKER\n");
printf("===========================================================\n");
printf("Welcome to Codebreaker, please input 4 numbers between 0-9.\n");
printf("You have up to TEN tries to figure out the code. Good Luck!\n\n");
/*End Introduction*/
intcodearray(codearr);
outputarray(codearr);
for(max_tries = 0 ; max_tries <= 10 ; max_tries++)
{
printf("Code Guess: ");
getGuess(guessarr);
outputarray(guessarr);
win = comparearray(codearr, guessarr, flagarr);
// outputarray(flagarr);
if(win==4)/*max guesses reached, end game*/
{
printf("You Win.\n");
break;
}
if(max_tries==10 && win != 4)
{
printf("\nThat was TEN guesses, and you were unable to solve the puzzle.\n");
printf("You have failed.\n");
}
}
system("PAUSE");
return 0;
}
/*Void Codes*/
void intcodearray(int codearr[])
{
int i=0;
srand(time(NULL));
for(i=0 ; i <4 ; i++)
{
codearr[i]= rand()%9;
}
}
void getGuess(int guessarr[])
{
int guess=0;
scanf("%d", &guess);
guessarr[0] = guess / 1000;
guess = guess % 1000;
guessarr[1] = guess / 100;
guess = guess % 100;
guessarr[2] = guess / 10;
guess = guess % 10;
guessarr[3] = guess;
}
int comparearray(int codearr[], int guessarr[], int flagarr[])
{
int code, guess, flag;
int i=0, outer=0;
int right = 0, almost = 0;
for(i=0 ; i <4 ; i++) //rights
{
if(codearr[i] == guessarr[i])
// printf("Yes\n", guessarr[i]);
{
flagarr[i] = 1;
right++;
}
}
for(outer=0 ; outer < 4 ; outer++)
for(i=0 ; i <4 ; i++) //almost
{
if(codearr[outer] == guessarr[i]&&flagarr[outer]==0)
// printf("Yes\n", guessarr[i]);
{
flagarr[i] = 1;
almost++;
}
}
printf("Right %d , Almost %d\n", right, almost);
return(right);
}
void showresults(int flagarr[])
{
}
void outputarray(int outarr[])
{
int i=0;
for(i=0 ; i < 4 ; i++)
{
printf("%d", outarr[i]);
}
printf("\n\n");
}
Code:
Another example
Code is 4742
if I guess 2474
Right 0, Almost 2
it should be almost 4, since 4 numbers match but all in the wrong position
The code should go in here
Code:
int comparearray(int codearr[], int guessarr[], int flagarr[])
{
int code, guess, flag;
int i=0, outer=0;
int right = 0, almost = 0;
for(i=0 ; i <4 ; i++) //rights
{
if(codearr[i] == guessarr[i])
// printf("Yes\n", guessarr[i]);
{
flagarr[i] = 1;
right++;
}
}
for(outer=0 ; outer < 4 ; outer++)
for(i=0 ; i <4 ; i++) //almost
{
if(codearr[outer] == guessarr[i]&&flagarr[outer]==0)
// printf("Yes\n", guessarr[i]);
{
flagarr[i] = 1;
almost++;
}
}
printf("Right %d , Almost %d\n", right, almost);
return(right);
}