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

Téléchargez Pascal Discussion :

ValisoaMorpion utilise l'algorithme MinMax


Sujet :

Téléchargez Pascal

  1. #1
    Robot Forum

    ValisoaMorpion utilise l'algorithme MinMax
    Bonjour,

    Je vous propose un nouvel élément à utiliser : ValisoaMorpion utilise l'algorithme MinMax.

    L'objectif du jeu est d'aligner trois pions de même couleur sur la ligne horizontale ou verticale ou diagonale. Le premier joueur à avoir aligné ces trois pions est le vainqueur.

    Type : jeu de morpion
    Développeur : Valisoa Jean Hervé
    Version : 1.0
    Date de sortie : 15/01/2018
    Langage de programmation : Pascal
    Compilateur : FreePascal 3.0.4
    OS : Windows
    Profondeur de calcul : 7 demi-coups
    Algorithme utilisé : MinMax

    Qu'en pensez-vous ?

  2. #2
    Expert confirmé
    Salut

    Bon j'ai regardé ton code, il y a quelques points à améliorer.
    Déjà ce n'est pas un échiquier mais un damier.

    Dans ton actualiseInterface, pourquoi ne pas faire plutôt :
    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
     
    procedure TValisoaMorpionForm.ActualiseInterface(Coup,joueur : byte);
    var 
      Col : TColor;
    Begin
      if Joueur = 1 then
        Col :=  clred
      else 
        Col :=  clgreen
     
       Case Coup of
          11 : P11.color := Col;
          12 : P12.color := Col;
          13 : P13.color := Col;
          21 : P21.color := Col;
          22 : P22.color := Col;
          23 : P23.color := Col;
          31 : P31.color := Col;
          32 : P32.color := Col;
          33 : P33.color := Col;
      end;
     
    End;

    Bon par défaut j'aurais plus pris un tableau de 1 à 9 mais bon c'est ton choix d'avoir des colonnes et des lignes.

    Dans Evaluations, ta boucle n'a pas besoin de prendre les diagonales et, plutôt que de mettre des chiffres, il vaut mieux passer la valeur du pion attaquant et défenseur, cela me paraît plus cohérent.
    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
    Function Evaluation(Piece : Damier;PionAttaque,PionDefense : integer) : shortint; { On evalue juste si un joueur a gagné ou non }
    var i,j,nbPion1,nbPion2 : byte;
    Begin
      Evaluation := 0;
      for i := 1 to 3 do
      begin		
        { Horizontalement }
    	if (Piece[i*10+1] = PionAttaque) and (Piece[i*10+1] = Piece[i*10+2]) and (Piece[i*10+1] = Piece[i*10+3]) then 
    	  Evaluation := 125
    	else 
    	  if (Piece[i*10+1] = PionDefense) and (Piece[i*10+1] = Piece[i*10+2]) and (Piece[i*10+1] = Piece[i*10+3]) then 
    		Evaluation := -125;
    		
    	 { Vertical }	
    	if (Piece[1*10+i] = PionAttaque) and (Piece[1*10+i] = Piece[2*10+i]) and (Piece[1*10+i] = Piece[3*10+i]) then 
    	  Evaluation := 125
    	else 
    	if (Piece[1*10+i] = PionDefense) and (Piece[1*10+i] = Piece[2*10+i]) and (Piece[1*10+i] = Piece[3*10+i]) then 
    	  Evaluation := -125;
    	end;
    		
    	// Diagonal
    	if (Piece[11] = PionAttaque) and (Piece[11] = Piece[22]) and (Piece[22] = Piece[33]) then 
    	  Evaluation := 125
    	else 
    	if (Piece[11] = PionDefense) and (Piece[11] = Piece[22]) and (Piece[22] = Piece[33]) then 
    	  Evaluation := -125;
    		
    	// Diagonal
    	if (Piece[13] = PionAttaque) and (Piece[13] = Piece[22]) and (Piece[22] = Piece[31]) then 
    	  Evaluation := 125
    	else 
    	if (Piece[13] = PionDefense) and (Piece[13] = Piece[22]) and (Piece[22] = Piece[31]) then 
    		  Evaluation := -125;
    	{ Si vous voulez, rajouter ici l'évaluation si la partie n'est pas finie. Mais moi, je trouve que cela est inutile au-delà de 6 demi-coups de calcul de profondeur }
    End;


    Après, je trouve cela un peu alambiqué l'utilisation de constante et de valeur numérique en place et lieu de la valeur du joueur.
    Je parle par exemple pour ton algo du min max, perso j'aurais passé en paramètres les différentes valeurs de mes pions, cela me permettant de choisir n’importe quel joueur sans passer par une valeur chiffrée, ce qui permettrait aussi de jouer à deux ou tout seul selon que l'on utilise ou pas le jeu automatique.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Membre averti
    Bonjour.
    Merci pour les suggestions. En fait, échiquier ou damier ? Comme je suis un joueur d'échecs j'ai l'habitude d'utiliser le mot échiquier à tous les plateaux du jeu de ce genre, mais merci pour la correction. ValisoaMorpion était un test pour voir si j'arrive bien à implémenter l'algorithme MinMax. Mon objectif final c'est de rajouter MinMax au sein de ValisoaChess afin d'augmenter son niveau. Je vois déjà qu'est-ce que dois améliorer .
    " Le voyage compte plus que la destination. "
    ValisoaChess