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

 

Discussion: Échiquier

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut Échiquier

    Il y a longtemps que je voulais faire un échiquier avec Flash Pascal. Voici une première tentative, que je vous propose afin que vous m'aidiez éventuellement à l'améliorer.

    En fait, ce n'était pas si difficile : la solution était intégralement donnée dans cet exemple posté par Paul dans le forum Delphi. (Plus cet exemple-là pour le chargement des données de configuration depuis un fichier XML.)

    Pour le moment l'échiquier n'est pas équipé d'une fonction d'arbitrage.
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    Après quelques heures de travail, voici mon échiquier avec arbitre intégré.

    Une dernière fonctionnalité que j'aurais aimé ajouter, c'est, lorsque l'utilisateur saisit une pièce, que les cases vers lesquelles il a le droit de la déplacer soit coloriées, comme dans ce projet. Paul, si tu passes par ici...
    Fichiers attachés Fichiers attachés

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    Je m'aperçois que parfois (?) la pièce qu'on déplace pour en prendre une autre passe derrière la pièce à prendre, au lieu de passer devant. Il doit y avoir un petit réglage à faire quelque part.

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    Citation Envoyé par Roland Chastain Voir le message
    Je m'aperçois que parfois (?) la pièce qu'on déplace pour en prendre une autre passe derrière la pièce à prendre, au lieu de passer devant. Il doit y avoir un petit réglage à faire quelque part.
    En fait ça ne fonctionne pas du tout. J'ai cru que ça fonctionnait parce que je me suis contenté d'essayer de prendre une pièce noire avec une pièce blanche, et comme les pièces noires sont créées avant les blanches, ça passait. Mais si je déplace ma pièce au-dessus d'une pièce qui a été créée après (par exemple la pièce immédiatement à droite), elle passe derrière au lieu de passer devant. D'ailleurs si je supprime carrément l'appel de la méthode swapDepths,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    procedure TGraphChessPiece.onPress;
    begin
      //swapDepths(_parent.getNextHighestDepth());
    ça ne change rien du tout : le résultat est toujours celui que je viens de décrire.

    Pour ce qui est de colorier les cases vers lesquelles la pièce a le droit de se déplacer, j'ai un début d'idée

    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
    procedure TGraphChessPiece.onPress;
    var
      x, y: integer;
      sx, sy: integer;
    begin
      //swapDepths(_parent.getNextHighestDepth());
      startDrag(FALSE, 0, 0, 280, 280);
      move := SquareToStr(XToBoard(_x), YToBoard(_y));
     
      help := MovieClip.Create(_root, 'help', _root.getNextHighestDepth());
      for x := 1 to 8 do for y := 1 to 8 do if game.IsLegal(move + SquareToStr(x, y)) then
      with help do
      begin
        sx := XToScreen(x);
        sy := YToScreen(y);
        beginBitmapFill(loadBitmap('valid'));
        moveto(sx, sy);
        lineto(sx + 40, sy);
        lineto(sx + 40, sy + 40);
        lineto(sx, sy + 40);
        lineto(sx, sy);
        EndFill();
      end;
    end;
    mais il faut d'abord que j'arrive à maîtriser ce problème de superposition.

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    En lisant la documentation Adobe, je suis perplexe sur la formule swapDepths(_parent.getNextHighestDepth()).

    Intervertit l’empilement, ou le niveau de profondeur (ordre z), de ce clip avec le clip spécifié par le paramètre target ou avec le clip qui occupe actuellement le niveau de profondeur spécifié par le paramètre target. Les deux clips doivent avoir le même clip parent. La permutation du niveau de profondeur des clips revient à déplacer un clip devant ou derrière un autre.
    Or si je ne me trompe par définition il n'y a pas de clip à l'altitude _parent.getNextHighestDepth().

    Ensuite dans Flash8.pas j'ai vu ceci qui a encore ajouté à ma perplexité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        procedure swapDepths(target: Number); {overload;
        procedure swapDepths(target: TObject); overload; }

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    Soit la méthode swapDepth ne fonctionne pas, soit je ne sais pas l'utiliser.

    Dans l'exemple suivant, quand on clique sur le carré de gauche, on voit que son altitude est la même avant et après l'appel de swapDepth.

    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
     
    program testswapdepths;
     
    {$FRAME_WIDTH 400}
    {$FRAME_HEIGHT 200}
     
    uses
      Flash8;
     
    type
      MyMovieClip = class(MovieClip)
        constructor Create(const aX, aY: integer; const aColor: integer);
        procedure onPress; override;
      end;
     
    var
      debug: TextField;
      highestDepth: number;
     
    constructor MyMovieClip.Create(const aX, aY: integer; const aColor: integer);
    begin
      inherited Create(_root, '', _root.getNextHighestDepth());
      highestDepth := self.getDepth;
      lineStyle(0, clRed);
      beginFill(aColor);
      moveTo(0, 0);
      lineTo(100, 0);
      lineTo(100, 100);
      lineTo(0, 100);
      lineTo(0, 0);
      endFill();
      _x := aX;
      _y := aY;
      debug.Text := debug.Text + IntToStr(Trunc(highestDepth)) + #13;
    end;
     
    procedure MyMovieClip.onPress;
    begin
      debug.Text := debug.Text + IntToStr(Trunc(self.getDepth)) + #13;
      swapDepths(highestDepth);
      debug.Text := debug.Text + IntToStr(Trunc(self.getDepth)) + #13;
    end;
     
    var
      clips: array[0..1] of MyMovieClip;
      i: integer;
     
    begin
      debug := TextField.Create(_root, 'debug', _root.getNextHighestDepth(), 200, 0, 200, 200);
      debug.Text := '';
      clips[0] := MyMovieClip.Create(0, 0, clBlue);
      clips[1] := MyMovieClip.Create(100, 0, clGreen);
    end.

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

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 7 013
    Points : 22 609
    Points
    22 609

    Par défaut

    haha j'ai passé des heures sur ce bug swapDepth ne fonctionne QUE si les objets possèdent un nom unique, alors que tes objets sont anonymes

    je ne suis pas certain que ce soit documenté quelque part, mais dès mes premiers pas sur Flash je suis tombé sur ce problème...ah tient, mon blog est dans les choux, c'est dessus que j'en avais parlé il y a fort longtemps

    je m'en suis rendu compte avec FlashPascal 0.4 (la version OpenSource)
    http://coding.derkeiler.com/Archive/.../msg02287.html
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    Ah oui, ça marche. Merci Paul ! Tout seul j'aurais pu chercher longtemps. Désormais je donnerai toujours des noms à mes objets.

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    Mon échiquier Flash Pascal est fini !

  10. #10
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    Ah je m'aperçois que depuis le début j'ai attaché le fichier SWF sans penser qu'il ne fonctionne pas sans le XML (qui était dans le ZIP, quelle histoire).

    Je suis en train de mettre au point l'adversaire artificiel.

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    J'ai travaillé à rendre le moteur (l'adversaire artificiel) que j'avais déjà compatible avec Flash Pascal. Ça donne une unité qui peut être utilisée aussi bien dans un projet Free Pascal que dans un projet Flash Pascal.

    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
    {$IFDEF FLASHPASCAL}{$FRAME_WIDTH 400}{$FRAME_HEIGHT 300}{$ENDIF}
     
    program chessenginetest;
     
    uses
    {$IFDEF FLASHPASCAL}
      console,
    {$ELSE}
      sysutils,
    {$ENDIF}
      chessengine;
     
    var
      i: integer;
     
    begin
    {$IFDEF FLASHPASCAL}
      with TConsole.Create do
    {$ENDIF}
      with TChessEngine.Create() do
      begin
        if PlayMove('e2e4') then
          //for i := 1 to 8 do
          begin
    {$IFDEF FLASHPASCAL}
            i := Clock();
    {$ENDIF}
            WriteLn(EngineMove());
    {$IFDEF FLASHPASCAL}
            i := Clock() - i;
            WriteLn(IntToStr(i) + ' ms');
    {$ENDIF}
          end;
    {$IFNDEF FLASHPASCAL}
        Free;
    {$ENDIF}
      end;
    end.
    Malheureusement, le code fonctionne très lentement dans la version Flash. Même en réglant la profondeur au minimum, il faut plus d'une seconde pour obtenir le coup de l'ordinateur, ce qui est trop long vu que le code est bloquant (je ne sais pas si je me fais bien comprendre). Donc l'unité est pratiquement inutilisable.

    Je poste quand même le code, quoiqu'il n'ait qu'un intérêt théorique.

  12. #12
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    Bonjour !

    Je prépare une nouvelle version de mon échiquier. En fait c'est le même programme avec de nouvelles images, deux fois plus grandes.

    Tout fonctionne bien sauf l'affichage d'un point vert qui sert à marquer les destinations valides. Comparez l'ancienne version, où le point est bien centré, avec la nouvelle. J'ai beau relire mon code, je ne vois pas d'erreur.

    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
    procedure TGraphChessPiece.onPress;
    var
      x, y: integer;
      sx, sy: integer;
    begin
      swapDepths(highestDepth);
      startDrag(FALSE, MARGIN, MARGIN, 7 * IMAGE_WIDTH + MARGIN, 7 * IMAGE_WIDTH + MARGIN);
      move := SquareToStr(XToBoard(_x), YToBoard(_y));
     
      for x := 1 to 8 do
        for y := 1 to 8 do
          if game.IsLegal(move + SquareToStr(x, y)) then
            with validMoves do
            begin
              sx := XToScreen(x);
              sy := YToScreen(y);
              beginBitmapFill(loadBitmap('valid'));
              moveTo(sx, sy);
              lineTo(sx + IMAGE_WIDTH, sy);
              lineTo(sx + IMAGE_WIDTH, sy + IMAGE_WIDTH);
              lineTo(sx, sy + IMAGE_WIDTH);
              lineTo(sx, sy);
              endFill();
            end;
    end;
    Images attachées Images attachées   

  13. #13
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    Problème résolu en relisant cette discussion.

    P.-S. Le problème venait du fait que mon nouvel échiquier a des bords de 20 pixels de largeur. Voici donc la nouvelle ligne (imitée de cet exemple d'Anthony) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    beginBitmapFill(loadBitmap('valid'), matrix.Create(1, 0, 0, 1, 20, 20));

  14. #14
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    Je vous présente la nouvelle version de l'échiquier Flash Pascal.

    Je n'ai pas fait tous les essais qu'il faudrait (roque, promotion, prise passant) mais je vous le livre quand même.

    L'échiquier doit sa beauté à Daniela Di Lena.

    P.-S. Attention, si vous téléchargez le SWF sans le XML vous aurez l'échiquier sans les pièces ! C'est le XML qui contient le nom des images et la position des pièces. Je ne me rappelle plus si j'avais une bonne raison de faire comme ça.
    Images attachées Images attachées  

  15. #15
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    Et voici un lien vers une page de mon site personnel, pour essayer l'échiquier dans un navigateur.

    <lien supprimé>

    Dommage que je n'aie pas réussi jusqu'à présent à faire un adversaire.

    Mais l'arbitre c'est déjà pas mal.

  16. #16
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 249
    Points : 11 852
    Points
    11 852
    Billets dans le blog
    5

    Par défaut

    J'ai fait un dernier (petit) effort sur ce projet : j'ai supprimé le fichier XML, que j'ai remplacé par une bonne vieille unité Pascal. Veuillez trouvez la nouvelle version de l'échiquier avec son code source dans le premier message de cette discussion.

    J'ai décidé de supprimer mon site personnel. J'ai créé à la place un site Google. Malheureusement il ne semble pas possible d'intégrer un fichier Flash directement dans une page.

    J'ai trouvé ce site qui n'est pas trop mal présenté malgré la bannière publicitaire.

    Échiquier Flash Pascal

    Si vous connaissez une autre solution...

    P.-S.
    Google Drive
    KONGREGATE

Discussions similaires

  1. Déplacement d'un pion sur un échiquier
    Par cpp_qt_progmane dans le forum Contribuez
    Réponses: 7
    Dernier message: 20/09/2012, 14h22
  2. Faire passer un cavalier par toutes les case d'un échiquier
    Par Spahi dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 29/10/2009, 10h27
  3. Réponses: 1
    Dernier message: 23/09/2009, 22h55
  4. échiquier en Java.
    Par Maddie dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 24/04/2007, 12h35
  5. algo sur matrice de case genre "échiquier"
    Par dom_dev dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 14/03/2007, 12h45

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