Projet en C

Résolu
cs_sousi20 Messages postés 13 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 16 juin 2011 - 30 avril 2007 à 23:58
 cs_mish - 4 mai 2007 à 01:55
Bsr, je m'appelle souad , je suis etudiante à la faculté branche maths-info,je suis en train de realiser un projet en C jeu des allumettes trés connu, le probléme qu'il faut realiser deux programme,s le premier :deux joueurs joue l'un contre l'autre le deuxieme :un etre humain joue contre le PC j'ai trouvé des difficulté à programmé le deuxieme surtout qu'il faut pas mettre le programmes à une situation gangante ou perdante mais faut suivre une stratégie qui se base sur l'inteligence artificielle ,puis je trouver qelqu'un qui a une idée qui peux m'aider ou une fonction bien structuré qui peut faire ce role ,
dans l'attente d'une reponse je vous remercie d'avance
cordialement sousi20 

24 réponses

THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
1 mai 2007 à 01:48
<endl>Souvent la technique "aléatoire" donne de bons résultats: c'est à dire que l'ordinateur choisit aléatoirement le nombre d'allumettes à retirer, sauf a la fin où selon le nombre d'allumettes restantes il choisit de retirer le nombre d'allumettes lui permettant de gagner.
D'autres possibilités: reproduire le jeu de l'utilisateur ou encore prendre toujours le meme nombre d'allumettes, etc. A toi de tester la meilleure strategie.</endl>
3
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
1 mai 2007 à 13:45
salut un algorithme de type alpha beta serait très bien

pour l'implémenter il faut que tu aies déja programmé les fonctions suivantes:

énumérer tous les coups que l'ordi peut jouer à un moment donné
énumérer tous les coups que l'adversaire peut jouer à un moment donné
détecter que la partie est finie: que l'ordi a gagné ou que le joueur a gagné

et c'est tout, ces fonctions sont la seule différence entre un alpha béta pour un morpion ou un alpha béta pour ton jeu d'alumettes

http://fearyourself.developpez.com/tutoriel/sdl/morpion/part6/
3
cs_sousi20 Messages postés 13 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 16 juin 2011
1 mai 2007 à 15:54
Bjr,j'ai déja programmé une fonction aleatoire mais ça pa marcher ya tjrs lui qui gagne ou bien c moi qui gagne peut tu m''aider plus
0
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
1 mai 2007 à 19:48
Je comprend pas trop: l'un des deux doit bien pouvoir gagner au bout du compte?
Le jeu des allumettes,  c'est bien celui ou chacun son tour doit retirer jusqu'à 3 allumettes sans jamais retirer la derniere?<endl></endl>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_sousi20 Messages postés 13 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 16 juin 2011
1 mai 2007 à 22:46
oui c bien evident c ça le jeu, mais faut le programmer avec une intelligence artificielle c'est à dire le PC doit réflechir comme etant un humain et non pas tjrs l'etre humain qui gagne tu peux m'envoyé si jamais tu as le code du jeu .
0
cs_sousi20 Messages postés 13 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 16 juin 2011
1 mai 2007 à 22:49
bsr, 'ai chercher la notion de minmax, et j'ai pas bien compris le but de cette sratégie si tu as deja le jeu programmé tu peux m'envoyé le code de ses fonctions parcque j'ai du mal à les programmer
cordialement
0
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
1 mai 2007 à 22:52
Je n'ai pas le code du jeu, désolé. Faire reflechir l'ordinateur comme un etre humain n'est pas évident car justement à ce jeu, l'etre humain (moyen) n'a pas vraiment de stratégie tout le long du jeu, sauf à la fin ou selon le nombre d'allumettes restantes il choisit de retirer le nombre d'allumettes lui permettant de gagner.<endl></endl>
0
cs_sousi20 Messages postés 13 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 16 juin 2011
1 mai 2007 à 22:54
c déja fait ça , mais c lui qui gagne tjrs,tu veux ke je t'enos le code source
0
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
1 mai 2007 à 23:01
<endl>Si tu pouvais simplement mettre en ligne (un simple post sur cette page suffira) la fonction traitant de l'intelligence artificielle..</endl>
0
cs_sousi20 Messages postés 13 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 16 juin 2011
1 mai 2007 à 23:05
nn je c pas le faire , voila le code de la fonction de l'ordi
int jeu_ordi (int nb_allum, int prise_max){
int prise = 1;


int s = 0;


float t = 0;


s = prise_max + 1;


t = ((float) (nb_allum - s)) / (prise_max + 1);


while (t != floor (t))


{
s++;
t = ((float) (nb_allum-s)) / (prise_max + 1);


}
prise = s - 1;


if (prise == 0)


prise = 1;


return (prise);


}
0
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
2 mai 2007 à 07:42
Salut, on s'est vu hier sur le channel, c'est bipbip.

Je t'ai aidé la dessus, et je me demandais ou tu en étais ?

Je te recapitule.

TOI:
 <Guest9745> je cherche à le programmer par les notions que j'ai comme ça le jour des soutenance je serai capable de repondre à <Guest9745> je l'ai déja programmé par une fonction aleatoire 
MOI
  Guest9745: tu veux faire en sorte que l'ordinateur joue le meilleur coup possible ?
mai 01 17:53:46 <Guest9745> c'st ce que j'essaye à faire
mai 01 17:54:17  Guest9745: une configuration du jeu des allumettes c'est un nombre d'allumettes + le numero du joueur
mai 01 17:54:19  donc
mai 01 17:54:30  a chaque configuration on va retourner une valeur
mai 01 17:54:33  donc
mai 01 17:54:47 <Guest9745> oui
mai 01 17:54:55  one: on veut creer une fonction "int getValeur(int nbrAllu, int joueur);"
mai 01 17:55:08  puis pour choisir quel coup jouer c'est facile si on a cette fonction
mai 01 17:55:15  on est ok donc il suffit de fairemai 01 17:55:34  int coup1 getValeur(nbrAllu-1, autreJoueur); int coup2 getValeur(nbrAllu-2, autreJoueur); int coup3 = getValeur(nbrAllu-3, autreJoueur);

mai 01 17:55:57 <Guest9745> je vais t'expliquer le programme
mai 01 17:59:38 <Guest9745> http://rafb.net/p/gTWmve81.html

mai 01 18:01:10  c'est quelle fondtion qui te plante
mai 01 18:01:32  int jeu_ordi (int nb_allum, int prise_max) <--- ca ?
mai 01 18:01:39 <Guest9745> oui
mai 01 18:02:10  ok
mai 01 18:02:51  Guest9745: ca joue pas le meilleur coup possible ca, si ? c'est pas du minmax ca
mai 01 18:03:15 <Guest9745> oui je sais c'est une fonction aleatoire
mai 01 18:03:24 <Guest9745> plus ou moins
mai 01 18:03:37  ok
mai 01 18:03:42  alors pour le minmax

La commence la fonction:

 on fait cette fonction

 -Il te faut faire ca: "int valeur(int nb_allum, int prise_max, int joueurEnCours, int joueurOrdi)" qui va te renvoyer la valeur d'un coup, plus la valeur sera grande plus le coup est bon
Ton autre fonction donc, oui, tu la gardes aussi. Car en fait l'autre fonction jeu_ordi va appeler cette nouvelle fonction "valeur"

-Car une fois que tu as valeur c'est facile de faire jeu_ordi bref

Donc.. ok on va supposer que tu as la fonction valeur deja.
- la fonction jeu_ordi ca va juste etre:
 for (i=1; i<=maxNbAllu; i++) { if (valeur(..., i, ...)>=maxValeurCourante) { meilleurCoup = i; maxValeurCourante = valeur(..., i, ...); } return meilleurCoup;

Deja si nbAllu<=maxAllu la fonction renvoie +INFINI si joueurEnCours==ordi, -INFINI  sinon :
 nbAllu>maxAllu
- Donc faut calculer le max (si joueurEnCours==ordi) ou le min (si joueurEnCours!=ordi) de tous les appels recursifs de valeur, pour i de 1 a maxAllu
- Donc en gros ca donne:
 if (joueurEnCours==ordi) { for (i=1; i<=maxAllu; i++) { v = valeur(..., i, ...); if (v>=meilleureValeur) { meilleureValeur = v; meilleurCoup = i; } } else { ... }
mai 01 18:41:28 

TOI:
 tu peux me l'envoyé ?

- Voilà, je t'ai fait un C/C de notre discussion sur #programmation.
Si tu as encore besoin, tu le dis. Mais je pense qu'avec tout ça, tu devrais être lancée, et bonne chance à toi!
@++
0
cs_sousi20 Messages postés 13 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 16 juin 2011
2 mai 2007 à 20:55
bsr,merci pour tout c trés gentil
bon c que je veux savoir ,jevais avoir deux fonction ,
une fonctin de intvaleur(.........) que je vais l'appeler dans la fonction jeu_ordi est ce que je vais garder la meinne de plus ou bien celle a ça suffira et peux tu me donner des indications sur la fonction int valeur(...) et vous avez dit si nbAllu<=maxAllu la fonction renvoie +INFINI si joueurEnCours==ordi, -INFINI j'ai pas bien compris cette instruction et je veux savoir est ce que tu a toujours le programme que je t'ai donné et qu'est ce que vous pensiez de ce programme comme projet et désolé si je t'ai dérangé et si j'ai du mal à comprendre je suis pa trés doué en ça
et merci
je dois rendre le travail le vendredi
0
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
2 mai 2007 à 22:39
Salut, c'est bipbip, je vais tenter d'etre encore plus explicite.

- Oui tu vas avoir deux fonctions : valeur et jeu_ordi.
- Ta fonction jeu_ordi tu l'effaces et tu la remplaces par la mienne. Ca va calculer le meilleur coup a jouer pour l'ordinateur.
- La fonction valeur renvoie le meilleur score possible pour un coup. Ca va renvoyer 1 si l'ordinateur gagne, -1 s'il perd.
donc:
int valeur(int nbAllu, int maxAllu, int joueurEnCours, int autreJoueur) {
  if (joueurEnCours==autreJoueur) {
    if (nbAllu==1) {
      return 1; // l'autre joueur perd
    }
    if (nbAllu<=maxAllu+1) {
      return -1; // l'ordinateur perd
    }
    return minimum pour i de 1 a maxAllu de [ valeur(nbAllu-i, maxAllu, !joueurEnCours, autreJoueur) ];
  }
  else {
    ...
  }
}
Pour la derniere instruction tu vas devoir faire une boucle ou bien une autre fonction qui va faire une boucle sur i. Je te laisse chercher un peu.
Et pour le else, c'est pareil sauf que tous les 1 deviennent -1 et vice-versa, et minimum devient maximum.

Bon courage pour vendredi.
Je suis malade, désolée de la reponse tardive.
@++
0
cs_sousi20 Messages postés 13 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 16 juin 2011
3 mai 2007 à 23:27
bonsoir, dsl je t'ai pas repondu hier j'espere que ça va mieux aujord hui et bon retablissement
bon voila les fonctions

int jeu_ordi(int  meilleureValeur,intminimunValeurint)
{int meilleureValeur,v,minimunValeur,i;
if (joueurEnCours==ordi)
for (i=1; i<=maxAllu; i++)
{ v =valeur(nbAllum-i,maxAllum, joueurEncours,autre joueur);
if
(v>=meilleureValeur) { meilleureValeur v; meilleurCoup i;
return meilleureValeur;
}
}


else
{if (joueurEnCours!=ordi)
or (i=1; i<=maxAllu; i++)
{ v =valeur(nbAllum+i,maxAllum, joueurEncours,autre joueur);
if
(v<=minimunValeur) minimumValeur i; meilleurCoup v;
return minimumValeur;
}
}
}
/**************************************/
int valeur(int nbAllu, int maxAllu, int joueurEnCours, int autreJoueur) {
  {if (joueurEnCours==autreJoueur) {
    if (nbAllu==1) {
      return 1; // l'autre joueur perd
    }
    if (nbAllu<=maxAllu+1) {
      return -1; // l'ordinateur perd
    }
else
if (joueurEnCours!=autreJoueur)
{
if (nbAllu==1)
retrun-1;
}
if(nbAllu<=maxAllu+1)
{
return 1;
}
}

voila les fonctions j'aimerais bien savoir est que c'est juste et merci pour tout
cordialement
0
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
3 mai 2007 à 23:54
Salut,

OK


bon attend, je vois ton code, compile et tout et tout, et je reviens te montrer une autre bestiole:p
0
cs_sousi20 Messages postés 13 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 16 juin 2011
3 mai 2007 à 23:57
ok merci je suis toujours là je travaille sur un autre projet de base de donnée bon je veux savoir tu es une fille ou bien un mec si tu veux me repondre
et merci
0
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
3 mai 2007 à 23:58
40 erreurs.
lol
je suis sur ton truc, bouge pas.
Pas fini.
0
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
3 mai 2007 à 23:59
je suis une fille :p
0
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
4 mai 2007 à 00:00
Bon, je fais des tests pour voir si ca marche..


croisons les tétons:p
0
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
4 mai 2007 à 00:03
BOn voilà je t'ai refait tout ca bien plus clean:p

Ca semble marcher chez moi.

#include


void calculerValeur(int allumettes, int retirer, int joueur, int autreJoueur, int * coup, int * valeur);


int main()
{
    int allumettes = 13;
    int retirer = 3;
    int joueur = 0;
    int coup;
    int valeur;
    calculerValeur(allumettes, retirer, joueur, joueur, &coup, &valeur);
    printf("Meilleur coup pour l'ordinateur : %d (valeur %d)\n", coup, valeur);
 return 0;
}


void calculerValeur(int allumettes, int retirer, int joueur, int joueurInitial, int * c, int * v) {
    int i;
    int coup;
    int valeur;
    int maxCoup;
    int maxValeur;
    int minCoup;
    int minValeur;
    if (allumettes<=1) {
        if (joueur==joueurInitial) {
            *v = -100;
            *c = 0;
            return;
        }
        else {
            *v = 100;
            *c = 0;
            return;
        }
    }
    else {
        if (allumettes-1<=retirer) {
            if (joueur==joueurInitial) {
                *v = 100;
                *c = allumettes-1;
                return;
            }
            else {
                *v = -100;
                *c = allumettes-1;
                return;
            }
        }
        else {
            if (joueur==joueurInitial) {
                maxCoup = 1;
                calculerValeur(allumettes-1, retirer, !joueur, joueurInitial, &coup, &maxValeur);
                for (i=2; i<=retirer; i++) {
                    calculerValeur(allumettes-i, retirer, !joueur, joueurInitial, &coup, &valeur);
                    if (valeur>maxValeur) {
                        maxValeur = valeur;
                        maxCoup = i;
                    }
                }
                *c = maxCoup;
                *v = maxValeur;
                return;
            }
            else {
                minCoup = 1;
                calculerValeur(allumettes-1, retirer, !joueur, joueurInitial, &coup, &minValeur);
                for (i=2; i<=retirer; i++) {
                    calculerValeur(allumettes-i, retirer, !joueur, joueurInitial, &coup, &valeur);
                    if (valeur<minValeur) {
                        minValeur = valeur;
                        minCoup = i;
                    }
                }
                *c = minCoup;
                *v = minValeur;
                return;
            }
        }
    }
}
0
Rejoignez-nous