Discussion: Échiquier

  1. #1
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 031
    Points : 11 014
    Points
    11 014
    Billets dans le blog
    4

    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 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 031
    Points : 11 014
    Points
    11 014
    Billets dans le blog
    4

    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 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 031
    Points : 11 014
    Points
    11 014
    Billets dans le blog
    4

    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 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 031
    Points : 11 014
    Points
    11 014
    Billets dans le blog
    4

    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 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 031
    Points : 11 014
    Points
    11 014
    Billets dans le blog
    4

    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 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 031
    Points : 11 014
    Points
    11 014
    Billets dans le blog
    4

    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
    6 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 831
    Points : 21 861
    Points
    21 861

    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 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 031
    Points : 11 014
    Points
    11 014
    Billets dans le blog
    4

    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 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 031
    Points : 11 014
    Points
    11 014
    Billets dans le blog
    4

    Par défaut

    Mon échiquier Flash Pascal est fini !
    Fichiers attachés Fichiers attachés

  10. #10
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 031
    Points : 11 014
    Points
    11 014
    Billets dans le blog
    4

    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.
    Fichiers attachés Fichiers attachés

  11. #11
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 031
    Points : 11 014
    Points
    11 014
    Billets dans le blog
    4

    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.
    Fichiers attachés Fichiers attachés

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, 15h22
  2. Faire passer un cavalier par toutes les case d'un échiquier
    Par Spahi dans le forum Général Algorithmique
    Réponses: 11
    Dernier message: 29/10/2009, 11h27
  3. Réponses: 1
    Dernier message: 23/09/2009, 23h55
  4. échiquier en Java.
    Par Maddie dans le forum AWT/SWING
    Réponses: 4
    Dernier message: 24/04/2007, 13h35
  5. algo sur matrice de case genre "échiquier"
    Par dom_dev dans le forum Général Algorithmique
    Réponses: 2
    Dernier message: 14/03/2007, 13h45

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