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

Discussion: Problème de morpion [Lazarus]

  1. #1
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 886
    Points : 2 452
    Points
    2 452
    Billets dans le blog
    2

    Par défaut Problème de morpion

    Salut à tous,

    Je suis entrain de m'amuser à faire un petit jeu de Morpion (Tic Tac Toe) avec un TStringGrid

    Pour l'instant tout va bien ou presque.....

    Lorsque je lance la partie ( en plusieurs manches) avec le "Bouton : Nouvelle partie" c'est tout bon la première manche se déroule bien et tout fonctionne comme il se doit.
    Le problème c'est au commencement de la deuxième manche et des suivantes. L'affichage du stringgrid se comporte bizarrement dès que je clique sur une cellule. Je ne sais pas trop si c'est un bug du TStringGrid ou si j'ai oublié quelque chose ou s'il y a un truc que je ne fais pas correctement.
    J'ai passé l'après-midi a essayer de résoudre le problème mais sans succès.
    Si une âme charitable passe par là et voudrait bien m'aider, cela serai génial, car la franchement je sèche et ça commence furieusement à me démanger grave.

    Je vous ai mis le code complet en pièce jointe.

    Merci d'avance pour votre aide. Car j'aimerais vraiment comprendre, ce qui ne va pas, et ou je me plante, afin de mener à bien un autre projet que j'ai sur le feu.

    Bonne fin de soirée

    Morbax.zip
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    7 465
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 7 465
    Points : 10 772
    Points
    10 772

    Par défaut

    Salut,

    vit' vit' (même pas essayé de compiler, juste regardé le code), un truc qui m'accroche l'œil :
    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
    procedure TMainForm.btnNewGameClick(Sender: TObject);
    begin
      InitGame;
      //...
      FWin := False;
      FHits := 9;
     
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      Randomize;
      FHits := -1;
      InitGame;
    end;
     
    procedure TMainForm.NextMatch; // épuré pour montrer l'essentiel
    begin
      FCurrentMatch := FCurrentMatch + 1;
      if FCurrentMatch <= FMatchTotal then
      begin
        FHits := -1;
        //...
        FHits := 9;
      end
      else
      Begin
        FHits := -1;
      end;
    end;
    Je verrais bien une embrouille avec ces FHits...

    Et ça aussi, HS mais ça me pique trop les yeux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if MessageDlg('Etes vous certain de vouloir quitter ?', -->
      if MessageDlg('Êtes-vous certain de vouloir quitter ?',
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 886
    Points : 2 452
    Points
    2 452
    Billets dans le blog
    2

    Par défaut

    Salut,

    J'y avait pensé, le FHits, mais ce n'est pas ça. Le FHits est juste la pour contrôler le nombre de coup restant.
    En plus, j'ai refait l'application avec Delphi Community Edition (juste eu besoin de faire quelques ajustements) et ça fonctionne nickel. Du coup je pense plus pour un bug dans OnSelectCell et/ou OnDrawCell mais je vais quand même approfondir.

    Pour le HS, ouep t'as totalement raison mais je n'arrive jamais à mettre les accents sur les majuscules sauf en passant par la table des caractères et j'ai la flemme.

    Merci et bonne nuit
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #4
    Membre expert
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 600
    Points : 3 976
    Points
    3 976

    Par défaut

    hello,
    il semblerait que cela soit l'événement OnSelectCell qui cause problème. Son fonctionnement n'est pas très facile à comprendre car il peut très bien se déclencher plusieurs fois pas seulement avec un click mais aussi avec un survol des cellules. D'ailleurs dans le wiki c'est écrit :
    The location of a grid's current (focused) cell (or row) can be changed using keyboard, mouse or through code. In order to change cell focus successfully to another position, we must test the target position to see if it is allowed to receive cell focus. When using keyboard, the property AutoAdvance performs part of the process by finding what should be the next focused cell. When using mouse clicks or moving by code, focus will not move from the current cell unless the target cell is permitted to receive focus.The grid calls function SelectCell to see if a cell is focusable: if this function returns true, then the target cell identified with arguments aCol and aRow is focusable (the current implementation of TCustomGrid simply returns true). TCustomDrawGrid and hence TDrawGrid and TStringGrid override this method to check first if cell is any wider than 0; normally you don't want a 0 width cell selected so a cell with these characteristics is skipped automatically in the process of finding a suitable cell. The other thing the overridden method SelectCell does is to call the user configurable event OnSelectCell: this event receives the cell coordinates as arguments and always returns a default result value of true.
    Once a cell is known to be focusable and we are sure a movement will take place, first the method BeforeMoveSelection is called; this in turns triggers the OnBeforeSelection event. This method's arguments are the coordinates for the new focused cell. At this point any visible editor is hidden too. The "before" word means that selection is not yet changed and current focused coordinates can be accessed with grid.Col and grid.Row properties.
    After that, the internal focused cell coordinates are changed and then MoveSelection method is called; this method's purpose is to trigger the OnSelection event if set (this is a notification that the focused cell has, by this time, already changed and cell coordinates are now available through grid.row and grid.col properties).
    Note that is not good to use OnSelectCell event to detect cell focus changes, as this event will be triggered several times even for the same cell in the process of finding a suitable cell. Is better to use OnBeforeSelection or OnSelection events for this purpose.
    Moralité si dans ton programme tu ne veux utiliser que le clic souris pour insérer un pion ( et que tu ne veux pas trop réfléchir au fonctionnement du OnSelectCell qui me semble pas trop intuitif) voilà ce que je te propose en solution de contournement:

    1 - Tu rajoutes deux variables dans la partie private de ta form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        FcurRow : Integer;
        FcurCol : Integer;
    2 - Tu mets en commentaire l'événement OnSelectCell
    3 - Dans l'événement OnSelection tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TMainForm.BoardSelection(Sender: TObject; aCol, aRow: Integer);begin
      FcurRow := aRow;
      FcurCol := aCol;
    end;
    et dans l'événement OnClick de la TStringGrid tu mets le même code qu'il y avait pour le OnSelectCell avec en supplément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Var    Code : Byte;
        aCol,aRow : Integer;
      begin
        aCol := FcurCol;
        aRow := FcurRow;
    et le CanSelect en commentaire.

    [EDIT] même pas la peine de rajouter les variables FcurRow et FcurCol et le traitement de l'événement OnSelection avec ce code cela devrait fonctionner aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TMainForm.BoardClick(Sender: TObject);Var
        Code : Byte;
        aCol,aRow : Integer;
      begin
        aCol := (Sender As TStringGrid).Col;
        aRow := (Sender As TStringGrid).Row;

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    7 465
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 7 465
    Points : 10 772
    Points
    10 772

    Par défaut

    Complètement HS,
    Citation Envoyé par BeanzMaster Voir le message
    Pour le HS, ouep t'as totalement raison mais je n'arrive jamais à mettre les accents sur les majuscules sauf en passant par la table des caractères et j'ai la flemme.
    J'ai ça, imprimé et rangé dans un tiroir du bureau en bois :

    Nom : codes_maj_accentués.png
Affichages : 103
Taille : 58,5 Ko

    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    juin 2012
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : juin 2012
    Messages : 1 002
    Points : 1 905
    Points
    1 905

    Par défaut

    En effet, OnSelectSel se déclenche à chaque survol et si la souris passe sur plusieurs cellules à la suite il se déclenchera autant de fois qu'il y-a de cellules survolées.
    J'ai eu un problème similaire avec OnClick qui se produit aussi quand on déplace la sélection avec les flèches du curseur. J'ai réglé le problème en désactivant la procédure quand elle venait me mettre la misère. Tu devrais pouvoir faire de même avec OnSelectSel.

    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
    procedure TForm1.M_Copy_All_NamesClick(Sender: TObject);
    var
      i,Old_Row:Integer;
    begin
      G_Files.OnClick:=NIL; // Désactiver l’événement.
      Old_Row:=G_Files.Row;
      G_Files.row:=1;
    
      for i:=1 to G_Files.RowCount-1 do begin
        M_Copy_NameClick(NIL);
        G_Files.Row:=G_Files.Row+1; // Provoque un onclick indésirable.
      end;
      G_Files.OnClick:=@G_FilesClick; // Réactiver l’événement.
      G_Files.Row:=Old_Row;
      G_FilesClick(NIL);
    end;

  7. #7
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 886
    Points : 2 452
    Points
    2 452
    Billets dans le blog
    2

    Par défaut

    Bonjour à tous,

    Effectivement le OnSelectCell est bien le problème. Je ne trouve pas son fonctionnement difficile, mais c'est un problème de taille. Je vais donc me tourner vers onClick et/ou onSelection comme tu me le suggère JP.
    Ce qui est étrange c'est que lors de la première manche cela fonctionne très bien .
    Je vais essayé de redéfinir les propriétés col et row à zero pour voir. J'ai quand même du mal à saisir pourquoi les développeurs ont fait que l'évènement se déclenche au survol de la souris, ce n'est pas très logique . Surtout que sous Delphi cela fonctionne très très bien.

    Merci Jipete, pour la liste des touche je vais l'imprimer et la garder à coté de moi

    Donc d'après ce que tu dis mm_71 le OnClick est déclenché même lorsque l'on change les propriétés Col et Row par code, c'est bien ça ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  8. #8
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    juin 2012
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : juin 2012
    Messages : 1 002
    Points : 1 905
    Points
    1 905

    Par défaut

    Donc d'après ce que tu dis mm_71 le OnClick est déclenché même lorsque l'on change les propriétés Col et Row par code, c'est bien ça ?
    Oui, quelqu'en soit l'origine le déplacement dans row fait un onclick. La gestion des événements est un vrai bordel.
    Noter aussi un détail qui ne devrait pas affecter ton programme mais utile à connaître:
    A la création et initialisation d'une grille onclick et d'autres événements sont aussi activés. Dans le cas de mon programme qui consiste à avoir deux grilles interactives dont le déplacement est synchronisé ( OnClick dans l'une déplace la sélection de l'autre ) il faut désactiver OnClick ( Ou tout événement concerné dans OnCreate, sinon le Onclick de la première grille qui se créée va vouloir déplacer une sélection dans une grille qui n'existe pas encore et c'est un fort beau crash.
    Ceci dit il me semble que dans ton cas OnClick serait plus simple que OnSelectSel, avec lui tu sais au moins dans quelle cellule tu tapes ce qui n'est pas le cas avec OnSelectSel.

    PS:
    Dans le code que j'ai présenté la troisième ligne est inutile, c'est une survivance de l'ancien code que j'ai oublié d'effacer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       G_Files.OnClick:=@G_FilesClick; // Réactiver l’événement.
    G_Files.Row:=Old_Row;
    G_FilesClick(NIL); // Pas utile, normalement la ligne précédente aura fait le OnClick
    Et ultime détail: lazarus 1.8 Linux Mint 18.3. Est-ce la même chose sous Mac, Windows ou d'autres versions de Lazarus je l'ignore.

  9. #9
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 886
    Points : 2 452
    Points
    2 452
    Billets dans le blog
    2

    Par défaut

    Bonjour

    merci pour les précision mm_71 Je suis donc passer par OnClick et c'est nickel

    Merci encore

    A Bientôt
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  10. #10
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 89
    Points : 206
    Points
    206
    Billets dans le blog
    2

    Par défaut Autre solution pour les pbs de morpions

    Autre solution pour les pbs de morpions: Aphtiria ou équivalent


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème morpion IA TPE
    Par Syphoro dans le forum Intelligence artificielle
    Réponses: 2
    Dernier message: 03/02/2014, 10h48
  2. Morpion - Problème conditions de boucles
    Par max1012 dans le forum Débuter
    Réponses: 2
    Dernier message: 07/03/2013, 16h47
  3. Morpion C++, problème d'affichage.
    Par lv3895 dans le forum SDL
    Réponses: 3
    Dernier message: 11/01/2011, 20h43
  4. [Tuto Morpion] Problème Circular dependency
    Par Thesalan dans le forum SDL
    Réponses: 5
    Dernier message: 04/05/2010, 13h28
  5. Problème avec l'algorithme minimax pour un morpion
    Par Electroniktor dans le forum Intelligence artificielle
    Réponses: 0
    Dernier message: 26/10/2009, 22h18

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