Voila mon problème :
Je cherches a faiure une ia pour jeu d'échec...
j'ai bien commencé mon jeu, vous pouveze télécharger les sources ici :
http://coucou747.hopto.org/c/echecs.zip(...)
J'ai deux bugs non déclarés : on ne peut pas roquer, et pas d'ia... l'ia c'est normal, j'ai pas mis la fonction, mais pour le roque, je sais pas d'ou ça vient...
Voila, j'aimerais que qqn m'aide car j'ai un peu peur du vide, et voila, je suis un peu perdu (LOL) je sais pas par ou commencer, j'ai pas un jeu structurel alors voila...
Pour jouer, mettez la première lettre du nom de la pièce en majuscule puis la case d'arrivée ex : Cc3 pour le cavalier en c3. Quand une pièce prends on met un x entre la pièce et la case d'arrivée ex : Cxe4. Si deux pièces peuvent arriver au même endroit, on met la colone de départ : Cbc3
Pour les pions, c'est un peu différent, on met seulement la case d'érrivée. Si un pion prneds on met la colone de départ puis x puis la case d'arrivée ex : e4 ou dxe5 ect...
Pour roquer c'est O-O pour le petit roque et O-O-O pour le grand
Voila, je crois avoir tout dis...
Sauf merci d'avance c'est assez complexe.
# code
Posté par TImaniac (site web personnel) . Évalué à 3.
par exemple tu fais plusieurs comparaisons à la suite comme ca :
if (coup[0]==84) piece=2; /*ici une tour*/
if (coup[0]==67) piece=3; /*ici un cavalier*/
if (coup[0]==70) piece=4; /*ici un fou*/
if (coup[0]==68) piece=5;
etc.
ton programme va faire chaque test à chaque fois alors que toi tu sais qu'il n'y aura qu'un seul cas de possible...
tu peux améliorer en faisant celà :
if (coup[0]==84) piece=2; /*ici une tour*/
else if (coup[0]==67) piece=3; /*ici un cavalier*/
else if (coup[0]==70) piece=4; /*ici un fou*/
else if (coup[0]==68) piece=5;
ou encore plus propre :
switch(coup[0]){
case 67: piece=3;break;
case 70: piece=4;break;
case 68: piece=5;break;
etc.
default://met ici les autres cas bizzare.
}
tu peux ajouter de la lisibilité plutôt que de mettre des commentaires, par exemple :
au début du programme :
#define TOUR 84
#define CAVALIER 67
#define FOU 70
et dans le code :
switch(coup[0]){
case TOUR: ...
case CAVALIER: ...
etc.
sinon la boucle infinie, tu peux mettre while(1)
un dernier conseil : essai de faire des fonctions pour bien séparer les différences parties de ton code.
Avec tous ces conseils tu devrais déjà avoir un code plus lisible et beaucoup plus facilement débuguable !
Tu sembles débuter en programmation, mais surtout ne te décourage pas, on est tous passsés par là ;)
[^] # Re: code
Posté par coucou747 . Évalué à 0.
je reviens d'un long parcours difficile (de s'en séparer) en Qbasic, 104 programmes a télécharger sur mon site...
Ensuite, j'ai fais du html pour créer mon site, puis du javascript pour améliorer mon site...
Il y a un an, du tibasic pour le lycé et du C pour ma satisfaction personelle... Donc, j'ai appris le C seul depuis octobre a peu près.Voila, donc, comme j'avance lentement, on peut dire que je débute...
Donc, j'ai pensé a ce que tu as mis, mais la, tu met juste un conseil de programmation, pas la ou est le bug pour les roques, ni comment faire une ia, cependant tes remarques sont très pertinentes sache que j'en tiendrais compte. Tu as dis que je n'avais pas fait plusieurs fonctions... j'en ai mis une par fichier pour plus de claretée, mais j'ai aff echecblanc echecnoir droitblanc droitnoir et main...
J'aurais pu mettre plus de fonctions mais je sort d'un long parcours dans les sinueux passages du Qbasic...
donc en fait voila, merci pour ton commentaire, tu m'avance pas vraiment pour ça, mais tu m'avance bien pour ma programmation en général.
[^] # Re: code
Posté par TImaniac (site web personnel) . Évalué à 3.
Pour les fonctions, ne pas les mettres dans un .h surtout, ça ne sert pas à celà :)
Le corps des fonctions dois toujours être placé dans des fichiers .c. Dans le .h tu déclare juste les prototypes.
Je m'explique :
dans fonctions.h :
void mafonction(int a); // c'est juste une déclaration (.h --> header --> en-tête)
dans fonctions.c :
#include "fonctions.h" // j'indique ici les déclarations histoire que le compilo vérifie que ca colle bien
void mafonction(int a){
ici je fais le boulot
}
dans autre.c :
#include "fonctions.h" // j'indique ici que je veux utiliser les fonctions dont les signatures sont dans fonctions.h
à la compilation :
gcc -c fonctions.c --> créer le module compilé fonctions.o
gcc -c autre.c --> créer le module compilé autre.o
gcc -o monprogram fonctions.o autre.o --> créer le programme final à partir des 2
Un conseil, achète un bouquin de C ;)
Pour ce qui est de l'IA, il existe des algo sur le net déjà écrit en C... je penses que tu pourras les utiliser. Voici un exemple de code source de programme d'échec :
http://tict.ticalc.org/downloads/Chess-5.00.zip(...)
http://tict.ticalc.org/downloads/crafty179.zip(...)
tu as surement moyen de réutiliser les algos...
sinon l'algo le plus simple, algo du minmax :
- tu calcules tous les coups possibles et tu prends le meilleur. (manger une tour est meilleur que manger un pion, etc. : il faut classer les coups)
- tu calcules la même chose pour le coup de l'humain en ayant supposer un coup pour la machine : celà te permet d'aller voir un coup en avant, d'anticiper. Tu peux normalement faire celà de manière récursive sur n-coup pour anticiper le plus loins possible dans le temps, avec toujours à chaque fois la même technique : tu choisis le meilleur coup que tu es trouvé.
# Commentaire supprimé
Posté par Anonyme . Évalué à 3.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: IA
Posté par mathieu mathieu (site web personnel) . Évalué à 2.
Par contre, de là à appeler ca de l'IA c'est un autre débat (ou troll c'est au choix) ...
Dans tes liens, je ne sais pas si c'est bien expliqué , un bon exemple en faisant tourner l'algo est quand même le mieux...
Vu la profondeur d'un jeu d'echec ... comme on ne va pas au bout des branches... l'évaluation des coups me parait plus difficile
Je n'ai pas trouvé de fonction d'évaluation celle ci doit etre rapide (ainsi on peut aller très vite loin en profondeur) ... mais également suffisament précise sur la valeur du coup hypothétique (le notre ou adverse)... bref pas vraiment très évident à coder ca!!!
[^] # Re: IA
Posté par Nong . Évalué à 1.
[^] # Re: IA
Posté par mathieu mathieu (site web personnel) . Évalué à 2.
Si aujourd'hui les grands joueurs arrivent à se mesurer à des super computers, ce n'est parce que eux même arrive à voir à une profondeur de 50 coups, en faisant une bonne évalutation de chaque coup, mais plutôt parce qu'ils marchent avec des schémas, "reconnaissance de situations", ce qui marche par l'apprentissage ...
J'imagine que les futurs jeux feront ainsi ...
bon pour un débutant, s'pa évident non plus ;)
[^] # Re: IA
Posté par Nong . Évalué à 1.
http://www.ebetcom.com/deep-blue-kasparov.htm(...)
Au passage pour jouer sur le net ou faire jouer un de vos programme sur le net pour le fun http://www.freechess.org,(...) gratuit et c'est fun surtout le bughouse :D
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 1.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 2.
Ce commentaire a été supprimé par l’équipe de modération.
# Roque
Posté par Nong . Évalué à 1.
0-0 pour les blancs donne la creation du roi f1 et g1 tu as donc trois rois(e1/f1/g1), au tour des noirs tu verifies si tu peux prendre un roi si oui position illegal (on ne peut pas roquer si le roi passe une case en prise) et au tour suivant (blanc) tu nettoyes les rois supplementaire en conservant celui en g1. Tu sais que tu as roquer car tu as 3 rois blancs sur l'echiquier
[^] # Re: Roque
Posté par Clem Yeats . Évalué à 1.
# Un dossier là dessus dans les LMF
Posté par Juke (site web personnel) . Évalué à 2.
# Intelligence certes mais artificielle quand même....
Posté par okhin . Évalué à 1.
A partir de là, c'est "facile", tu comptes pour toutes les possibilités de mouvement (en déplacant chaque pièce dans toutes les directions) la valeur finale de ce mouvement, puis, pour chacune d'elle, tu calcules la meilleure position adverse.
Tu gardes en mémoire la différence de point la plus élevée (en gros, cela veux dire que tu as une amélioration de ta situation). Tu mémorise donc ce premier enchaînement de coup (un pour toi, un pour lui), et tu continue avec cette position théorique, sur un, deux, ou trois coup.
Ca c'est le principe de base.
Ensuite, il peux être intéressant de mémoriser d'autres coups (les 3 meileurs par exemple, le moins bon également) au départ pour explorer d'autres solutions.
En algo, ca donne:
Score = calculDuScore() //Le score au début du tour
ScoreAdv = 0;
For Each pièces
For Each mouv = mouvement possible
ScoreTmp = calculDuScore()
Si ScoreTmp < Score //Régression du score
Next
For Each piècesAdverse
For Each MouvAdv = mouvement possible
ScoreTmp2 = calculDuScore()
Si ScoreTmp2 > ScoreAdv
ScoreAdv = ScoreTmp2
MouvMem = MouvAdv
FinSi
FinFor
FinFor
ScoreTmp = ScoreTmp - ScoreAdv
Si ScoreTmp > Score
MouvList = MouvList + (Mouv + MouvAdv + ScoreTmp)
FinSi
FinFor
BestMouv = MaxScore(MouvList)
Voilà pour calculer le Meilleur Mouvement. PLus qu'à faire une fonction Anticiper() qui calcule plusieurs coup d'affilée, et voilou :)
[^] # Re: Intelligence certes mais artificielle quand même....
Posté par coucou747 . Évalué à 0.
En effet ce que vous dites est inexact, cette année, l'homme a batu l'ordi,n mais l'année dèrnière, une victoire chacun, cinq nules suivit d'une victoire de l'ordi (a 4 heure en moyenne la partie, j'imagine pas le stress...)
Voila, Je ne sais pas si vous avez tous regardé mon code... j'ai déja fait la fonction pour les roques...
Je vous détaille rapidement les règles des roques :
pour O-O-O
Le roi est en e1 la tour en a1
Le roi va en c1 la tour en d1
Le roi et la tour ne doivent pas avoir bougé
Le roi ne doit pas être échec
Le roi ne doit pas passer par une position d'échecs...
ainsi, j'ai fait un enregistrement des cases de départ dans un tableau juste pour ça... Et c'est ça qui bugg il me met le roi a déja bopugé...
Je penses que ça viens de l'enregistrement des coups dans mon pointeur...
ainsi, je vais faire 4 variables pour les roques et enlever ce **** de pointeur...
Voila vous avez peut de chance de réussir a m'aprendre une règle d'échec... j'en fais depuis que je suis tout petit.
La dame vaut 9
La tour vaut 5
le cavalier vaut 3
le fou vaut 3.5 oou 4
le pion vaut 1
et on ne met jamais de valeur au roi dans les tournois... un mat, on mettre une valeur énorme comme 100000 comme ça on ne risque rien.
évidement ça c'est théorique, on ne peut pas faire ça sur une ia car c'est bien trop faible comme recherche, faut aussi regarder si il y a échec on rajoute 2, si il y a des pions doublés on enlève 0.5 ect...
Pour connaitre la valeur d'une branche, je penses qu'il faut faire la moyenne entre avant que les noirs jouent et après... sinon, on fausse tout...
Merci pour vos commentaires, je sais pas si j'y arriverais, j'ai le temps, et vos commentaires seront de toute façon très utililes...
Je vais commencer par débugger ça, pour l'ia, je chercherais parmi vos codes source et vos sites...
[^] # Re: Intelligence certes mais artificielle quand même....
Posté par okhin . Évalué à 1.
SI tu pouvais nous lister toutes les façons de compter les points, ca pourrasi nou aider (positionnel, etc, etc...)
[^] # Re: Intelligence certes mais artificielle quand même....
Posté par coucou747 . Évalué à 1.
http://coucou747.hopto.org/c/echecs.zip(...)
enfin, normalement, c'est en ligne
Quand on a deux pions sur la même colone, on apelle ça des pions doublés et c'est une faiblesse!
Si l'autre a un pion passé : un pion qui n'a ni pion adverse devant lui, ni ion adverse a gauche ni adverse a droite : un pion qui n'a pas de pion adverse en obstacle... ce pion la est fort car il peut aller a dame (ah oui, il y a ça que je n'ai pas géré... je ferais cette fonction bientot).
Si vous pièces sont protégés plus de fois qu'elles sont attaqués...
Si vous attaquez une pièce plus de fois qu'elle n'est protégé...
Si il y a échec...
Si le roi est dèrière un roque solide...
Si le roque est cassé...
Si le roi ne peut plus roquer...
Si le centre est bien maitrisé...
Mais tout cela, ce n'est que des suptilitées de positions...
Si un pion s'aprète a aller a dame...
Ce n'est rien face a un cavalier d'avance (sauf ce qui touche au roque et aux promotions de pions)...
Enfin, voila quoi toutes ces suptilitées de positions...
[^] # Re: Intelligence certes mais artificielle quand même....
Posté par okhin . Évalué à 1.
Effectivemnt, ya pas mal de prédicats à implémenter.
[^] # Re: Intelligence certes mais artificielle quand même....
Posté par coucou747 . Évalué à 0.
[^] # Re: Intelligence certes mais artificielle quand même....
Posté par okhin . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.