|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 | |||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Citation:
![]() Merci d'avoir pris le temps de regarder et de commenter. Je vais faire un effort sur la présentation. |
|||
|
|
00
|
|
|
#22 |
|
Expert Confirmé
![]() ![]() Inscription : août 2006 Messages : 3 417 ![]() |
Gie,
Je l'espère pour toi, c'est plus important qu'on ne le pense a priori.
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir. |
|
|
00
|
|
|
#23 | |||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Bonjour !
J'ai refait toute la présentation de mon code après avoir enfin compris la différence entre tabulation et indentation (merci à droggo qui m'a mis sur la voie). Attention ! Pour que le programme fonctionne il faut changer cette ligne : Citation:
Code :
|
|||
|
|
00
|
|
|
#24 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Bonjour !
Je voudrais vous présenter le dernier état de mon programme. Comme il commence à être un peu lourd pour l'insérer ici, je vous le propose à télécharger. ESCHECS.PAS Désormais vous jouez contre l'ordinateur. Pour le moment, son "intelligence articielle" se limite à cette idée que prendre une pièce vaut mieux que de ne pas la prendre, et que plus la prise est importante mieux c'est ! Code :
Plus ( note[index], P2 ) ; { dans la fonction MeilleurCoup } Quand cette règle n'est pas applicable, il joue au hasard (le dernier coup évalué). J'ai noté que la compilation avec Virtual Pascal semble bien se passer, mais qu'ensuite le programme donne des résultats faux. Attention, pour que le programme fonctionne il y a toujours cette ligne à modifier : Code :
Edition 06/03 Suite de ma question d'hier. Je voulais ajouter que si quelqu'un était tenté par l'exercice de réaliser une interface graphique pour un jeu d'échecs, j'accepterais volontiers une association ! Cela me permettrait de me concentrer sur le moteur. Voici ce que j'ai en tête : j'aimerais bien continuer mon moteur avec TP7 et le joindre (je ne sais trop comment) à un échiquier fait avec Lazarus ou Virtual Pascal par exemple. A votre avis est-ce possible et est-ce une bonne idée ? |
||
|
|
00
|
|
|
#25 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Bonjour !
Voici à quoi ressemble mon début de jeu d'échecs : ![]() Le jeu de l'ordinateur commence à prendre forme. Je me suis servi, entre autres choses, de tableaux de constantes pour indiquer à chaque pièce les "bonnes" cases : Code :
Du coup les parties d'essai deviennent un peu plus longues, et quand la position se complique, l'affichage par lettres devient vraiment un obstacle. Aussi, je crois que je vais laisser ce petit programme tel qu'il est et changer d'environnement. |
||
|
|
00
|
|
|
#26 |
|
Expert Confirmé
![]() ![]() Inscription : août 2006 Messages : 3 417 ![]() |
Qua,
Petite suggestion pour la présentation : Au lieu d'utiliser des minuscules/majuscules pour différencier les 2 joueurs, 2 couleurs seraient plus aisément distinguables au coup d'œil. De même pour l'échiquier, tu pourrais jouer du BackGround pour dessiner les cases avec 2 couleurs (sans oublier de gérer correctement l'affichage avec les lettres des pièces selon le joueur). C'est en tout cas le genre de truc que j'aurais fait (avec un principe : profiter des possibilités quand elles permettent d'améliorer l'ergonomie).
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir. |
|
|
10
|
|
|
#27 | |
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Citation:
![]() Il y a du mieux ! |
|
|
|
10
|
|
|
#28 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Bonjour !
Un autre essai d'échiquier en mode texte : ![]() J'ai complété la fonction d'évaluation : Code :
ESCHECS.PAS |
||
|
|
00
|
|
|
#29 |
|
Expert Confirmé
![]() ![]() Inscription : août 2006 Messages : 3 417 ![]() |
Luo,
Je préfère la version montrée dans le message #27, sauf pour la bordure avec les indices ligne/colonne, plus clair dans la nouvelle version. Pour les pièces, j'aurais utilisé p au lieu de P pour les pions, ça se distingue plus aisément des majuscules pour les autres pièces.
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir. |
|
|
00
|
|
|
#30 | |
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Citation:
![]() J'avais déjà fait la première modification. Merci de m'avoir fait penser à la seconde. Il me semble que c'est nettement mieux comme ça. Je garde !
|
|
|
|
00
|
|
|
#31 | ||
|
Membre Expert
![]() ![]() Étudiant Inscription : juin 2009 Messages : 936 ![]() |
Salut
Pour répondre à : Citation:
Peut tu m'expliquer ton astuce du tableau de constantes ? Citation:
Bonne chance
__________________
Articles : Création d'un système de chat en PascalProgrammes : Défi Pascal 2011 - Mon Tetris Défi Pascal 2010 - Mon système de chat Défi Delphi 2009 - Mon Sudoku SolverRetrouvez mes différents projets sur ma page personnelle. |
||
|
|
00
|
|
|
#32 | |
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Citation:
C'est bête comme tout, et je crains que tu ne sois déçu par mon explication ! A chaque pièce est associé un tableau qui donne tant de points pour telle case. Les points sont ajoutés automatiquement (avec un faible coefficient toutefois) à la note des coups : coup de telle pièce à destination de telle case, tant de points. Par exemple le cavalier a trois façons de sortir de sa position initiale. Une "bonne" et deux mauvaises. J'ajoute un point sur la bonne case ; il joue le coup que je veux. Comme tu vois, cela ne peut servir que pour les coups d'ouverture, parce qu'ensuite on ne peut plus savoir à l'avance quelles sont les "bonnes" cases. J'ai trouvé cette idée dans les excellentes pages d'Ed Schröder, l'auteur de Rebel et de Pro Deo, deux très forts programmes d'échecs. Je n'ai fait que simplifier le procédé qui était décrit. En répondant à ta question, je m'aperçois qu'il me faut une fonction qui distingue les moments du jeux. Il me semble à présent que le coefficient n'est pas la bonne solution. Merci pour tes encouragements ! J'ai essayé sérieusement Free Pascal. Il me plaît. Mais je ne sais pas me servir des librairies et pour le moment je ne veux pas apprendre, parce que cela me détournerait de mon projet actuel, qui est d'apprendre à programmer un jeu d'échecs et d'apprendre à bien programmer en Pascal. Pour cela, l'IDE Free Pascal me suffit. Mais si quelqu'un qui a déjà bien en main Lazarus veut s'associer à ce projet, il ne me faudra pas longtemps pour réécrire mon code. |
|
|
|
00
|
|
|
#33 | ||||||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Bonjour !
Un mot pour vous présenter la dernière modification de mon programme. Il s'agit d'une procédure qui détecte les coups faisant échec et mat : Code :
Code :
Code :
Cependant la procédure en question prend une bonne vingtaine de secondes pour répondre ! Pour corriger ce défaut, il faudra que je remplace les lourdes procédures "à tout faire" dont je me suis servi. Dans le cas testé, elles sont appelées 43 fois ! Autrement j'ai voulu voir ce qu'il y avait comme programme d'échecs pour Free Pascal. Hormis un moteur de jeu déjà ancien et sans code source, je n'ai trouvé que le projet FPChess, qui ne m'a pas paru très avancé, et pour tout dire qui m'a même paru un peu abandonné ! ESCHECS.zip (9 k) Edition 21/03 Testé à l'aide d'une variable le nombre d'appels à la procédure CalculECHEC : pour un coup de l'utilisateur, 906 fois pour un coup de l'ordinateur, 2021 fois ! et cela dans la position initiale, alors que les "grosses" pièces ne sont pas encore dans le jeu ! |
||||||
|
|
00
|
|
|
#34 |
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Bonjour !
Je viens de faire des essais de compilation dont le résultat est curieux. J'ai retiré de mon programme une procédure qui ne passait qu'avec TP7 (une procédure en assembleur pour éteindre le curseur que j'avais trouvée quelque part). Le code se compile sans message d'erreur et fonctionne, aussi bien avec Free Pascal qu'avec Virtual Pascal. Mais il produit un résultat faux : il joue un coup impossible. Compilé avec TP7, il joue un coup correct. Ce qui m'étonne encore, c'est que la même erreur exactement se produit avec Free Pascal et Virtual Pascal : la dame noire prend la dame blanche au premier coup des noirs ! Auriez-vous une idée de ce qui pourrait expliquer cette compatibilité trompeuse ? Une dernière observation : l'ajout (pour Free Pascal) de la directive ne change pas le comportement du programme. |
|
|
00
|
|
|
#35 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Bonjour !
Maintenant que je sais un peu mieux programmer en Pascal, j'ai commencé à réécrire mon jeu d'échecs, en essayant de garder ce qu'il y avait de bon dans mes précédents essais. Je posterai au fur et à mesure les parties du programme. Je ferai en sorte que le code soit toujours exécutable même sans les parties manquantes. De cette façon, en attendant un programme d'échecs complet, ce travail pourra éventuellement être utile comme suite d'exemples de code autour de la programmation d'un jeu d'échecs. Voici la première partie refaite, qui contient : - La déclaration des constantes, types et variables - La procédure qui affiche un échiquier en mode texte - Une fonction qui convertit les valeurs courantes dans une chaîne au format standard FEN - Plus diverses petites fonctions utiles Avis et conseils toujours bienvenus ! Code :
__________________
L'Art est long et le Temps est court. |
||
|
|
10
|
|
|
#36 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Bonjour !
Je cherche à améliorer la partie de mon programme qui calcule les coups possibles. J'ai voulu écrire une fonction qui pour une position donnée renvoie la liste des coups. Cette fonction fait appel à deux autres : une qui vérifie que le mouvement est conforme à la nature de la pièce, l'autre qui vérifie que le mouvement en question ne met pas le roi en échec. J'ai testé les deux premières fonctions séparément. Mais quand j'appelle la troisième, j'obtiens un "error 202 stack overflow". Qu'est-ce qui ne va pas au juste dans ma façon de procéder ? Quelle serait à votre avis la bonne façon de faire ? Voici le code : Code :
__________________
L'Art est long et le Temps est court. |
||
|
|
00
|
|
|
#37 |
![]() ![]() ![]() |
Je n'ai malheureusement pas le temps de regarder attentivement ton code mais une remarque me vient immédiatement à l'esprit : il vaut mieux transmettre un paramètre qui ne doit pas être modifié comme constante plutôt que par valeur, pour éviter une copie inutile sur la pile et, par corollaire, pour économiser de l'espace sur la pile :
http://pascal.developpez.com/faq/?pa...sConstOuValeur
__________________
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] |
|
10
|
|
|
#38 |
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Merci pour ta réponse et pour le lien. Je vais creuser de ce côté-là.
__________________
L'Art est long et le Temps est court. |
|
|
00
|
|
|
#39 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
J'ai appris beaucoup de choses en parcourant la FAQ Pascal. Excellente qualité de documentation !
![]() Pour revenir au débordement de pile ou "stack overflow", je me souviens que dans mes premiers essais de programmation d'un jeu d'échecs, je n'avais que des variables globales et des procédures sans paramètres. On m'a dit et j'ai constaté par moi-même que ce n'était la meilleure façon de faire. Mais à présent je m'aperçois que le passage explicite des paramètres a aussi ses inconvénients : Citation:
Sur le passage d'un paramètre comme constante, j'ai cru comprendre que Turbo Pascal ne le permettait pas : Citation:
Code :
Function Exemple (const a: byte): byte;
__________________
L'Art est long et le Temps est court. |
||
|
|
00
|
|
|
#40 | ||||||
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 4 423 ![]() |
l'ajout de "const" a deux conséquences
1) la variable n'est plus modifiable 2) si c'est une structure ou une chaîne, elle est passée par adresse et non par valeur (aucune incidence sur un BYTE donc). si elle est déclarée "var" c'est la même chose mais modifiable (et dans le cas d'un BYTE c'est un pointeur vers un BYTE et non plus un BYTE qui est passé en paramètre). voici un exemple avec une variable globale Code :
dans les trois autres cas, c'est la variable globale E qui est utilisée, alors quelle différence entre proc2, proc3 et proc4 ? proc2 interdit de modifier E, c'est ce qui la distingue de proc3 quand à proc3 il n'y a aucune différence avec proc4, MAIS il devient possible de l'utiliser dans un contexte différent qui donne tout son sens à la présence du paramètre. Code :
Code :
__________________
Developpez.com: Mes articles, forum FlashPascal Entreprise: Execute SARL Produits : UPnP, RemoteOffice, FlashPascal Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
||||||
|
20
|
Copyright © 2000-2013 - www.developpez.com