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 :

Quatre-en-ligne (Puissance 4)


Sujet :

Téléchargez Pascal

  1. #1
    Rédacteur/Modérateur

    Quatre-en-ligne (Puissance 4)
    Bonjour,

    Je vous propose un nouvel élément à utiliser : Quatre-en-ligne

    C'est un "Puissance 4" écrit pour Lazarus.



    Les points intéressants sont, d'une part, l'emploi de la bibliothèque BGRABitmap, et d'autre part la façon dont l'interface graphique communique avec le moteur de jeu.

    Le moteur est une application console séparée. A chaque fois que l'ordinateur doit jouer, l'interface lance le moteur, au moyen de la fonction RunCommand() de l'unité Process. La liste des coups déjà joués est passé en paramètre, sous la forme d'une chaîne composée de caractères compris entre "1" et "7". Le moteur initialise sa grille interne en fonction de cette chaîne, et renvoie son coup. L'interface peut donc être utilisée avec un autre moteur, sans être recompilée, le nom du moteur étant contenu dans un fichier de configuration.

    Qu'en pensez-vous ?

  2. #2
    Expert éminent sénior
    amusant,

    ça me rappelle un très vieux projet de Pascal Peyrmorte sur le jeu "Schlurp"...nom tiré du son produit par ce mini-jeu inclut dans "The 7Th Guest" (un des premiers jeu PC sur CDROM, ça ne nous rajeuni pas !)

    le jeu avait la particularité de proposer un système de plugin pour contrôler l'IA ce qui a donné lieu à un petit concours de programmation.

    http://peyremorte.fr/Programmation/S...rp/Schlurp.htm
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Rédacteur/Modérateur

    C'est intéressant, merci pour le lien. J'ai téléchargé le jeu et les "joueurs" : je vais regarder tout ça de près.

    En attendant, quel serait l'intérêt d'utiliser une DLL plutôt qu'un exécutable ?

  4. #4
    Rédacteur/Modérateur

    Je me suis rendu compte de certaines lacunes dans mon programme. Si je clique sur une colonne pleine, le pion est quand même ajouté. Si je clique pendant qu'un pion est encore en train de tomber, le pion qui tombe s'arrête et un deuxième pion de la même couleur est ajouté. J'oublie toujours de prendre en compte l'usage incorrect que l'utilisateur pourrait faire du programme.

    Voici le squelette d'un moteur en Pascal. Celui-ci joue au hasard. A vrai dire, il n'est pas tout à fait complet, car il ne vérifie pas si la chaîne passé en paramètre ne correspond pas à une partie déjà finie par la victoire de l'un ou l'autre des joueurs. Mais enfin, c'est pour montrer le principe.

    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
     
    program hasard;
    {$APPTYPE CONSOLE}
     
    var
      h: string; // histoire de la partie
      t: array[1..7]of integer = (0, 0, 0, 0, 0, 0, 0); // tableau pour compter les pions
      r: integer; // réponse
      i: integer; // index
      v: boolean = true; // validité de la chaîne
     
    begin
      h := ParamStr(1);
     
      for i := 1 to Length(h) do
        if (h[i] >= '1') and (h[i] <= '7') then
          Inc(t[i])
        else
          v := false;
     
      if v then
        for i := 1 to Length(h) do
          if t[i] > 6 then
            v := false;
     
      if v then
      begin
        Randomize;
        repeat
          r := Trunc(Random(7) + 1);
        until t[r] < 6;
      end
      else
        r := 0;
     
      Write(r);
    end.


    Une fois ce programme compilé, il n'y a plus qu'à modifier en conséquence le fichier options.ini.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    [joueurs]
    blanc=utilisateur
    noir=hasard.exe

  5. #5
    Expert éminent sénior
    Citation Envoyé par Roland Chastain Voir le message
    C'est intéressant, merci pour le lien. J'ai téléchargé le jeu et les "joueurs" : je vais regarder tout ça de près.

    En attendant, quel serait l'intérêt d'utiliser une DLL plutôt qu'un exécutable ?
    l'intérêt principal c'est que tu peux interagir plus facilement entre les deux car ils sont dans le même espace mémoire alors que l'exécutable se lance dans un nouveau process. La DLL peut même en profiter pour préparer les coups suivant pendant que le jour réfléchi alors qu'avec un exe il ne sera relancé qu'au prochain coup.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Rédacteur/Modérateur

    Bonjour ! Je vous présente la nouvelle version de mon Puissance 4 pour Lazarus.

    Le moteur a été remplacé. Les défauts de la version précédente (signalés plus haut dans cette discussion) ont été corrigés. Enfin, plusieurs couleurs sont disponibles pour l'interface. (Pour modifier la couleur, il faut éditer manuellement le fichier options.ini et choisir l'une des valeurs disponibles : blue, gray, green, indigo.)

  7. #7
    Rédacteur/Modérateur

    Une nouvelle version est disponible.



    L'application console qui servait de moteur a été remplacée par une bibliothèque dynamique.

  8. #8
    Membre confirmé
    Felicitation pour ce petit jeu.

    Si je puis me permettre, voila une suggestion pour ameliorer l'aspect des pions:
    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
    Uses ..., BGRAGradientScanner;
     
    procedure TForm1.DrawDisk(x, y: integer; c: TBGRAPixel);
    var
      img: TBGRABitmap;
      grad: TBGRACustomScanner;
    begin
      if c = colors[1] then exit;
      img := TBGRABitmap.Create(48, 48);
      if c = colors[2] then
        grad := TBGRAConstantScanner.Create(c)
      else
        grad := TBGRAGradientScanner.Create(ApplyIntensityFast(c,50000),ApplyIntensityFast(c,16000),gtRadial,PointF(8,8),PointF(48,48));
      img.FillEllipseAntialias(
        img.Width / 2,
        img.Height / 2,
        7 * img.Width / 16,
        7 * img.Height / 16,
        grad
      );
      grad.Free;
      image.PutImage(x, y, img, dmDrawWithTransparency);
      img.Free;
    end;


    Cordialement
    Par-delà nos conceptions du bien et du mal se trouve une prairie. Je te rencontrerai là-bas.

  9. #9
    Rédacteur/Modérateur

    Alors ça c'est très gentil ! J'aime beaucoup le résultat (voir la capture d'écran dans le premier message de cette discussion). Le téléchargement a été mis à jour. Grand merci !

  10. #10
    Rédacteur/Modérateur

    Une nouvelle version du jeu est disponible, incluant le moteur Velena de Giuliano Bertoletti.

    Le moteur est écrit en C. Il faut le compiler (en 32 bits, autrement il ne marche pas bien, d'après ce que j'ai pu constater).

    Donc le moteur est une application console. Je voulais au départ continuer sur la solution d'une bibliothèque dynamique mais j'ai eu la paresse d'étudier les subtilités de la compilation et de l'installation des bibliothèques dynamiques sous Linux.

    Mais l'application n'est pas exécutée à chaque coup, comme dans la première version du projet (avec les inconvénients que Paul avait signalés). Elle est exécutée une seule fois, et il y a un dialogue continu entre l'interface et le moteur. J'ai repris la technique utilisée pour les moteurs d'échecs.

    Cette nouvelle version a été testée seulement sous Linux, mais devrait fonctionner aussi sous Windows.

    Téléchargement

  11. #11
    Rédacteur/Modérateur

    Une nouvelle version du jeu est disponible. La partie graphique a été entièrement refaite.

    Téléchargement

  12. #12
    Responsable Pascal, Lazarus et Assembleur

    Bonjour Roland,

    Bravo, c'est très réussi !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]

  13. #13
    Rédacteur/Modérateur

    Citation Envoyé par Alcatîz Voir le message
    Bravo, c'est très réussi !
    Merci ! J'ai été aidé par Johann, qui a écrit entièrement certaines parties du code (notamment le code pour la chute et le rebond du pion).

###raw>template_hook.ano_emploi###