#1 Le 26/04/2007, à 15:23
- lomdefer
Jeu mastermind a faire en C !!
Bonjour tout lem onde, j'ai donc un projet a faire qui est de recréer en langage C le jeu mastermind.
Le prof nous a bien evidement des consignes.
Le but est de rentrer en argument le nombre de couleur et une combinaison ,et l'ordinateur doit la trouver le plus vite possible mais avec les regles du jeu
Exemple : mastermind 6 1 6 4 6 5 2
Il y a donc 6 couleur (enfin les couleurs sont représenté par des chiffres) et ensuite la combinaison qui est :
1 6 4 6 5 2
bon, déja j'ai réussi a créer le bout du programme qui permet de lancer une combinaison aléatoirement, le voici :
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void usage(char *s){
printf("Usage : %s <nombre_de_couleur> <nombre_quelconque_d'entier>",s);
printf(" 1 <= entier <= nombre_couleur");
exit(-1);
}
int main(int argc, char *argv[]){
int nbre_couleur,nbre_aleat,i;
if (argc<2){
usage(argv[0]);
exit(-1);
}
nbre_couleur=atoi(argv[1]);
printf("Première combinaison : ");
for(i=0;i<nbre_couleur;i++){
/* initialisation fonction random */
srand(time(0)*(rand()%nbre_couleur)+1*(rand()%nbre_couleur)+1*(rand()%nbre_couleur)+1);
nbre_aleat = (rand()%nbre_couleur)+1; /* utilisation fonction random */
printf("%d ",nbre_aleat); /* qui donne un chiffre entre */
/* 1 et nbre_couleur */
}
printf("\n");
exit(0);
}
Bon, la le truc c'est que le programme affiche seulement une combinaison aléatoire a l'écran.
Ensuite ce qu'il faut faire c'est créer une fonction qui est le rôle des pions noirs et des pions blancs :
-il faut mettre autan de pion noir qu'il y a de pion bien placé
-il faut mettre autant de pions blanc qu'il y de pions mal placé mais qui sont dans la combianison a trouver.
Et c'est la que je bloque !!!!
Quelqu'un pourrait t-il me donneru ne piste ??
Hors ligne
#2 Le 26/04/2007, à 15:47
- best_friend_fr
Re : Jeu mastermind a faire en C !!
Salut
Moi, ce que je ferais, c'est 2 listes (une liste, c'est une structure contenant deux entiers et un pointeur vers une liste), en gros de la forme
struct Cellule
{
int blanc;
int noir;
struct Cellule *suivant;
};
typedef struct Cellule Cellule, *Liste;
Ensuite, pour remplir ca, tu parcourt la réponse, en comparant avec la solution pour compter les noirs, et en comptant les chiffres par couleur pour avoir le nombre de blanc.
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#3 Le 26/04/2007, à 15:48
- Skippy le Grand Gourou
Re : Jeu mastermind a faire en C !!
Y'a encore des profs qui enseignent le C ?!?
La France va à vau l'eau moi j'dis...
Fais un tableau d'entiers avec ta combinaison et un tableau d'entiers avec la combinaison de l'utilisateur. Ensuite tu scanne les deux tableaux en les comparant, et tu incrémentes un nombre "blanc" et un nombre "noir".
Hors ligne
#4 Le 26/04/2007, à 16:15
- Headphones
Re : Jeu mastermind a faire en C !!
Tu n'aurais pas cours à Seraing des fois ??
J'ai du faire le meme énoncé, il y a.... ouf, 10 ans
Hors ligne
#5 Le 26/04/2007, à 16:33
- aganim07
Re : Jeu mastermind a faire en C !!
Y'a encore des profs qui enseignent le C ?!?
La France va à vau l'eau moi j'dis...
Dans toutes les universités scientifiques de France pour commencer. C'est THE langage pour commencer l'impératif. C'est la porte d'entrée du monde Unix et le langage par excellence dans le monde de la Recherche avec le Fortran 90/95.
Hors ligne
#6 Le 26/04/2007, à 16:44
- Skippy le Grand Gourou
Re : Jeu mastermind a faire en C !!
Dans toutes les universités scientifiques de France pour commencer. C'est THE langage pour commencer l'impératif. C'est la porte d'entrée du monde Unix et le langage par excellence dans le monde de la Recherche avec le Fortran 90/95.
Désolé, j'ai plutôt tendance à voir du C++ autour de moi (d'accord, y'a souvent un viex printf qui traîne... ), ne serait-ce que pour commencer parce qu'on utilise ROOT et qu'il est écrit pour le C++...
Dernière modification par Skippy le Grand Gourou (Le 26/04/2007, à 16:44)
Hors ligne
#7 Le 27/04/2007, à 11:36
- lomdefer
Re : Jeu mastermind a faire en C !!
Alors voici mon programme qui a evoluer depuis hier, la il génère une liste aléatoire et en plus il compte le nombre de pions noir.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAGNITUDE_MAX 100 /* Au plus 100 chiffres pour la combinaison */
typedef int combinaison[MAGNITUDE_MAX];
void usage(char *s){
printf("Usage : %s <nombre_de_couleur> <nombre_quelconque_d'entier>",s);
printf(" 1 <= entier <= nombre_couleur");
exit(-1);
}
int main(int argc, char *argv[]){
int nbre_couleur,nbre_aleat,i,x,n=0;
combinaison aleat;
if (argc<3){
usage(argv[0]);
exit(-1);
}
/* déclaration des variables */
nbre_couleur=atoi(argv[1]);
printf("Première combinaison : ");
/* ici je génère une combinaison aléatoire */
for(i=0;i<nbre_couleur;i++){ srand(time(0)*(rand()%nbre_couleur)+1*(rand()%nbre_couleur)+1*(rand()%nbre_couleur)+1);
nbre_aleat = (rand()%nbre_couleur)+1;
aleat[i]=nbre_aleat;
printf("%d ",aleat[i]);
}
printf("\n");
/* ici je compte le nombre de pion noir */
printf("Il y a : ");
for(i=0;i<nbre_couleur;i++){
x=atoi(argv[i+2]);
if (aleat[i]==x){
n+=1;
}
else{
n+=0;
}
}
printf(" %d pion noir",n);
printf("\n");
exit(0);
}
Maintenant le probleme c'est que j'arrive pas a faire le bout du prog qui compte les pions blanc.
Je suis bien d'accord sur l'idée de mettre ma combinaison dans un tableau mais le souci c'est que la combinaison peut avoir entre 1 et 100 chiffres, pas plus, donc il faut que je créer un nombre max: #define MAX_TAB 100
et que je définisse un tableau : typedef combinaison[MAX_TAB]
MAis le souci c'est que si ma combinaison a plus de chiffre que le nombre de couleur je complète par quoi les cases du tableau auquelles corespondes aucun arguments ????
Hors ligne
#8 Le 27/04/2007, à 11:59
- Skippy le Grand Gourou
Re : Jeu mastermind a faire en C !!
Je suis bien d'accord sur l'idée de mettre ma combinaison dans un tableau mais le souci c'est que la combinaison peut avoir entre 1 et 100 chiffres, pas plus, donc il faut que je créer un nombre max: #define MAX_TAB 100
et que je définisse un tableau : typedef combinaison[MAX_TAB]
T'as vraiment pas le droit d'utiliser le c++ ? Ce serait tellement plus simple et plus propre avec un vector...
MAis le souci c'est que si ma combinaison a plus de chiffre que le nombre de couleur je complète par quoi les cases du tableau auquelles corespondes aucun arguments ????
Par des -1, qui ne correspondent à aucune couleur. Dès que tu vois un -1, tu sais que tu es à la fin de la combinaison.
Hors ligne
#9 Le 27/04/2007, à 12:11
- lomdefer
Re : Jeu mastermind a faire en C !!
Pas bêtes !!
Mais bon en ce qui concerne les pions blancs j'arrive pas a écrire cette partie la.
Il fautdrait que je vérifie chaque chiffre de la combinaison aléatoire avec chaque chiffre de la combinaison a trouver et si l'un est égale a l'autre mais qu'il n'ont pas le même indice j'ajoute 1 sinon 0.
Mais j'arrive pas à l'écrire !!!
Hors ligne
#10 Le 27/04/2007, à 12:44
- lomdefer
Re : Jeu mastermind a faire en C !!
Bon pour la fonction qui prend ma combinaison et qui la met dans un tableau j'ai un souci.
admeton, que j'ai un #define MAX_TAB 100 et un typedef int combinaison[TAB_MAX]
il faut que ma fonction prenne chaque chiffre qui compose la combinaison et la place dans une case du tableau. On pourra faire :
combinaison tab; /* création d'un tableau de 100 cases */
for(i=0;i<MAX_TAB,i++){
x==atoi(argv[i+2]); /* je change l'argument en entier pour pouvoir le mettre dans le tableau */
Et la est le souci c'est que quand mon argument est vide comment je peu le transformer en entier ???
Dernière modification par lomdefer (Le 27/04/2007, à 12:44)
Hors ligne
#11 Le 27/04/2007, à 13:03
- Skippy le Grand Gourou
Re : Jeu mastermind a faire en C !!
admeton, que j'ai un #define MAX_TAB 100 et un typedef int combinaison[TAB_MAX]
Utilise const int MAX_TAB=100; plutôt que #define.
combinaison tab; /* création d'un tableau de 100 cases */
for(i=0;i<MAX_TAB,i++){
x==atoi(argv[i+2]); /* je change l'argument en entier pour pouvoir le mettre dans le tableau */
Et la est le souci c'est que quand mon argument est vide comment je peu le transformer en entier ???
argv contient la liste des arguments, mais tu as aussi argc qui te donne le nombre d'arguments...
Hors ligne
#12 Le 27/04/2007, à 13:29
- lomdefer
Re : Jeu mastermind a faire en C !!
Bon voila grace a toi Skippy le Grand Gourou(et les autres aussi) j'ai pu faire evoluer mon prog.
Le voici :
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAGNITUDE_MAX 100 /* Au plus 100 chiffres pour la combinaison */
typedef int combinaison[MAGNITUDE_MAX];
void usage(char *s){
printf("Usage : %s <nombre_de_couleur> <nombre_quelconque_d'entier>",s);
printf(" 1 <= entier <= nombre_couleur");
exit(-1);
}
int main(int argc, char *argv[]){
int nbre_couleur,nbre_aleat,nbre_chiffre_combi,i,j,x,n=0;
combinaison aleat,tab;
if (argc<3){
usage(argv[0]);
exit(-1);
}
/* déclaration des variables */
nbre_couleur=atoi(argv[1]);
nbre_chiffre_combi=argc-2;
/* prend la combianison et la met dans un tableau */
for(j=0;j<nbre_chiffre_combi;j++){
x=atoi(argv[j+2]);
tab[j]=x;
}
printf("Première combinaison : ");
/* lance une combinaison ameatoire */
for(i=0;i<nbre_chiffre_combi;i++){
srand(time(0)*(rand()%nbre_couleur)+1*(rand()%nbre_couleur)+1*(rand()%nbre_couleur)+1);
nbre_aleat = (rand()%nbre_couleur)+1;
aleat[i]=nbre_aleat;
printf("%d ",aleat[i]);
}
printf("\n");
printf("Il y a : ");
/* calcul le nombre de pion(s) noir(s) */
for(i=0;i<nbre_chiffre_combi;i++){
x=atoi(argv[i+2]);
if (aleat[i]==tab[i]){
n+=1;
}
else{
n+=0;
}
}
printf(" %d pion noir",n);
printf("\n");
exit(0);
}
La il met la combinaison a trouver dans un tableau ensuite il lance un combinaison aleatoire qu'il met dans un tableau egalement, pui en comparant les tableaux il calcul le nombre de pions noirs, mais j'arrive toujours pas a faire la partie ou il calcul les pions blanc.
Et en plus je suis sur qu'on peu mettre ensemble la partie ou il calcul les pions noirs et celle ou il calcul les pions blancs simplement en donnant une varaible pour les pions noirs et une différente pour les pions blancs.
Mais comment faire ??
Hors ligne
#13 Le 30/04/2007, à 10:10
- lomdefer
Re : Jeu mastermind a faire en C !!
Voici mon code qui a evoluer, maintenant il calcul lespions noirs et les pions blancs mais ensuite arrive la partie la plus difficile, trouver grace au nombre de pions noirs et de pions blancs la logique pour trouver la combinaison en moi de coup possible et la j'avoue que je suis a la rue ...
voici mon code :
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAGNITUDE_MAX 100 /* Au plus 100 chiffres pour la combinaison */
typedef int combinaison[MAGNITUDE_MAX];
void usage(char *s){
printf("Usage : %s [nombre_de_couleur] [pion 1] [pion 2]...[pion n\n",s);
printf(" 0 < nombre_de_couleur < 100\n");
exit(-1);
}
int main(int argc, char *argv[]){
int nbre_couleur,nbre_aleat,nbre_chiffre_combi,i,j,x,n=0,m=0;
combinaison aleat,tab;
if (argc<3){
printf("*****Attention vous n'avez pas renté de combinaison.*****\n");
usage(argv[0]);
exit(-1);
}
/* déclaration des variables */
nbre_couleur=atoi(argv[1]);
nbre_chiffre_combi=argc-2;
/* prend la combinaison et la met dans un tableau */
for(j=0;j<nbre_chiffre_combi;j++){
x=atoi(argv[j+2]);
if ((x<1)||(x>nbre_couleur)){
usage(argv[0]);
exit(-1);
}
tab[j]=x;
}
/* lance une combinaison aleatoire et la met dans un tableau */
printf("Je lance : ");
for(i=0;i<nbre_chiffre_combi;i++){
srand(time(0)*(rand()%nbre_couleur)+1*(rand()%nbre_couleur)+1*(rand()%nbre_couleur)+1);
nbre_aleat = (rand()%nbre_couleur)+1;
aleat[i]=nbre_aleat;
printf("%d ",aleat[i]);
}
printf("\n");
/* calcul le nombre de pion(s) noir(s) */
printf("Il y a ");
for(i=0;i<nbre_chiffre_combi;i++){
if (aleat[i]==tab[i]){
n+=1;
aleat[i]=101;
tab[i]=101;
}
else{
n+=0;
}
}
/* calcul du nombre de pion(s) blanc(s) */
for(i=0;i<=nbre_chiffre_combi;i++){
for(j=0;j<=nbre_chiffre_combi;j++){
if (((aleat[i]==tab[j])&&(i!=j)&&(aleat[i]!=101)&&(tab[i]!=101))){
m+=1;
aleat[i]=101;
tab[i]=101;
}
}
}
printf("%d pion(s) noir(s) et %d pion(s) blanc(s)",n,m);
printf("\n");
exit(0);
}
Quelqu'un aurait-il une piste pour m'eclaire ??
Hors ligne
#14 Le 30/04/2007, à 12:11
- Skippy le Grand Gourou
Re : Jeu mastermind a faire en C !!
ensuite arrive la partie la plus difficile, trouver grace au nombre de pions noirs et de pions blancs la logique pour trouver la combinaison en moi de coup possible
Euh... C'est le programme qui doit trouver la bonne combinaison ?
Hors ligne
#15 Le 30/04/2007, à 16:18
- best_friend_fr
Re : Jeu mastermind a faire en C !!
Salut
Tu as des solutions présentées ici
http://www.antsearch.univ-tours.fr/ea/default.asp?FCT=DP&ID_PAGE=25
Bon courage
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#16 Le 02/05/2007, à 10:56
- lomdefer
Re : Jeu mastermind a faire en C !!
EN gros ce que j'ai compris de l'algorithme a écrire c'est que tout d'abord je doit lancer une combinaison au hasard ensuite en fonction du nombre de pions noirs et de pions blancs je lance une autre combinaison qui doit être une solution probable par rapport au nombre de pions noirs et blancs précédent tout en gardant la combinaison précédente en mémoire pour pouvoir avancer.
C'est dur !!
Hors ligne
#17 Le 02/05/2007, à 12:34
- hind_flo
Re : Jeu mastermind a faire en C !!
J'ai déjà fais cette exercice.
Un consei: procède dans la réalités en notant en Français tout ce que tu fais.
Enssuite convertie le en c.
Hors ligne
#18 Le 02/05/2007, à 13:34
- lomdefer
Re : Jeu mastermind a faire en C !!
C'est ce que je fais...mais en fait ce que j'arrive pas a faire c'est de créer une fonction qui enregistre chaque combinaison lancer avec le nombre de pion noir et le nombre de pion blanc je pensais a faire une structure, un truc du genre :
struct combinaison{
int tab[MAX_TAB]; /* combinaison dedans */
int pion_noir;
int pion_blanc;
}
Mais bon la c'est toujours pareil j'arrive pas a écrire la fonction qui va, a chaque combianison lancer la ranger dans une structure propre a elle même pour pouvoir se reservir plutard de cette combinaison.
Hors ligne
#19 Le 03/05/2007, à 10:24
- lomdefer
Re : Jeu mastermind a faire en C !!
Bon ben la j'ai modifier mon programme j'ai simplement mis des structure mais sa ne me simplifie pas la tâche pour autant...
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAGNITUDE_MAX 100 /* Au plus 100 chiffres pour la combinaison */
typedef int tab[MAGNITUDE_MAX];
void usage(char *s){
printf("Usage : %s [nombre_de_couleur] [pion 1] [pion 2]...[pion n\n",s);
printf(" 0 < nombre_de_couleur < 100\n");
exit(-1);
}
int main(int argc, char *argv[]){
int nbre_couleur,nbre_aleat,nbre_chiffre_combi,i,j,x,n=0,m=0;
/* déclaration des variables */
nbre_couleur=atoi(argv[1]);
nbre_chiffre_combi=argc-2;
typedef struct {
tab n;
int pion_noir;
int pion_blanc;
} combinaison;
if (argc<3){
printf("*****Attention vous n'avez pas renté de combinaison.*****\n");
usage(argv[0]);
exit(-1);
}
printf("\n");
/* prend la combinaison et la met dans un tableau */
combinaison depart;
for(j=0;j<nbre_chiffre_combi;j++){
x=atoi(argv[j+2]);
if ((x<1)||(x>nbre_couleur)){
usage(argv[0]);
exit(-1);
}
depart.n[j]=x;
}
depart.pion_noir=nbre_chiffre_combi;
depart.pion_blanc=0;
/* lance une combinaison aleatoire et la met dans un tableau */
combinaison aleatoire;
printf("Je propose : ");
for(i=0;i<nbre_chiffre_combi;i++){
srand(time(0)*(rand()%nbre_couleur)+1*(rand()%nbre_couleur)+1*(rand()%nbre_couleur)+1);
nbre_aleat = (rand()%nbre_couleur)+1;
aleatoire.n[i]=nbre_aleat;
printf("%d ",aleatoire.n[i]);
}
/* calcul le nombre de pion(s) noir(s) */
printf(" Reponse : ");
for(i=0;i<nbre_chiffre_combi;i++){
if (aleatoire.n[i]==depart.n[i]){
n+=1;
aleatoire.n[i]=101;
depart.n[i]=101;
}
else{
n+=0;
}
}
aleatoire.pion_noir=n;
/* calcul du nombre de pion(s) blanc(s) */
for(i=0;i<=nbre_chiffre_combi;i++){
for(j=0;j<=nbre_chiffre_combi;j++){
if (((aleatoire.n[i]==depart.n[j])&&(i!=j)&&(aleatoire.n[i]!=101)&&(depart.n[i]!=101))){
m+=1;
aleatoire.n[i]=101;
depart.n[i]=101;
}
}
}
aleatoire.pion_blanc=m;
printf("%d noir(s) et %d blanc(s)",n,m);
printf("\n\n");
exit(0);
}
Hors ligne
#20 Le 03/05/2007, à 17:41
- hind_flo
Re : Jeu mastermind a faire en C !!
Est-ce qu'un nombre de tour maximal peu être instauré?
Hors ligne
#21 Le 05/05/2007, à 11:01
- lomdefer
Re : Jeu mastermind a faire en C !!
Non il n'y a pas de tour maximal, il faut que l'ordi trouve la soluce en faisant le moin de combi possible c'est tout.
Dernière modification par lomdefer (Le 05/05/2007, à 11:02)
Hors ligne
#22 Le 05/05/2007, à 12:59
- RBC
Re : Jeu mastermind a faire en C !!
Si tu veux être sur que l'ordinateur trouve toujours la (ou les solutions les plus courtes), il faut que tu construise un arbre de toutes les possibilités puis tu regardes laquelle te permet d'atteindre la solution le plus rapidement.
Hors ligne
#23 Le 12/05/2007, à 09:31
- nana
Re : Jeu mastermind a faire en C !!
bonjour lomdefer!bonjour tout le monde
moi aussi j'ai le meme projet a rendre le 18 mai,et comme je suis en option math l'informatique c'est un peu du chinois pour moi,pourtant j'ai deja fait mon programme et c'est grace a lomdefer que j'ai pu l'evolué mais il reste tjrs des failles:| car le programme ne fait pas ce qu'il est censé de faire.alors si vous pouvez m'aider sur ce sujet la je serai reconnaisssante
#24 Le 12/05/2007, à 11:53
- hind_flo
Re : Jeu mastermind a faire en C !!
@RBC mauvaise idée.
Il y as vraiment trop de solution (programme long et lourd) et ça exigerais une réécriture total du programme à chaque modification (si il rajoute une couleur par exemple).
Si vous voulez j'essayerais de retrouver comment j'ai fais.:)
Hors ligne
#25 Le 12/05/2007, à 13:07
- guil
Re : Jeu mastermind a faire en C !!
salut, perso je ferais un truc dans ce style (en supposant que si il y a 4 couleurs, il faut utiliser les 4 et qu'on ne peut les utiliser qu'une fois).
/*
* - soit a le nombre de pion utilisé pour définir la combinaison, correspondant
* au nombre de couleur (si a=4 la combinaison utilise 1, 2, 3 et 4)
* - soit C la combinaison, et C1 à Ca les pions de cette combinaison
* - soit P la proposition et P1 à Pa les pions de cette proposition
* - soit X(n) le nombre de pions bien placés au tour n (X(n-1) est donc le nombre
* de pions bien placés au tour n-1)
* - soit Y(n) le nombre de pions mal placés au tour n (y(n-1) est donc le nombre de
* pions mal placés au tour n-1)
*
* exple:
* a=4
* combi: 4 2 1 3
* P(1): 1 1 1 1 X(1):1 Y(1):0 => Y(1)=0 on ajoute une couleur
* P(2): 1 2 2 2 X(2):1 Y(2):1 => X(1) = X(2) le 1 est donc mal placé
* P(3): 2 1 2 2 X(3):0 Y(3):2 => X(2) < X(3) seul les 2 premiers ont changé,
* c'est donc le 2 qui est en 2
* P(4): 2 2 1 2 X(4):2 Y(4):0 => Y(4)=0 on ajoute une couleur
* P(5): 2 3 1 3 X(5):1 Y(5):2 => X(5) < X(4)
* P(6): 3 2 1 3 X(6):3 Y(6):0 => Y(6)=0 1, et 2 sont bien placé on ajoute une
* couleur
* P(7): 3 2 1 4 X(7):2 Y(7):2 => X(7) < X(6) seuls les extreme ont changé
* P(8): 4 2 1 3 X(8):4 Y(8):0 => OK
*
*/
#include<stdio.h>
#include<stdlib.h>
// le nombre de pions à utiliser
#define nbPions 4
int main(int argc, char *argv[]){
int combi[nbPions] = {2, 3, 4, 1}; // la combi à trouver, (doit pas être en dur bien sûr)
int propo [100][nbPions]; // les propositions (devrait être dynamique)
int bienPlace [100][nbPions]; // les pions bien placé (dynamique aussi)
int malPlace [100][nbPions]; // les pions mal placé
int aPlace=0; // on fait une chose à la fois, voici le pion qu'on veut placer
int n=-1; // le nombre d'essai (pour ranger dans les différents tableaux)
int c[100]; // le nombre de pion qu'on utilise pour la combi
int x[100]; // le nbr de pions bien placé à chaque tour (devrait être dynamique)
int y[100]; // le nbr de pions mal placé à chaque tour (idem )
// affiche la combi
printf("\t%d %d %d %d\n", combi[0], combi[1], combi[2], combi[3]);
printf("------------\n");
// j'initialise juste parce que c'est pas dynamique
for(int i=0 ; i<100 ; i++) {
x[i]=0;
y[i]=0;
c[i]=0;
for(int j=0 ; j< nbPions ; j++) {
bienPlace[i][j]=-1;
malPlace[i][j]=-1;
}
}
//et let's go!
c[0]=1;
while(x[n] != nbPions) {
n++;
if(n>0 && !y[n-1]) {
// si il y a eu un tour précédent et qu'on a aucun pion mal placé
// on ajoute un couleur
c[n] = c[n-1]+1;
// on sait pas encore ou est la couleure précédente, c'est elle qui
// est à placer
aPlace=c[n-1];
} else {
// sinon le nbr de couleur de ce tour est le même qu'au précédent
// (ou la 1 si c'est le premier tour)
c[n] = n>0 ? c[n-1]:1;
}
// construit la proposition
for(int i=0 ; i<nbPions ; i++) {
propo[n][i] = -1;
}
// on met les bien place
for(int i=0 ; i<nbPions ; i++) {
if(bienPlace[n-1][i] != -1) {
propo[n][i] = bienPlace[n-1][i];
}
}
// on met le a place en tenant compte des mals placés et en oubliant pas
// que dans la combi finale chaque pions ne peut être utilisé qu'une
// fois
bool pose=false;
for(int i=0 ; i<nbPions ; i++) {
if(malPlace[n-1][i] == -1 && !pose) {
propo[n][i] = aPlace;
pose=true;
}
}
// on rempli le reste avec la dernière couleur
for(int i=0 ; i<nbPions ; i++) {
if(propo[n][i]==-1) {
propo[n][i] = c[n];
}
}
printf("\t%d %d %d %d", propo[n][0], propo[n][1], propo[n][2], propo[n][3]);
// calcul x[n] et y[n]
for(int i=0 ; i<nbPions ; i++) {
for(int j=0 ; j<nbPions ; j++) {
if(propo[n][i] == combi[j]) {
if(i==j) {
// lui est bien placé
x[n]++;
if( (x[n] + y[n]) > c[n]) {
y[n]--;
}
} else {
// lui non
if( (x[n] + y[n]) < c[n]) {
y[n]++;
}
}
}
}
}
printf(" => %d bien placé et %d mal placé\n", x[n], y[n]);
if(x[n] == nbPions && y[n]==0) {
// si le nombre de pion bien placé est égale au nombre de pion (et
// aucun n'est mal placé, juste au cas où) alors c'est fini
printf("la combinaison est trouvé\n");
exit(0);
}
// on interprète le résultat
if(x[n]<=x[n-1] || x[n]<c[n]) {
// dnas ce cas comme on à moins de bien placé qu'a la proposition
// precedente on sait que le pion a place n'est pas au bon endroit,
// on garde cette mauvaise position dans le tableau des pions mal
// placés
for(int i=0 ; i<nbPions ; i++) {
// on oubli pas de conserver ceux qui sont déjà bien placé
if(bienPlace[n-1][i] != -1) {
bienPlace[n][i] = bienPlace[n-1][i];
}
if(malPlace[n-1][i] != -1) {
// on garde aussi les autres mauvaises positions
malPlace[n][i] = malPlace[n-1][i];
} else if(propo[n][i]==aPlace) {
malPlace[n][i] = aPlace;
}
}
} else if(y[n]==0 && c[n]>1) {
// ici il n'y a pas de pions mal placés, on sait donc où est le pion
// à placer
for(int i=0 ; i<nbPions ; i++) {
if(bienPlace[n-1][i] != -1) {
bienPlace[n][i] = bienPlace[n-1][i];
} else if(propo[n][i]==aPlace) {
bienPlace[n][i] = aPlace;
}
}
}
if(n==99) {
// game over, plus de place dans les tableaux
exit(0);
}
}
}
beh voilà ca ma passé la matinée, ca faisait longtemps que j'avais pas fait un truc dans ce style, j'espère que ca vous aidera, bon courrage.
Hors ligne