D'accord, mais je me demandais si ma fonction switch est bien placé dans mon interface.c, je devrais pas la sortir, pour en faire une fonction void a part que j’appellerai dans mon bec.c après chaunce des fonctions???
Version imprimable
D'accord, mais je me demandais si ma fonction switch est bien placé dans mon interface.c, je devrais pas la sortir, pour en faire une fonction void a part que j’appellerai dans mon bec.c après chaunce des fonctions???
Il faut imaginer ton programme comme étant en fait deux applications distinctes :
- Le moteur de jeu
- l'IHM
L'IHM pilote le moteur de jeu. Elle doit être capable de :
- demander les coups jouables
- transmettre le coup joué
- recevoir le coup joué (gérer aussi la fin de partie gagnée ou perdue)
- changer la couleur jouée
La première chose à faire est donc de créer les fonctions nécessaires côté moteur de jeu.
Ensuite voila un ordre d'exécution possible :
- Lancer l'IHM avec un petit menu pour permettre de changer de couleur de jeu. La couleur par défaut jouée par l'humain étant le blanc.
- extraction des coups jouables pour n'autoriser que les cases nécessaires
- l'humain joue
- envoie du coup joué au moteur de jeu
- attente du résultat du moteur de jeu
- réception du coup joué
- mise à jour de l'IHM
En résumé le code de l'IHM doit bien être séparé du code du moteur de jeu ;).
D'accord, en gros j'ai crée une fonction actualiser :
J'ai crée le moteur de jeu, c'est à dire que toutes les fonctions nécessaires pour le jeu ont été créées sans GTK. Mais j'en reviens toujours au même problème : je ne vois pas comment relier ces fonctions de jeu avec le tableau de caractères créé avec ces fonctions. Du coup, je bloque sur l'utilisation de cette fonction actualiser.Code:
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 void actualiser(GtkWidget* jeubouton[9][9], abel* plateaux){ int i; int j; GtkWidget *pionblanc; GtkWidget *pionnoir; GtkWidget *dameblanc; GtkWidget *damenoir; pionblanc= gtk_image_new_from_file ("croixblanc.png");//image pion blanc pionnoir= gtk_image_new_from_file ("croixnoir.png");// image pion noir dameblanc= gtk_image_new_from_file ("croixnoir.png");// image pion noir damenoir= gtk_image_new_from_file ("croixnoir.png");// image pion noir for(i=0 ;i<=8 ;i++) { for(j=0 ;j<=8 ;j++) { switch ((int)(plateaux->plateau_modele[i][j])) { case O : gtk_button_set_image (GTK_BUTTON(plateaux->jeubouton[i][j]), NULL); break; case b : gtk_button_set_image(GTK_BUTTON(plateaux->jeubouton[i][j]), pionblanc); break; case B : gtk_button_set_image(GTK_BUTTON(plateaux->jeubouton[i][j]), dameblanc); break; case n : gtk_button_set_image(GTK_BUTTON(plateaux->jeubouton[i][j]), pionnoir);break; case N : gtk_button_set_image(GTK_BUTTON(plateaux->jeubouton[i][j]), damenoir); break; default : break; } } }}
Comment dois-je l'introduire ??
merci encore!!
Hum... c'est assez bourrin de tout mettre à jour comme tu fais, mais le principe c'est de mettre à jour l'affichage dès qu'il y a eu un déplacement, donc sur click sur le bouton de destination d'un pion.
Comme je te l'ai dit, tu dois l'appeler pour mettre à jour l'état de l'interface graphique, quand l'état du damier a changé. Et quand change-t-il ? Quand tu déplaces un pion. Et quelle fonction est appelée automatiquement quand tu déplaces un pion ? La callback du signal "clicked" associé à ton GtkButton de destination. Les actions à faire sont donc:
- vérifier le bouton pressé est bien la destination d'un déplacement (et donc qu'un pion a déplacer a déjà été sélectionné auparavant)
- appeler ton moteur de jeu pour vérifier que le déplacement est valide
- mettre à jour l'état interne du jeu pour refléter le déplacement (déplacement du pion, prise de pion adverse éventuelle, création de dame)
- mettre à jour l'interface graphique à partir de l'état interne du jeu (c'est ta fonction "actualiser" !)
Pour le reste, c'est tout de même un devoir, je ne suis pas fan de filer du code prêt à l'emploi... Propose nous quelque chose et on t'aidera à corriger.
Dans ce cas, faut-il réécrire les fonctions écrites sans GTK en des fonctions qui seront appelées par G-CALLBACK ? C'est à dire modifier les paramètres de cette façon :
Ce qui voudrait dire qu'il faudrait tout rentré dans une structure unique?Code:void mafonction(GtkWidget* widget, gpionter* data) ;
Cela veut juste dire que si tu veux pouvoir passer plusieurs arguments à ta callback, il faut forcément les passer dans une structure, parce que tu n'as qu'un seul paramètre que tu peux utiliser pour cela, le gpointer data (et pas gpointer *data).
Cela ne veut pas dire que tu dois transformer le prototype de la fonction de ton moteur de jeu pour lui faire respecter le prototype de la callback du signal "clicked". Elle ne doit pas devenir une callback elle-même, elle doit se faire appeler par la callback.
Je ne comprends pas trop ton soucis. Une callback, c'est juste une fonction. À l'intérieur, tu peux appeler une autre fonction à toi, quelle que soit son prototype, du moment que tu lui passes les bons arguments en entrée.