[Delphi 4] 2 problèmes dans la création d'un Othello

Répondre
Partager Rechercher
Amis de l'informatique bonsoir

Bon voilà j'ai besoin d'un petit coup de main pour mon projet de cette année sous delphi 4, à savoir Othello

Le premier problème: j'ai créé ma grille de jeu en créant 64 shapes... sur chacune de ces shapes j'ai disposé une shape ronde représentant un pion (qui sera soit visible soit invisible selon l'avancement du jeu)Comment transformer ces shapes en coordonnées verticales et horizontales, de (1,1), (1,2)... à (8,8)?

Deuximème problème: ensuite, au passage de la souris au dessus d'une case, le curseur est sensé changer d'apparence selon que la case est jouable ou non... doit-on étudier pour chaque case (x,x) du plateau les coordonnées des pions se trouvant sur les lignes diagonale, horizontale et verticale dont fait partie la case (x,x)? ou existe t-il une procédure marchant pour toutes les cases?

Merci d'avance
Re: [Delphi 4] 2 problèmes dans la création d'un Othello
Citation :
Provient du message de Hôte des Songes

Amis de l'informatique bonsoir

Bon voilà j'ai besoin d'un petit coup de main pour mon projet de cette année sous delphi 4, à savoir Othello

Le premier problème: j'ai créé ma grille de jeu en créant 64 shapes... sur chacune de ces shapes j'ai disposé une shape ronde représentant un pion (qui sera soit visible soit invisible selon l'avancement du jeu)Comment transformer ces shapes en coordonnées verticales et horizontales, de (1,1), (1,2)... à (8,8)?

Deuximème problème: ensuite, au passage de la souris au dessus d'une case, le curseur est sensé changer d'apparence selon que la case est jouable ou non... doit-on étudier pour chaque case (x,x) du plateau les coordonnées des pions se trouvant sur les lignes diagonale, horizontale et verticale dont fait partie la case (x,x)? ou existe t-il une procédure marchant pour toutes les cases?

Merci d'avance
Pas compris la question 1, surtout à cause du mot Shape et à ma totale nullité en programmation

Disons que bêtement, je dirais que la case X,Y s'étend de BaseX + LCase x (X-1) à BaseX + LCase x X dans le sens des abscisse et la même chose avec Y dans le sens des ordonnées mais je ne pense pas que ça réponde à ta question

Pour la question 2, le plus simple est à la fin de chaque coup de faire une table des cases jouable - non jouable (matrice de 64 bit). Ensuite tu n'as plus qu'à vérifier pour chaque case si elle est jouable ou pas.

Case jouable si
- pas déjà jouée et
- est adjacente à une rangée de pions de la couleur adverse se terminant par un pion de la couleur à jouer.

Bonne chance

Ciao,
LoneCat
Re: Re: [Delphi 4] 2 problèmes dans la création d'un Othello
Citation :
Provient du message de LoneCat
Pas compris la question 1, surtout à cause du mot Shape et à ma totale nullité en programmation

Disons que bêtement, je dirais que la case X,Y s'étend de BaseX + LCase x (X-1) à BaseX + LCase x X dans le sens des abscisse et la même chose avec Y dans le sens des ordonnées mais je ne pense pas que ça réponde à ta question

1 shape= 1 simple case .. j'ai donc collé 64 shapes les unes aux autres pour faire ma grille de 64 cases...

Heu sinon qu'appelles-tu par BaseX + LCase x (X-1) à BaseX + LCase x X ? A po compris là

le fait de nommer chaque case (donc chaque shape) (X,Y) suffit-il à ce que l'opération (que je ne comprends pas ) que tu as écrite au dessus fonctionne?

Citation :
Pour la question 2, le plus simple est à la fin de chaque coup de faire une table des cases jouable - non jouable (matrice de 64 bit). Ensuite tu n'as plus qu'à vérifier pour chaque case si elle est jouable ou pas.

Une procédure récursive?
Re: [Delphi 4] 2 problèmes dans la création d'un Othello
Citation :
Provient du message de Hôte des Songes
Amis de l'informatique bonsoir

Bon voilà j'ai besoin d'un petit coup de main pour mon projet de cette année sous delphi 4, à savoir Othello

Le premier problème: j'ai créé ma grille de jeu en créant 64 shapes... sur chacune de ces shapes j'ai disposé une shape ronde représentant un pion (qui sera soit visible soit invisible selon l'avancement du jeu)Comment transformer ces shapes en coordonnées verticales et horizontales, de (1,1), (1,2)... à (8,8)?

Deuximème problème: ensuite, au passage de la souris au dessus d'une case, le curseur est sensé changer d'apparence selon que la case est jouable ou non... doit-on étudier pour chaque case (x,x) du plateau les coordonnées des pions se trouvant sur les lignes diagonale, horizontale et verticale dont fait partie la case (x,x)? ou existe t-il une procédure marchant pour toutes les cases?

Merci d'avance
Que je sois sûr de bien comprendre :
1) Tu as 64 éléments, numérotés de 1 à 64, et tu voudrais, à partir d'un indice (variant entre 1 et 64, donc), calculer la ligne et la colonne correspondante ?

2) Toujours à partir d'un indice entre 1 et 64 (ou tes coordonnées 8/8), tu voudrais la formule des diagonales, de la ligne et de la colonne qui passe par cette case ?

Question 1, facile, pour un indice i, ta ligne, c'est i/8 (partie entière), et la colonne i modulo 8 (ou l'inverse, mais c'est moins courant...)

Question 2 :
a) Il est largement préférable de créer un tableau à la fin de chaque coup, tout simplement parce que tu n'as pas à tout recalculer à chaque fois que tu bouges la souris.
b) Même si tu tiens à calculer à la volée, je vois pas l'intérêt de savoir la diagonale, la ligne et la colonne. Pour chacune des 8 directions, tu regardes s'il y a un pion adverse. Si oui, tu continues dans la même direction, jusqu'à ce que tu trouves un pion de ta couleur. Si oui, la case est jouable. Tous les autres possibilités (bord trouvé, pas de pion adverse sur la case adjacente, etc.) rendent la case non jouable.

Au passage, petit conseil : tu éviteras pas mal de problèmes et une trop grande complexité du code en déclarant non pas 64 cases, mais 100 : ton plateau sera entouré par des cases "sentinelles", qui te serviront de condition d'arrêt (plutôt que de vérifier que tes coordonnées sont toujours dans les limites du plateau).
Re: Re: [Delphi 4] 2 problèmes dans la création d'un Othello
Citation :
Provient du message de Lwevin Myan
Que je sois sûr de bien comprendre :
1) Tu as 64 éléments, numérotés de 1 à 64, et tu voudrais, à partir d'un indice (variant entre 1 et 64, donc), calculer la ligne et la colonne correspondante ?

2) Toujours à partir d'un indice entre 1 et 64 (ou tes coordonnées 8/8), tu voudrais la formule des diagonales, de la ligne et de la colonne qui passe par cette case ?
Le problème est que ce n'est pas parce que j'appelle un case (1,1) que le programme va considérer que x=1 et y=1, doit y avoir uen manip intermédiaire
je crois qu'il faut absolument que chaque case (en fait chaque pion, puisque ce sont les pions placés sur les cases qui apparaissent ou restent invisibles selon le coup joué) ait une coordonnée précise (x,y) pour justement pouvoir ensuite comparer les coordonnées de la case soupçonnée jouable et les coordonnées des pions qui sont sur les verticale, horizontale et diagonale... pour l'horizontale et la verticale il suffit de comparer soit les x soit les y, mais pour la diagonale je vois pas trop

Pour le coup de recréer un nouveau tableau (la matrice de 64 selon Lonecat?) prenant en compte la nouvelle situation après chaque coup, c'est encore une chose que je ne sais pas faire (vive les projets à faire sans préparation préalable )
Tu dois d'abord essayer de decomposer les phases de jeu.

Pour la mise à jour de l'interface, il ne faut pas te focaliser la dessus, c'est vraiment la chose la plus simple.

Par contre, je te conseille de representer la grille d'abord de façon "logique", plutot que rester sur tes shapes uniquement.

Aprés tu nommes tes shapes de façon a ce que le coin inférieur gauche s'appelle "shp11' et le coin supérieur droit 'shp88', si tu vois ou je veux en venir. ( sinon arrête l'info, lol ).

je supose que ta fiche principale s'appelle frmMain

Code PHP:

Type
  TGrille 
: Array [1..8of Array [1..8of integer;

var
  
MaGrille Tgrille;

procedure UpdateShape(ShapeNamestring;Etat:integer);
var
  
integer;
begin
  
for := 0 to frmMain.ControlCount-do begin
    
if frmMain.controls[i].Name ShapeName then
    begin
      
// Fait ce qu'il faut pour mettre a jour en fonction de ce qu'il y a dans ton tableau : rien, noir,blanc.
    
end;
  
end;
end;

procedure MetAjourLaGrilleGraphique;
var
  
i,integer;
  
CtrlName string;
begin
  
for := 1 to 8 do begin
    
for := 1 to 8 do begin
      CtrlName 
:= 'shp'+inttostr(i)+inttostr(j);
      
UpdateShape(CtrlName,MaGrille[i][j]);
    
end;
  
end;
end
Et voila, tu peux mettre a jour n'importe quelle shape en quelques lignes de code, de façon totalement automatique.

Quand un coup sera joué, tu va devoir simplement appeller MetAJourLaGrilleGraphique aprés avoir mis a jour la logique avec le resultat du coup.
Re: [Delphi 4] 2 problèmes dans la création d'un Othello
Citation :
Provient du message de Hôte des Songes
Deuximème problème: ensuite, au passage de la souris au dessus d'une case, le curseur est sensé changer d'apparence selon que la case est jouable ou non... doit-on étudier pour chaque case (x,x) du plateau les coordonnées des pions se trouvant sur les lignes diagonale, horizontale et verticale dont fait partie la case (x,x)? ou existe t-il une procédure marchant pour toutes les cases?
Gestionnaire d'evenement ( Events ) OnMouseMove.
Tu le code pour une case ( en utilisant mon systéme de nomage 'shp11'>'shp88' ) et tu "intéroge" ta Grille pour savoir ce que tu peux faire.
Aprés tu n'as plus qu'a attribuer la même fonction pour les events onMouseMove de tout les Shape de ta form.
Un tableau serait une solution bien plus simple que les 64 variables que tu as déclare. Cela permettrait de pouvoir gérer les "shapes" par indices plutôt que de faire un case à 64 possibilités pour chaque "shape".
J'y avais penser mais il risque de pas piger trés fort l'allocation, et les propriétés a mettre vont le faire changer d'avis )

Sinon, si tu penche pour un tableau de shape.


Code PHP:

MaGrilleGraphique : Array [1..8of Array [1..8of Tshape;

procedure RemplitMesShape(ecartX,ecartYinteger);
var
 
i,integer;
begin
// Boucle d'allocation des propriétés des Tshape
For := 1 to 8 do begin
  
For := 1 to 8 do begin
    MaGrilleGraphique
[i][j] := Tshape.Create;
    
Tshape.top := ecartY*j;
    
Tshape.left := ecartX*i;
    
// Etc pour toutes les propriétés qui font un Tshape digne de ce nom.
    // je te laisse bosser pour allouer de cette façon les events.
  
end;
end
J'espere que tu as le temps de bosser cette appli
Methode plus directe aussi, qui t'evite de devoir utiliser 64 Tshape et qui utilise un tableau d'entier pour stocker l'aire de jeu ( le fameux MaGrille ).

A mon avis c'est la meilleure.
Code PHP:

procedure TForm1.PaintMaGrille(EcartXEcartYinteger);
var
 
i,integer;
 
MonGraph TBitmap;
begin
  MonGraph 
:= TBitmap.Create;
  for 
:= 1 to 8 do begin
    
for := 1 to 8 do begin
      
case MaGrille[i][jof
        0 
MonGraph.LoadFromFile(GetCurrentDir+'\'+'Case.BMP');
        1 : MonGraph.LoadFromFile(GetCurrentDir + '
\' + 'Pion_Noir.BMP');
        2 : MonGraph.LoadFromFile(GetCurrentDir + '
\' + 'Pion_Blanc.BMP');
      end;
      Form1.Canvas.Draw(i*EcartX,j*EcartY,MonGraph);
    end;
  end;
end;

Les +'
\'+ sont des antislash ( qui ne passent pas, bouh ) 
Un conseil : utilise un TStringGrid pour ta représentation, tu auras ensuite a disposition plusieurs évènements concernant la souris du genre onDblClick et onSelectCell (qui te donne directement les coordonnées de la case cliquée), onMouseMove etc...

Et au lieu de tracer sur le canevas de la TForm qui t'oblige a calculer les coordonnées des cases, tu travailles directement sur le TStringGrid.

My 2 cts.
s'incruste sur le topic
Citation :
Provient du message de Hôte des Songes
pfiou c''est pas avec les 4 td et les 8 tp de delphi que j'ai eu cette année que je vais savoir faire ça
tssss, je sens que certains ont séché les amphis de delphi...
M'étonnes pas qu'on était pas nombreux.

C'est bien sympa que t'ais demandé ça...
Je vais en profiter pour mettre mon projet à jour .
(mais c'est pas un othello le mien)


Kelem ou Hannibal, ou un(e) autre :
Savez vous comment on intègre des images/Shape TBitmap (ce sera très bien les TBitmap) sur un TStringGrid ?
au pire un DrawGrid, mais je suis pas sur que ce soit aussi pratique pour renvoyer des coordonnées
D'ailleurs, pour me faciliter la tache, en 2 mots, je réccupère comment les coordonnée de clic d'une StringGrid ?


Mon projet est joli et marche bien pour le moment... mais la prof m'a dit que c'était un peu trop complexe pour elle... du coup faut que je simplifie plein de trucs .

Edité pour compléter/modifier un poil la demande.
Pour mettre des Formes complexes il faut utiliser le DrawGrid, TstringGrid ( comme son nom l'indique ) est destiné aux chaines.

Il faut écrire un gestionnaire OnDrawCell qui va dessiner sur ta grille l'objet désiré.
OnDrawCell a plusieurs paramètres qui te permettent de savoir ou tu es dans ton DrawGrid et dans ta form.

Code PHP:

procedure TForm1.DrawGrid1DrawCell(SenderTObjectAColARowInteger;
  
RectTRectStateTGridDrawState);
var
  
MonBitMap Tbitmap;
begin
  
if (Acol 1) and (Arow 1then begin // Exemple stupide mais revelateur de la methode a utiliser.
    
MonBitMap := TBitmap.Create;
    
MonBitMap.LoadFromFile('c:\A.BMP'); // il faut toujours un A.BMP sur c: ^^
    
DrawGrid1.Canvas.BrushCopy(rect,MonBitmap,rect,clBlack); // et hop, il dessine comme un grand. a noter que j'utilise 2 fois RECT, le rect source doit normalement être modifié pour, sauf si ton BMP fait parfaitement la taille de tes cells.
  
end
J'utilise rarement ce genre de trucs, désolé d'être aussi peu loquace
Citation :
Provient du message de Hannibal da GimpZor
Pour mettre des Formes complexes il faut utiliser le DrawGrid, TstringGrid ( comme son nom l'indique ) est destiné aux chaines.
Pas totalement juste, extrait de l'aide D6 :

StringGrid est un contrôle grille conçu pour simplifier la gestion de chaînes et d'objets associés.

[...] TStringGrid introduit la possibilité d'associer un objet à chaque chaîne de la grille. Ces objets peuvent encapsuler des informations ou des comportements représentés par les chaînes proposées à l'utilisateur.


Remarquez le "objets associés". TStringGrid ne pose aucun problème pour gérer des TBitmap dans son canevas, ils se tracent également à l'aide de la méthode Draw avec quelque chose du genre myGrid.Canvas.Draw(x,y,myBitmap).

Et à noter que TStringGrid hérite de TDrawGrid donc possède quelques avantages, méthodes et évènements, supplémentaires (comme l'association d'une chaine à un objet quelconque, par exemple).

Au passage, préférez la méthode LoadFromResourceName à LoadFromFile, elle vous évite de stocker vos sprites dans plusieurs fichiers. Vous pouvez tous les regrouper dans un seul fichier de ressources.
Citation :
Provient du message de Hôte des Songes

(j'ai joué à T4C donc tu peux passer certains détails dans l'explication)
Les effets de T4C sont encore plus terrifiants que je ne l'imaginais

CORWIN viens voir ça !!!

Ciao,
LoneCat
Re: re: 2 problèmes dans la création d'un Othello
Citation :
Provient du message de Iminra Aredhel
Trouve lui une Desdémone, et supprime Iago!





désolée, j'ai honte de moi!





* S'essuie la larme à l'oeil *

Hmmm... reprenons notre sérieux ...

Sur D6, l'onglet des composants que tu dois sélectionner est "Supplement", tu trouves le TStringGrid et tu le colles sur ta Form principale . Ensuite, tu auras accès à toutes les méthodes et évènements dans l'Explorer.
Cool
Citation :
Provient du message de Hôte des Songes
explication plz :aide:

(j'ai joué à T4C donc tu peux passer certains détails dans l'explication)
C'est de Shakespear inculte, pas de T4C.

Rhooo, la honte sur ce coup la Hôte. ^^
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés