Minmrst
Messages postés5Date d'inscriptionsamedi 16 janvier 2010StatutMembreDernière intervention 4 juin 2010
-
26 avril 2010 à 19:52
Minmrst
Messages postés5Date d'inscriptionsamedi 16 janvier 2010StatutMembreDernière intervention 4 juin 2010
-
27 avril 2010 à 19:30
Bonjours,
Il s'agit de mon premier post
Je suis étudiant en BTS IG en première année, et pour apprendre les algorithmes et la programmation nous utilisons "DELPHI 5"
Pour mon plaisir personnel, j'ai décidé de crée un jeu d'échec, il en est au tout début, mais déjà un problème (enfin plusieurs mais je ne vais pas vous arroser de questions et me débrouiller un peu ^^) me gène assez fréquemment.
Mes pièces se déplacent de la manière suivante : je clic sur l'image du cavalier : "Wcav1" (W pour white, je fais du "franglais") qui enregistre la position de l'image, et le nom de la pièce.
en code :
procedure TForm1.Wcav1Click(Sender: TObject);
var TOP,LEFT : integer;
begin
INITMOVE(); // efface les positions de déplacements
Piece := 'Wcav1'; // enregistre le nom de la pièce sélectionné
TOP := Wcav1.Top; // enregistre la coordonnée y de l'image
LEFT := Wcav1.left; // enregistre la coordonnée x de l'image
RECHMOVE(TOP,LEFT); { envoie les coordonnée position du cavalier
end; et affiche les posibilités de déplacement }
une fois l'affichage des images (représentés par des points bleus sur l'échiquier) des diverses cases sur lesquels mon cavalier peut se déplacer, cliquer sur l'une d'elle déclenchera le déplacement de du cavalier.
en code :
procedure TForm1.C3Click(Sender: TObject);
begin
if piece = 'Wcav1' then begin // Ici l'objet de mon problème
Wcav1.Top := C3.top; // le cavalier prend la coordonnée
// x de la case souhaité
Wcav1.left := C3.left; // le cavalier prend la coordonnée
// y de la case souhaité
INITMOVE(); // efface les positions de
// déplacements possible
end;
Peut-être l'avez vous déjà remarquer : ma méthode surement archaïque, pose un problème. Je doit proposé pour les 64 cases, les conditions "if" correspondant aux 32 pièces existantes. ce qui est de toute évidence une méthodes archaïque.
serait-il possible d'écrire quelque chose sous la forme :
procedure TForm1.C3Click(Sender: TObject);
begin
[piece].Top := C3.top; // la variable pièce correspondant à 'Wcav1' ici
[piece].left := C3.left; // faisant référence à l'image portant le même
INITMOVE(); // nom
end;
Peut-être existe-t-il une solution plus simple auquel je n'aurais pas pensé.
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 27 avril 2010 à 11:18
Salut.
Pour reprendre ce que dit, à raison, Guillemouze : tu devrais repenser la structure de ton programme.
Là, je n'ai pas trop le temps d'entrer dans les détails, mais voici quelques pistes et conseils:
- séparer la partie moteur (gestion des cases, des déplacements) de la partie affichage. Fais d'abord un bon moteur sans t'occuper de l'affichage. Si par la suite tu veux modifier ton affichage, ce sera beaucoup plus simple: en faisant des OnClick sur des TImage, tu te bloques.
- un array deux dimensions [1..8, 1..8] pour mémoriser la position des pièces. Tu attribues à chaque pièce une valeur numérique (Roi blanc = 1...)
- un PaintBox dessinant le bitmap de ton échiquier.
- simplement des événements OnMouseDown, OnMouseUp(...) sur le PaintBox. Facile d'après les coordonnées X et Y de retrouver la case dans ton array.
- gestion des déplacements (cases autorisées...)
- Après déplacement autorisé, re-dessin sur le PaintBox de la case de départ et de la case d'arrivée (à l'aide de simples bitmaps mis p.ex. en ressources).
- Dans ton programme, il faut faire 2 clics : 1 sur une image, 1 sur la case d'arrivée. Ce serait plus agréable pour l'utilisateur de ne devoir cliquer qu'une fois et de travailler par Drag and drop.
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 26 avril 2010 à 21:08
A ce que j'ai compris, tu as une image par pion, et une par case.
Perso je pense que tu devrai revoir un peu la structure.
A ta place, ce que je ferais, ca serait:
[list]
[*] Un bitmap pour l'echiquier, avec un ensemble de fonction :
- PointToCase: qui retourne la ligne & colonne contenant un point (pixel)
- CaseToPoint : qui te retourne le point de reference d'une case
- etc ...
[*] faire une classe TPiece (heritant de TImage ?) fournissant des fonctionnalités comme les deplacements possibles, la gestion du OnClick, ...
/list
Sinon, si tu veux continuer sur ta lancée, tu peux declarer "Piece" comme TImage (ou TObject ou ...) au lieu d'une string. Ainsi tu pourra faire Piece.Top, ...
Minmrst
Messages postés5Date d'inscriptionsamedi 16 janvier 2010StatutMembreDernière intervention 4 juin 2010 27 avril 2010 à 19:30
Daccord je vais me lancer sur cette voie. c'est vrai que pour l'instant je ne suis qu'en première année. Et nous ne verrons que l'année prochaine la POO. donc pour l'instant avec mes moyens je voulais tenté d'aller aussi loin que possible.
les tableaux en deux dimensions sont de mon ressort donc je vais me relancer sur ma structure.
merci à vous ThWilliam et Guillemouze je vais suivre vos conceils.