Aide pour Variable lié à une image bitmap [Résolu]

Messages postés
5
Date d'inscription
samedi 16 janvier 2010
Dernière intervention
4 juin 2010
- 26 avril 2010 à 19:52 - Dernière réponse :
Messages postés
5
Date d'inscription
samedi 16 janvier 2010
Derniè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é.

Merci d'avance

Minmrst
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
424
Date d'inscription
mardi 3 janvier 2006
Dernière intervention
26 novembre 2013
- 27 avril 2010 à 11:18
3
Merci
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.

N'hésite pas à demander des précisions.

A +
Thierry

Merci ThWilliam 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de ThWilliam
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
- 26 avril 2010 à 21:08
0
Merci
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, ...
Commenter la réponse de Guillemouze
Messages postés
5
Date d'inscription
samedi 16 janvier 2010
Dernière intervention
4 juin 2010
- 27 avril 2010 à 19:30
0
Merci
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.
Commenter la réponse de Minmrst

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.