IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

IA Puissance 4


Sujet :

Lazarus Pascal

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Maths Spé
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maths Spé

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut IA Puissance 4
    Bonsoir à tous !
    Je vous expose mon problème, en espérant que quelques irréductibles travaillent encore en Pascal et n'ont pas encore tous migré vers le C/C++.
    Tout d'abord, le fait que je code en Pascal vient que c'est le seul langage qui est disponible pour l'option info en maths spé dans mon lycée. Du coup, vu que j'ai bien plus manipulé le pascal que le C, j'ai décidé de continuer dans cette voie(mon prof pouvant en plus m'aider).

    Peut être que vous le savez, mais les secondes années de classe préparatoire doivent rendre un dossier sur lequel ils ont travaillé toute l'année et qu'ils doivent présenter devant un jury.
    J'ai choisi de travailler sur un puissance 4, et plus précisément sur la partie IA du puissance 4. Le puissance 4 étant un bon compromis difficulté/intérêt. Je n'ai en effet que peu de temps à m'y consacrer et viser plus haut aurait sans doute compromis mes chances de réussite !

    Mon programme est dorénavant fini, ou presque. Il me reste des améliorations à apporter et c'est pour cela que je mobilise votre aide !
    En effet, mon IA joue et arrive à me battre de temps en temps. Mais je la trouve très très mal optimisée.
    Je m'explique :
    -Son plus gros défaut reste que dans certains cas, où elle peut aligner 4 jetons verticalement en 2 coups alors que moi en 1 coup je peux gagner, elle va chercher ce coup et ne va pas tenter de bloquer le mien =>victoire facile
    -L'autre soucis est le coup banal qui consiste à aligner 3 jetons au milieu pour pouvoir gagner soit en posant un jeton à droite ou à gauche. Je pense l'avoir contré, du moins en partie, en forçant l'ordinateur à poser un jeton dans une colonne au hasard (au lieu de toujours jouer dans la 1ère colonne)

    Je pense que ce le problème majeur vient de ma fonction d'évaluation. Elle n'est finalement pas très poussée. Pour un coup qui aligne 1 jeton c'est 1 point, 2:10 points, 3:100 points et 4:1000 points
    Je fais la somme de tous les scores pour chaque jeton de ma grille et soustrait au score de chaque jeton de la grille pour mon adversaire.
    Après un algorithme min_max se charge de prendre soit le score le plus bas si c'est au tour de l'humain de jouer ou le plus haut si c'est à l'IA de jouer.

    C'est assez long à expliquer mais je pense que cet algorithme est très connu du coup j'espère que vous comprendrez.

    Je ne sais pas comment modifier mon programme de tel sorte que le 1er problème soit résolu... Si vous avez besoin de mon code source, je peux vous le fournir, je l'ai annoté de façon à ce qu'on puisse s'y retrouver facilement.

    En tout cas je vous remercie d'avance pour votre aide et bonne soirée !

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bienvenue !

    Il me semble que tu ferais bien en effet de montrer ce que tu as fait, afin qu'on puisse s'en faire une idée précise.

    En te lisant je crois comprendre que l'évaluation ne prend en compte que le résultat immédiat du coup à jouer. Si tel est le cas, s'il n'y a pas de prévision au-delà de la prochaine position, le jeu de l'ordinateur ne peut être que faible.

    Si tu en es réduit à faire jouer l'ordinateur au hasard pour augmenter ses chances de victoire, c'est qu'il y a quelque chose qui ne va pas !
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    En ce qui concerne l'algorithme, peut-être quelques idées vous paraîtront-elles dignes d'intérêt ici. Bonne continuation.

    Cordialement. Gilles

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 27
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par amathlog Voir le message
    -Son plus gros défaut reste que dans certains cas, où elle peut aligner 4 jetons verticalement en 2 coups alors que moi en 1 coup je peux gagner, elle va chercher ce coup et ne va pas tenter de bloquer le mien =>victoire facile
    Affecter un score négatif sur un coup qui empêche l'autre d'aligner 4 jetons ?
    Citation Envoyé par amathlog Voir le message
    -L'autre soucis est le coup banal qui consiste à aligner 3 jetons au milieu pour pouvoir gagner soit en posant un jeton à droite ou à gauche. Je pense l'avoir contré, du moins en partie, en forçant l'ordinateur à poser un jeton dans une colonne au hasard (au lieu de toujours jouer dans la 1ère colonne)
    De mémoire du temps ou je jouais, je ne jouais jamais mon premier coup dans la 1ère colonne. Toujours celle du milieu si c'est toi qui ouvre ou qu'elle est libre, et toujours une immédiatement a côté si l'adversaire ouvre au milieu.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Maths Spé
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maths Spé

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci d'abord pour vos réponses !
    Après réflexion, je pense que le principal défaut de mon algorithme vient du fait que je ne l'arrête pas dès qu'un coup aligne 4 jetons, il continue à tourner.
    Je vous laisse mon code source et je vais voir comment je peux intégrer un arret de mon algo si une situation 4 jetons alignés est présente.

    Merci
    Fichiers attachés Fichiers attachés

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    pour ce genre de problème tu dois obligatoirement anticiper les coups suivants. Tu ne peux pas te contenter de l'état actuel du tableau.

    1) quel est le "score" du tableau si je place un jeton en colonne X
    2) quel est le "score" du tableau si mon adversaire joue alors en colonne Y

    et tu peux continuer cette évaluation jusqu'à une profondeur d'analyse donnée pour limiter le temps de calcul...encore que sur un P4 ce temps est fini puisqu'on utilise un jeton à chaque tour.

    avec ce principe, tu sais que si le joueur place 3 jetons à l'horizontal tu as perdu deux coups plus tard. Le programme ne laissera donc jamais le jouer atteindre cet état (sauf s'il n'a pas le choix et alors il sait qui a déjà perdu si le joueur ne fait pas de connerie)...tu peux alors ajouter un commentaire "ça sent le roussi"...ou "mauvais coup" si le jour ne profite pas de ça chance de gagner.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Maths Spé
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maths Spé

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Je comprends mais j'ai déjà une fonction d'évaluation qui va jusqu'à 2 tours plus loin, cependant cette fonction ne s'arrête pas lorsque il remarque que 4 jetons sont alignés il peut même aligner 5 jetons et pourtant il ne va pas jouer la. Donc je pense tester en plus le nombre de jetons alignés dans cette fonction en plus de donner un score au tableau.
    Mais pour le moment je ne peux pas accéder à mon ordinateur, je vous recontacte lorsque que j'aurais quelques résultats

  8. #8
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Je n'ai pas vraiment regardé ton programme mais as tu pensé à utiliser un algorithme min-max avec réduction alpha-beta
    voir http://fearyourself.developpez.com/t...l/sdl/morpion/
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par amathlog Voir le message
    Mais pour le moment je ne peux pas accéder à mon ordinateur, je vous recontacte lorsque que j'aurais quelques résultats
    Veux-tu des conseils ou n'en veux-tu pas ?

    Citation Envoyé par amathlog Voir le message
    cependant cette fonction ne s'arrête pas lorsque il remarque que 4 jetons sont alignés
    Dans ce cas qu'est-ce qui te fait dire qu'il le "remarque" ?

    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Maths Spé
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maths Spé

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord, mon algorithme repose sur du min-max mais je n'ai pas instauré l'élagage alpha-beta, sachant que voir à 2 coups me suffit. Et le temps d'exécution est très rapide pour 2 tours(pour 3 ça commence à devenir catastrophique)

    Bien sur que je veux des conseils mais j'ai pas envie qu'on me mâche tout le travail ^^ du coup et bien je montre que je suis actif (enfin vu que mon ordi ne marche pas pour le moment je le suis moins...) et que je ne me tourne pas les pouces en attendant que la réponse me tombe dans le bec !!!

    Et oui il remarque les 4 jetons, étant donné que pour donner un score à un coup il compte le nombre de jetons alignés :p il ne s'arrête juste pas lorsqu'il le "remarque" (et sans jeu de mots ^^)

  11. #11
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par amathlog Voir le message
    Tout d'abord, mon algorithme repose sur du min-max mais je n'ai pas instauré l'élagage alpha-beta, sachant que voir à 2 coups me suffit. Et le temps d'exécution est très rapide pour 2 tours(pour 3 ça commence à devenir catastrophique)
    A mon avis la profondeur n'est pas suffisante et quel est le problème au delà d'une profondeur de 2 coups
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Maths Spé
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maths Spé

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Et bien c'est pas vraiment un problème, c'est que le temps de réflexion de l'ordinateur atteint 30 sec, ça commence à faire long...

  13. #13
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Il faut le faire travailler pendant que le joueur humain joue. Autrement dit utilise un thread pour ton min-max et avec une élagation alpha beta ça va encore plus vite
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  14. #14
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonsoir !

    Citation Envoyé par Gouyon Voir le message
    Il faut le faire travailler pendant que le joueur humain joue. Autrement dit utilise un thread
    Pourrais-tu expliquer comment on fait cela ? Ça m'intéresse beaucoup !



    Mais je ne pas sûr qu'il soit nécessaire de déployer d'aussi grands moyens pour un jeu si simple.

    Citation Envoyé par Gouyon Voir le message
    A mon avis la profondeur n'est pas suffisante
    Même observation. Il me semble qu'en évaluant le coup à jouer immédiatement, plus le coup suivant de l'adversaire, ça doit pouvoir suffire à obtenir un jeu décent, pourvu que l'évaluation soit bien faite.

    A titre d'exercice, et pour illustrer la discussion, j'ai essayé d'écrire quelque chose : j'espère qu'on ne trouvera pas mauvais que je le poste à cet endroit.



    Il y a trois critères d'évaluation : 1) le coup gagnant 2) autrement le meilleur score de l'adversaire au coup suivant 3) enfin un bonus pour le jeu dans les colonnes centrales. C'est une ébauche, mais ça fonctionne.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
     
    PROGRAM miniP4 ; USES Crt ;
     
    CONST
     TourDesJaunes= +1 ;
     TourDesRouges= -1 ;
     FinDePartie  =  0 ;
     IAJoueRouge  =  1 ;
     IAJoueJaune  =  2 ;
     
    TYPE
     Intervalle = TourDesRouges..TourDesJaunes ;
     TTableau   = Array [ 1..7, 1..6 ] of Char ;
     Ligne      = Array [ 1..4 ]   of ShortInt ;
     Diagonales = Array [ 1..12 ]     of Ligne ;
     
    VAR
     Trait :       Intervalle ;
     TableauActuel : TTableau ;
     Coup :              Char ;
     CoupPossible :   Boolean ;
     ModeJeu :           Byte ;
     
    CONST
     PionJaune : Char = 'j' ;
     PionRouge : Char = 'r' ;
     D : Diagonales = (
     (1,4,4,+1),
     (1,5,5,+1),
     (1,6,6,+1),
     (2,6,6,+1),
     (3,6,5,+1),
     (4,6,4,+1),
     (4,6,4,-1),
     (5,6,5,-1),
     (6,6,6,-1),
     (7,6,6,-1),
     (7,5,5,-1),
     (7,4,4,-1));
     
    (*==========================================================================*)
     
    PROCEDURE Initialise ( var Tab : TTableau ; var Tr : Intervalle ) ;
     var x,y : ShortInt ;
     begin
     
      for x:=1 to 7 do begin
       for y:=1 to 6 do begin
        Tab [x,y] := '.' ;
       end ;
      end ;
     
     Tr := TourDesJaunes ;
     
     end ; { Initialise }
     
    (*==========================================================================*)
     
    PROCEDURE Affiche ( Tab : TTableau ; Tr : Intervalle ) ;
     var
      x,y : ShortInt ;
      nom : String ;
     begin
      for y:=6 downto 1 do begin
       for x:=1 to 7 do begin
        case Tab[x,y] of
         '.':TextColor(LightGray);
         'j':TextColor(Yellow);
         'r':TextColor(Red);
        end ;
        GotoXY(3*x+2,-2*y+15);
        Write(Tab[x,y]);
       end;
      end;
      WriteLn;
      WriteLn;
      WriteLn;
      TextColor(LightGray);
      WriteLn('    A  B  C  D  E  F  G');
      WriteLn;
      WriteLn;
      if Tr=1 then nom:='Jaune' else nom:='Rouge' ;
      WriteLn ( '    ',nom,', votre coup !') ;
     
     end ; { Affiche }
     
    (*==========================================================================*)
     
    PROCEDURE Choix ( var col : Char );
     var Rep:Char;
     begin
     
      repeat
       Rep:=ReadKey;
       Delay ( 100 ) ;
      until ( Ord( UpCase( Rep ) ) in [65..71] ) or ( Rep=#27 );
     
      if Rep=#27 then
       col:=#27
      else
       col:=UpCase ( Rep ) ;
     
     end ; { Choix }
     
    (*==========================================================================*)
     
    PROCEDURE Verif ( c : Char ; t : TTableau ; var p : Boolean ) ;
     var colonne : 1..7 ;
     begin
      if not (c=#27) then
     
       begin
        colonne:=Ord ( c ) - 64 ;
        if t [ colonne, 6 ] = '.' then p:=True else p:=False ;
       end ;
    {
    else exit ;
    }
    end ;
     
    (*==========================================================================*)
     
    PROCEDURE AjouterPion ( c : Char ; tr : Intervalle ; var tab : TTableau ) ;
     
     var
      x, y : ShortInt ;
      stop : Boolean ;
     
     begin
      x:=Ord ( c ) - 64 ;
      y:=7 ;
     
      stop:=False ;
      repeat
       y:=y-1 ;
       if (y=1) or ( (y-1 in [1..5]) and not (tab[x,y-1]='.') ) then stop:=True ;
      until stop ;
     
      if tr=TourDesJaunes then
       tab[x,y]:='j'
      else
       tab[x,y]:='r';
     
     end ; { AjouterPion }
     
    (*==========================================================================*)
     
    PROCEDURE TestePartieGagnee ( tab : TTableau ; var tr : Intervalle ) ;
     const un = 1 ;
     var
      x, y, n, nmax, i, l, v, j : ShortInt ;
     
     begin
      nmax:=0 ;
     
      { test lignes horizontales }
      for y:=6 downto 1 do begin
       n := un ;
       for x:=1 to 6 do begin
     
        if (tab[ x, y ]=tab[ x + un, y ]) and not (tab[ x, y ]='.') then
         Inc ( n )
        else
         n:=un ;
     
        if ( n > nmax ) then nmax := n ;
       end ;
      end ;
     
      { test lignes verticales }
      for x:=1 to 7 do begin
       n := un ;
       for y:=1 to 5 do begin
        if (tab[ x, y ]=tab[ x, y+un ]) and not (tab[x,y]='.') then
         Inc ( n )
        else
         n:=un ;
     
        if ( n > nmax ) then nmax := n ;
       end ;
      end ;
     
      { test diagonales }
      for i:=1 to 12 do begin
     
       x:=D[i,1];
       y:=D[i,2];
       l:=D[i,3];
       v:=D[i,4];
     
       n:=un ;
       for j:=un to l-un do begin
     
        if (tab[ x, y ]=tab[ x + v, y - un ]) and not (tab[x,y]='.') then
         Inc ( n )
        else
         n:=un ;
     
        Inc ( x, v ) ;
        Inc ( y,-un ) ;
     
        if ( n > nmax ) then nmax := n ;
       end ;
      end ;
     
      if ( nmax > 3 ) then
       tr:=FinDePartie
      else
       tr:=tr ;
     
     end ; { TestePartieGagnee }
     
    (*==========================================================================*)
     
    PROCEDURE Prevoir ( tab : TTableau ; tr : Intervalle ; var nmax : ShortInt ) ;
     
     var
      x, y, n, i, l, v, j : ShortInt ;
     const un = 1 ;
     
     begin
     
      nmax:=0 ; { plus grand nombre de pions alignés }
     
      { test lignes horizontales }
      for y := 6 downto 1 do begin
       n:= un ;
       for x := 1 to 6 do begin
        if (tab[ x, y ]=tab[ x+un, y ]) and not (tab[x,y]='.') then
         if ((tr=TourDesJaunes) and (tab[x,y]='j'))
         or ((tr=TourDesRouges) and (tab[x,y]='r')) then Inc ( n )
        else
         n:=un ;
     
       if ( n > nmax ) then nmax := n ;
     
       end ;
      end ;
     
      { test lignes verticales }
      for x:=un to 7 do begin
       n :=un ;
       for y:=un to 5 do begin
        if (tab[x,y]=tab[x,y+un]) and not (tab[x,y]='.') then
         if ((tr=TourDesJaunes) and (tab[x,y]='j'))
         or ((tr=TourDesRouges) and (tab[x,y]='r')) then Inc ( n )
         else n:=un ;
     
        if ( n > nmax ) then nmax := n ;
       end ;
      end ;
     
      { test diagonales }
     
      for i:=un to 12 do begin
       x:=D[i,1];
       y:=D[i,2];
       l:=D[i,3];
       v:=D[i,4];
       n:=un ;
        for j:=un to l-un do begin
         if (tab[x,y]=tab[x+v,y-un]) and not (tab[x,y]='.') then
         if ((tr=TourDesJaunes) and (tab[x,y]='j'))
         or ((tr=TourDesRouges) and (tab[x,y]='r')) then Inc ( n )
         else n:=un ;
     
         Inc ( x, v ) ;
         Inc ( y,-un ) ;
         if ( n > nmax ) then nmax := n ;
        end ;
       end ;
     
     end ; { Prevoir }
     
    (*==========================================================================*)
     
    PROCEDURE ChoixIA ( tab : TTableau ; tr : Intervalle ; var cp : Char ) ;
     
     var
      i, j : ShortInt ;
      fictif : TTableau ;
      nmax : ShortInt ;
      nmax2: ShortInt ;
      minmax : ShortInt ;
      note : Array[1..7] of Real ;
      notemax : Real ;
      score: ShortInt ;
     
     begin
     
      notemax := - 10 ; { Meilleure note parmi les coups à jouer }
     
      for i:=1 to 7 do begin { Je joue tous les coups possibles }
     
       fictif := tab ;
       if ( fictif [ i, 6 ] = '.' ) then
       begin
        AjouterPion ( chr ( 64 + i ), tr, fictif ) ;
        Prevoir ( fictif, tr, score ) ;
       end ;
     
       if (score=4) then { S'il y a un coup gagnant l'évaluation s'arrête }
       begin
        cp:=chr(i+64) ;
        exit ;
       end ;
     
    { S'il n'y en a pas, je cherche le plus grand alignement que }
    { pourrait réaliser l'adversaire au coup suivant }
     
       nmax := 0 ;
     
     
       for j:=1 to 7 do begin { Je joue tous les coups de l'adversaire }
     
        if ( fictif [ j, 6 ] = '.' ) then
        begin
         AjouterPion ( chr ( 64 + j ), -1*tr, fictif ) ;
         Prevoir ( fictif, -1*tr, nmax2 ) ; { Je calcule le plus grand }
         { alignement pour chaque coup }
        end ;
     
        if nmax2 > nmax then nmax := nmax2 ; { Je le conserve si c'est }
        { le plus grand de toute la série }
     
       end ;
     
       note[i] := -1*nmax ; { J'en déduis la note (négative) de mon coup }
     
       { En cas d'égalité jouer au centre }
       note[i] := note[i] - abs( i - 4 )/10 ;
     
       { Je conserve la note si c'est la meilleure de la série }
       if note[i] > notemax then notemax := note[i] ;
      end ;
     
      if score=4 then
       cp:=chr(i+64)
      else
       begin
        for i:=1 to 7 do begin
         if note[i]=notemax then cp:=chr(i+64) ;
        end ;
       end ;
     
      end ;
     
    (*==========================================================================*)
     
    BEGIN
     
     ClrScr ;
     Initialise ( TableauActuel, Trait ) ;
     ModeJeu:=IAJoueRouge ;
     
     repeat
     
     Affiche ( TableauActuel, Trait ) ;
     TestePartieGagnee ( TableauActuel, Trait ) ;
     
     if not ( Trait=FinDePartie ) then
     
      begin
     
       if ((Trait*ModeJeu=1) or (Trait*ModeJeu=-2)) then
       begin
        repeat
         Choix ( Coup ) ;
         Verif ( Coup, TableauActuel, CoupPossible ) ;
        until CoupPossible or (Coup=#27) ;
       end
      else
       begin
        ChoixIA ( TableauActuel, Trait, Coup ) ;
       end ;
     
       if not (Coup=#27) then
       begin
        AjouterPion ( Coup, Trait, TableauActuel ) ;
        Trait:=-1*Trait ;
       end
      else
       Trait:=FinDePartie ;
     
      end
     
     else
     
      begin
       if not (Coup=#27) then
       begin
        WriteLn ;
        Write ('    ','Fin de Partie') ;
        Delay (5000) ;
       end ;
      end ;
     
     until ( Trait=FinDePartie ) ;
     
    END.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  15. #15
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Les threads sont du code qui s'exécute en parallèle dans une application; Je ne vais pas m'étendre là dessus il y a des tonnes de tutoriels.
    L'idée est de faire tourner l'algorithme pendant que le joueur joue ou réfléchi plutôt que d'attendre que le joueur ai fini de jouer pour commencer à réfléchir
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  16. #16
    Nouveau Candidat au Club
    Homme Profil pro
    Maths Spé
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maths Spé

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonsoir à tous !
    Ca y est, j'ai enfin accès de nouveau à mon ordinateur et j'ai de ce pas essayé de changer mon algorithme pour qu'il s’arrête lorsque qu'il voit que 4 jetons sont alignés.
    Et cela marche très bien ! Maintenant, lorsque je le fait jouer contre lui même (IAvsIA), ils sont obligés de remplir la grille avant que l'un soit coincé. Alors qu'avant c'était pas du le cas et d'ailleurs il ne cherchais pas à gagner certains coups...

    Mon objectif principal est atteint, c'est à dire programmer une IA à 2 tours d'avance (c'est à dire le coup même, puis 2 coups IA et 2 coups joueur).
    A présent, je vais devoir me concentrer sur mes concours mais je pense qu'après ma période d'écrit, j'essayerais d'améliorer mon algorithme en intégrant l'alpha-beta et pourquoi pas faire comme vous me l'avez proposer, du code qui s’exécute en parallèle du code principal.

    Merci en tout cas de m'avoir répondu et d'avoir pris le temps de comprendre mon problème ^^

Discussions similaires

  1. Entre technologie et puissance: duel 6800Ultra & X850xt
    Par DarkOcean dans le forum Composants
    Réponses: 5
    Dernier message: 03/02/2005, 17h11
  2. [LG]Puissance et Indice
    Par luno2545 dans le forum Langage
    Réponses: 2
    Dernier message: 08/05/2004, 10h01
  3. [LG]fonction puissance en pascal
    Par le 27 dans le forum Langage
    Réponses: 8
    Dernier message: 13/12/2003, 23h21
  4. x² et puissance de x par récurrence
    Par olivieram dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 15/12/2002, 23h59
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo