0

I have been trying to make a program which assists with a game called "Mastermind". If you are not familiar with this game it simply goes like this: there is a code which needs to be guessed, one player makes this code while another player tries to guess it, based on the guess the player gets a black peg for each of the letters he guessed which were in the right place, a white peg of each letter which was in the wrong place and belongs somewhere else in the pattern and finally no peg if the letter does not occur at all.

My program is supposed to take in the guess, the number of white pegs and the number of black pegs and output all possible solutions. Plus one of the requirements is that the program must use recursion.

Sample of how program should run:

Enter the pattern length: 3

Input the guess pattern: abc

Enter the number of black pegs in the feedback: 2

Enter the number of white pegs in the feedback: 0

The possible key patterns are:

aac 

aba

abb

abd

abe

abf

acc

adc

aec

afc

bbc

cbc

dbc

ebc

fbc

As you will be able to see by running the code I wrote my program obviously does not give the same output. (By the way i also converted the char array inputted to an int array and printed the contents as char)

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>


    void userEnter(int*pattern, int n);
    void print( int * s, int n);
    void recurs( int * s, int * a, int n, int wpegs, int bpegs);
    bool Done (int*s);
    bool bPegs(int*a ,int*s, int bpegs, int wpegs, int n);
    bool wPegs(int* modcom, int* modoriginal, int*s, int wpegs, int w);
    void change(int*modoriginal, int*modcom, int i, int k, int w);

    int main(void)
    {
        int i, n, bpegs, wpegs;

        printf("Enter the pattern length: ");
        scanf("%d",&n);
        int *a = malloc(n * sizeof *a);
        printf("Input the guess pattern: ");
        int pattern[n];
        userEnter(pattern, n);  
        printf("Enter the number of black pegs in the feedback: ");
        scanf("%d",&bpegs);
        printf("Enter the number of white pegs in the feedback: ");
        scanf("%d",&wpegs);
        printf("The possible key patterns are: ");
        for(i=0; i<=n-1; i++)
        {
            a[i]=0;
        }
        print(a, n);
        recurs(a, pattern, n, wpegs, bpegs);

    }

    void userEnter(int*pattern, int n)
    {
        char input[n];
        scanf("%s",input);

        int i;
        for(i = 0; i < n-1; i++)
        {
            pattern[i] = input[i]-65;
        }
    }

    void print( int * s, int n)
    {
        int i; 
        printf( "\n" );
        for( i = n-1; i >= 0; i-- )
        {
            printf( "%c", ( s[ i ] + 65 ) );
        }
    }

    void recurs( int * s, int * a, int n, int wpegs, int bpegs)
    {

        int i;


        if(Done(s))
        {
            print( s, n);
            printf( "\nAccomplisshed!\n" );
        }

        else{
            s[ 0 ] += 1;
            for( i = 0; i < n-1; i++ )
            {
                if( s[ i ] == 6 ){
                    s[ i ] = 0;
                    s[ i + 1 ] += 1;
                }
            }
            if(bPegs(a ,s, bpegs, wpegs, n))
            {
            print( s, n);
            }
            recurs(s, a, n, wpegs, bpegs);
        }
    }

    bool Done (int*s)
        {
            int i;
            bool done=true;
            for (i=0;i<=11;i++)
            {
                if(s[i]!=5)
                {
                    done=false;
                }
            }
            return done;
        }


    bool bPegs(int*a ,int*s, int bpegs, int wpegs, int n)
    {
        int i,j,c=0;
        bool d = false;
        for(i=0; i<n-1; i++)
        {
            if(a[i]=s[i])
            {
                c++;
            }
        }
        int x =n-c;
        int* modcom; 
        int*modoriginal;
        modcom=(int*)malloc((x)*(sizeof(int)));
        modoriginal=(int*)malloc((x)*(sizeof(int)));
        int w=0;
        for(j=0; j<n-1; j++)
        {
            if(a[j]!=s[j])
            {
                modcom[w]=s[j];
                modoriginal[w]=a[j];
                w++;
            }       
        }
        if(c=bpegs)
        {
            d = wPegs(modcom, modoriginal, s, wpegs, w);
        }

        return d;

    }

    bool wPegs(int*modcom, int*modoriginal, int*s, int wpegs, int w)
    {
        int i, k, count=0;
        for(i=0; i<=w; i++)
        {
            for(k=0; k<=w; k++)
            {
                if (modoriginal[i]==modcom[k])
                {
                    count++;
                    change(modoriginal, modcom, i, k, w);
                }
            }
        }
        if(wpegs=count)
        {
            return true;
        }

    }

    void change(int*modoriginal, int*modcom, int i, int k, int w)
    {
        int c, o;
        for(c=i-1; c<w-1; c++)
        {
            modoriginal[c]=modoriginal[c+1];
        }
        for(o=k-1;o<w-1;o++)
        {
            modcom[o]=modcom[o+1];
        }
    }
Easytoread
  • 23
  • 1
  • 5
  • This: `int *a = (int*)malloc((n)*(sizeof(int)));` is better written as `int *a = malloc(n * sizeof *a);`. It's shorter, safer, and just better (see [don't cast `malloc()`'s return value in C](http://stackoverflow.com/a/605858/28169) for details). – unwind Nov 16 '12 at 10:42

1 Answers1

3

You are missing & in your scanf:

int bpegs, wpegs;
...
scanf("%d",bpegs);
scanf("%d",wpegs);
codaddict
  • 445,704
  • 82
  • 492
  • 529