Resolution mastermind

Contenu du snippet

Un petit prog de resolution de Mastermind. C'est programmé un peu rapidement, mais ca marche plutot bien.

Source / Exemple :


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

#define MAX_COLOR 8
#define MAX_PION 7

int pion[MAX_PION];
int combi[50][MAX_PION];//pour stoker toutes les combinaisons test
int bp[50],mp[50];//pour stoker le nombre de bien/mal placé des combinaisons

int ok=0;
int coups=0;

//test des pions bien plac
int testbp(int no)
{
	int i=0;
	for (int j=0;j<MAX_PION;j++)
	if (combi[no][j]==pion[j])i++;
	return i;
}

//test des pions mal plac
int testmp(int no)
{
	int tmpcomb[MAX_PION];
	int tmpplac[MAX_PION];
	int i,j,plac=0;
	for (i=0;i<MAX_PION;i++)
	{
		tmpcomb[i]=combi[no][i];
		tmpplac[i]=pion[i];
	}
	for (i=0;i<MAX_PION;i++)
	for (j=0;j<MAX_PION;j++)
	if (i==j)
	if (tmpcomb[i]==tmpplac[j])
	{
		tmpcomb[i]=-1;
		tmpplac[j]=-2;
	}
	for (i=0;i<MAX_PION;i++)
	for (j=0;j<MAX_PION;j++)
	if (i!=j)
	if (tmpcomb[i]==tmpplac[j])
	{
		plac++;
		tmpcomb[i]=-1;
		tmpplac[j]=-2;
	}
	return plac;
}
int cherchecomb(int p)
{
	int i;
	while (pion[p]<MAX_COLOR)
	{
		if (p)
		{
			if (cherchecomb(p-1))return 1;
		}
		else
		{
			if (!ok)
			{
				printf("\ncombinaison:  ");
				for (i=0;i<MAX_PION;i++)
				printf("%d ",pion[i]);
				printf("\nBP??:");
				scanf("%d",&bp[coups]);
				if (bp[coups]==MAX_PION)return 1;
				printf("\nMP??:");
				scanf("%d",&mp[coups]);
				for (i=0;i<MAX_PION;i++) combi[coups][i]=pion[i];
				coups++;
				ok=1;
			}
			ok=0;
			for (i=0;i<coups;i++)
			if ((mp[i]==testmp(i))&&(bp[i]==testbp(i)))ok++;

			if (ok==coups)
			{
				ok=0;

			}
			else
			{
				ok=1;
				pion[0]++;
			}
		}
	}
	pion[p]=0;
	if (p<MAX_PION)pion[p+1]++;
	return 0;
}
int main(void)
{

	int i;

	srand ((unsigned)time (0));
	for (i=0;i<MAX_PION;i++)
	pion[i]=rand()%(MAX_COLOR-1);

	while (!cherchecomb(MAX_PION));
	return 0;
}

Conclusion :


Si quelqu'un a un algo de resolution plus performant, je suis preneur!!
L'interet de commencer avec des combinaisons aleatoire et de ne pas pouvoir toujours pieger le programme avec la meme combinaison.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.