# Java > Interfaces Graphiques en Java > AWT/Swing >  Bataille navale avec interface graphique.

## SoulHokib

Bonjour,

Dans le cadre de ma deuxime anne de prpa intgre, je dois raliser une bataille navale avec interface graphique (j'ai slectionn SWING) avec un mode de jeu contre l'ordinateur. Globalement, j'ai saisi comment dvelopper  peu prs toutes les fonctionnalits telles que le placement des bateaux, les tirs etc. J'ai pris le parti de crer une classe Case contenant des JButton afin d'exploiter les interactions des JButton par la suite (la classe est jointe ci-dessous).



```

```

J'aimerai donc russir  afficher une grille de dimension 10 x 10 compose de Cases. Cependant, je n'arrive pas  ajouter lesdites Cases au sein d'un JPanel pour les afficher. Sauriez-vous m'aider ? Je vous joins le code, qui bloque au niveau de la ligne 30. J'ai vraiment besoin de me sortir de ce problme afin de pouvoir avancer sur le reste du problme.



```

```

En vous remerciant.

----------


## dinobogan

Tu as oubli d'ajouter le JPanel "grille" dans le JPanel "affichage".

Sinon, c'est une trs mauvaise pratique de placer pleins de JButton comme a. Il est prfrable d'afficher une image (BufferedImage) et de grer compltement les interactions souris en fonction de sa position sur l'image. Le code sera plus simple et l'interface plus souple.

----------


## joel.drigo

Salut,

Il n'y a pas que le problme de l'ajout de la grille dans le panel affichage (si tant est que ce dernier est bien mis lui-mme dans une fentre).

Personnellement, je prfre galement faire ce genre d'interface en Java2D + images, parce que a permet de faire quelque chose de plus joli et plus souple, mais si tu veux continuer avec des composants Swing, il faut penser qu'un Conteneur Swing (Container) ne peut contenir que des Composants Swing (classe JComponent au moins). 



```

```

C'est le bouton qui se trouve rfrenc dans la variable button de l'instance de Case qu'il faudrait ajouter  la grille (donc avoir un accesseur), pas la liste de cases, genre :



```

```

----------


## SoulHokib

Je vais essayer de me pencher du coup sur l'ide d'utiliser des images.

----------


## SoulHokib

Pour tre honnte, j'ai fais pas mal de recherches et je n'arrive pas  m'en sortir pour le moment. Sauriez-vous m'aider pour une exemple de grille cre comme ce dont vous parlez ?
Actuellement, je me retrouve avec une grille de Jbutton qui affichent des images, mais je me retrouve confronts aux problmes de base et j'ai du mal  visualiser comment rcuprer une valeur et la position "derrire" un bouton. J'aurais besoin d'aiguillage, pour tre honnte.



```

```

Merci beaucoup encore ...

----------


## joel.drigo

Salut,

Premirement, pour dtecter une action sur le bouton, il faut un ActionListener :

A l'ancienne par classe :


```
button.addActionListener( une classe qui implémente l'interface ActionListener )
```

Par expression lambda
[CODE]button.addActionListener( event-> "un appel de mthode" )

Dans les deux cas, une mthode sera implmente : cette mthode doit pouvoir savoir quelle case de la grille a t sollicite. Il faut donc un moyen de le faire. On peut grer a via une classe qui reprsente la classe, ou soit simplement avec des paramtres. Tout d'abord, il est toujours plus simple de grer des index compris entre 0 et un max inclus. Les formules sont plus simples, les tests aussi.



```

```

Ensuite, partont sur principe d'une mthode :


```

```

On rcupre le bouton ce qui permettra ventuellement de changer son tat (changer l'icne par exemple). Et on rcupre les coordonnes de la case, x pour les colonnes, y pour les lignes.

Les formules pour passer d'un index j de 0  max-1  des coordonnes dans une grille sont  simples :
y = j/nombre de colonnes
la division tant entire, on obtient bien le numro de ligne, de 0  nombre de lignes-1x = j%nombre de colonnes
le reste de la division entire est le numro de colonne, de  nombre de colonnes - 1on retrouve j  partir de x et y : j = y*nombre de colonnes + x

Donc on peut crire :



```

```

----------


## SoulHokib

Bonjour.

Dj merci pour ta rponse rapide, je reverrais le point du GridLayout. J'ai voulu tester ton code pour le prendre en main, mais une erreur a lieu ici : 

```
button.addActionListener(event->caseClick(button, j/SIZE, j%SIZE));
```

Il y'aura un problme de variable locale, saurais-tu me l'expliquer ?

Encore une fois, merci beaucoup.

----------


## joel.drigo

> Il y'aura un problme de variable locale, saurais-tu me l'expliquer ?


Ah, oui, le souci c'est avec j qui n'est pas effectivement final : on ne peut pas utiliser de variable non final dans une expression lambda. Ecris :



```

```

----------


## SoulHokib

Bien, merci beaucoup, je vais tester tout a et essayer de me dpatouiller pour le reste !

----------


## SoulHokib

Bonjour !

J'explore peu  peu les possibilits du button, mais j'ai d mal  saisir ce que tu m'as aid  raliser. Concrtement, j'ai trouv la fonction qui permet de mettre  jour l'icne du bouton. Cependant, dans le "caseClick", j'ai ajout un champ "value", qui est la valeur que je souhaite octroyer au bouton pour me permettre de faire des comparaisons (0 = case non touche, 1 = case touche mais vide, 2 = case touche avec bateau, etc ...). Je l'ai initialis  la suite des coordonnes, mais j'ai du mal  saisir ce que je devrais crire dans le "caseClick" pour pouvoir mettre  jour la valeur de la case, dois-je me servir du "getAccessibleContent()" ?

Je vous fais parvenir le code que j'ai  peine modifier, n'ayant que peu retravaill sur le projet entre temps.



```

```

EDIT : Mme si je veux bien une explication pour la partie caseClick, que je pense cependant avoir comprise ce coup-ci, j'ai russi par moi-mme  modifier mes valeurs et changer l'icne dynamiquement. Merci beaucoup pour l'aide apporte en amont, elle correspond parfaitement  ce que j'attendais.

----------


## joel.drigo

Le mieux c'est de constituer une reprsentation de ta case indpendante de ce que tu utilises pour la reprsenter dans l'UI : ainsi passer d'une reprsentation par JButton  une reprsentation par autre chose (JLabel avec une image, image directement en Java2D, ou peu importe) ne modifie pas cette rprsentation. On appelle a le MVC : modle/vue/contrleur. Le modle est ce qui reprsente la case indpendamment de sa gestion et de l'UI, donc ses proprits (touch, coul, partie d'un bateau de type x...). Le contrleur est le code de gestion (si on tire sur la case, et qu'il y a une partie de bateau dedans, alors il se passe ceci...), y compris la partie venement d'UI. La vue est la reprsentation graphique. Un moyen simple d'viter d'avoir du code qui dpend du contrleur ou de la vue dans le modle est de procder par vnement (voir les classes PropertyChangeSupport et SwingPropertyChangeSupport). Le modle ignore compltement le contrleur et la vue : il reprsente une case de jeu de bataille navale et c'est tout, mais permet  d'autres objets d'tre informs des changements de ses attributs par venement. La vue se met  jour en coutant les changements dans le modle. Le contrleur coute les deux et envoie des ordres aux deux pour raliser le fonctionnement de tout a (changer telle proprit dans le modle).

Maintenant, on peut aussi simplifier en faisant des tableaux qui contiennent les tats.



```

```

Et donc tu peux ensuite crire par exemple :



```

```



```

```

----------


## SoulHokib

Je comptais initialement utiliser des classes "Bateaux". Mais comment crer des mthodes "placer bateaux", par exemple, qui se servirait d'un action listener ? Je dois ajouter un actionlistener spcifique, comme pour le "caseClicked" que tu m'as cr prcdemment ?

Merci beaucoup d'avance.

----------


## joel.drigo

Premirement il faut considrer qu'il y a une phase du jeu pendant laquelle on place des bateaux, phase qu'on peut grer avec une variable d'tat (ou par un affichage d'une interface spciale, mais il y'a toujours un moyen de savoir qu'on est en train de placer des bateaux, et non pas de jouer : par exemple, on pourrait imaginer faire une abstraction pour la grille, avec caseClic abstraite, et avoir 2 implmentations concrtes, une pour le placement, une pour le jeux, une pour la grille d'affichage de ses propres bateaux quand on joue). Si on gre plusieurs phases (le jeu finalement c'est des phases qui se succdent), on pourrait utiliser une enum, ou un boolen spcifique ( true, on place des bateaux,  false on fait autre chose).

Puisque tu veux faire le placement par clic (on pourrait utiliser plein d'autres moyens, comme le drag and drop par exemple), on peut
on peut cliquer sur un bateau dans une liste, puis cliquer sur une case pour le placer.  Cliquer sur le bateau dans la grille pour le basculer horizontal/vertical.
Pour faire a, il faut grer un tat de plus, qui dit on est entrain de placer un bateau de ce type l. Une variable rfrenant une instance de classe Bateau,  null quand aucun bateau n'est slectionn (par exemple placementBateau).
On pourrait alors avoir dans caseClicked :


```

```

On peut aussi faire qu'un clic gauche permet de replacer et un clic droit permet de basculer...La solution prcdent fonctionne en pure clic et me semble assez complexe et pas forcment super ergonomique (fastidieuse). Il y a une solution un peu plus old school peut-tre, mais beaucoup plus simple  implmenter.
Il n'y a plus d'affichage de liste de bateaux. On ne fait que cliquer dans la grille, sur des cases et donc dans caseClicked,


```

```

----------


## SoulHokib

La faon dont tu m'as dcris le droulement tait celle que j'avais prvu d'utiliser initialement. J'ai dj le plan de comment dvelopper les tours de jeu, en utilisant des listes pour les bateaux etc...
Cependant, l o j'ai des difficults dans la comprhension, c'est pour comment implmenter ma premire mthode de "placer bateaux". En fait, j'ai commenc  faire une mthode dans ma classe bateaux. Cependant, je ne sais pas comment y faire bien intervenir le caseClick (dois-je crer un nouvel actionListener ?) Je suppose que pour la mise  jour des valeurs j'ai juste  faire une boucle similaire  celle qui a initialis tous les boutons, mais je ne sais pas rellement o je dois crer ma mthode de placement.
Il est srement possible de tout faire dans le caseClicked sans rajouter de classes supplmentaires ou de mthodes supplmentaires, mais je suppose que ce n'est pas la manire dont je suis sens faire ?

Dsol encore pour toutes les questions que je vous pose, je vous remercie pour chaque rponse.

----------


## joel.drigo

> En fait, j'ai commenc  faire une mthode dans ma classe bateaux. Cependant, je ne sais pas comment y faire bien intervenir le caseClick (dois-je crer un nouvel actionListener ?)


La classe Bateau est une reprsentation d'un Bateau. Elle n'est pas cense tre au courant qu'il existe une UI Swing qui l'affiche et donc ne doit surtout pas avoir de dpendances sur Swing, ou sur ta grille, donc de rapport avec caseClick. 




> Je suppose que pour la mise  jour des valeurs j'ai juste  faire une boucle similaire  celle qui a initialis tous les boutons, mais je ne sais pas rellement o je dois crer ma mthode de placement.


a c'est autre chose. Le code de placement doit galement tre indpendant de l'UI. On peut placer un bateau dans une grille mme si on n'utilise pas d'affichage, ou si on fait un affichage en console ou dans une appli web, peu importe, c'est toujours la mme mthode.
En gros, l'algo c'est :


```

```




> Il est srement possible de tout faire dans le caseClicked sans rajouter de classes supplmentaires ou de mthodes supplmentaires, mais je suppose que ce n'est pas la manire dont je suis sens faire ?


Bah si justement, dans caseClick,ou dans une mthode appele dans caseClick pour une meilleure isolation, mais cette mthode ne sera pas dans Bateau, c'est sr.
Et c'est exactement ce que je t'ai montr dans mes pseudocodes (pseudocode pour viter de te donner le code tout fait)

----------


## SoulHokib

Oui, avoir le code entier ne m'intresse absolument pas, je cherche  comprendre et progresser, merci pour la rponse rapide. Je suis en train de continuer mes tests de placement, et je commence  saisir la faon de dvelopper que je devrais avoir. Je vais essayer d'avancer et de peaufiner par moi-mme. Je te remercie !

----------


## SoulHokib

Bonjour !

J'ai avanc dans la faon dont je dsire placer les bateaux, mais je me confronte  quelques problmes. Lors de mes tests, il semblerait que ma mthode "placerBateaux" se lance  chaque fois que je clique sur une case. J'ai pourtant essayer d'utiliser un boolen global appel "placement" ainsi qu'un while pour faire en sorte de ne passer qu'une seule fois dans ma mthode "placeBateaux", mais cela ne semble pas fonctionner. Il y'a vraisemblablement quelque chose que je ne sais pas bien manipuler avec les boolens/while. Sauriez-vous m'clairer sur ce point ?

Je vous fournis mon code pour que vous puissiez voir, ainsi que mon avance. A noter que je ralise des tests simplement avec Bateau2, je crerais la classe globale de bateaux par la suite, une fois que j'aurais russi  faire fonctionner parfaitement le placement d'un bateau.

Le code de Plateau : 

```

```

Le code de Bateau2 : 

```

```

Et mon numration nomme "Orientation" : 

```

```

Si vous pouviez m'aider sur ce simple point, a me serait d'une grande utilit. En vous remerciant encore une fois d'avance.

----------


## joel.drigo

Oull, dj tu ne devrais pas mlanger interface Swing et interface en console. En plus, il ne faut pas crer plusieurs instance de Scanner sur System.in, donc a fortiori dans une boucle (un seul devrait tre cr pour toute l'application). Plutt qu'une interface en console, tu devrais utiliser des dialogues. Avec JOptionPane tu feras des dialogues trs simples qui ressemblent  ce qu'on peut faire en console. Avec JDialog tu peux faire quelque chose de plus sympa ergonomiquement.

En plus tu enregistres deux couteurs venements sur le bouton :


```

```

et la mthode appele dans le second couteur appelle la mthode que celle appele dans la boucle appele lors de l'excution du premier couteur. 

Le premier couteur fait bien une boucle tant que placement est  true. Mais le second le fait toujours. C'est pour a que placement est toujours appele.

Tu dois grer un systme de phases. Au dbut, tu as une phase de placement de bateau : toute ton interface ragit comme un systme qui ne fait que du placement de bateau. Ensuite, quand tous les bateaux sont placs, ton interface se comporte diffremment : comme une interface qui permet de jouer. 
Soit tu gres a par un tat (le boolan) soit tu gres a par des fentres diffrentes qui utilises deux versions lgrement diffrentes de la classe si tu penses que c'est plus simple (mais je pense que a ne l'est pas).

Voici un petit exemple vite fait (un jeu bidon : on saisit le texte de 4 boutons, puis les textes disparaissent et on a 8 essais pour dire o et quels taient les textes qu'on avait mis, avec trois phases donc, une phase de placement, une phase de jeu, une phase fin du jeu)



```

```

----------


## SoulHokib

Oui, l'interface console c'tait juste pour faire mes tests car je ne matrise pas le reste, je vais y jeter un il. Je ne comptais absolument pas mlanger les deux, dsol pour a ^^
J'ai compris ducoup d'o venait l'erreur, je vais tout dvelopper par phase en utilisant des boolens ducoup. Merci beaucoup encore une fois !

----------


## SoulHokib

> La classe Bateau est une reprsentation d'un Bateau. Elle n'est pas cense tre au courant qu'il existe une UI Swing qui l'affiche et donc ne doit surtout pas avoir de dpendances sur Swing, ou sur ta grille, donc de rapport avec caseClick. 
> 
> 
> a c'est autre chose. Le code de placement doit galement tre indpendant de l'UI. On peut placer un bateau dans une grille mme si on n'utilise pas d'affichage, ou si on fait un affichage en console ou dans une appli web, peu importe, c'est toujours la mme mthode.
> En gros, l'algo c'est :
> 
> 
> ```
> 
> ...



Pour en revenir  ce message, je n'arrive pas  faire l'actualisation en cascade. Je ne vois pas, concrtement, comment choisir la case sur laquelle je veux actualiser les donnes. J'arrive donc  actualiser la valeur de ma case initiale, mais pas les suivantes en cascade. J'ai essay de reproduire l'algorithme que vous avez voqu, mais je n'aboutis  rien. Sauriez-vous m'expliquer ? En vous remerciant.

----------


## joel.drigo

La reprsentation d'un bateau n'a pas besoin de savoir o elle est place. C'est un bateau qui vit sa vie hors d'une grille, de la notion de placement et de tout le reste, c'est tout. 

Dans la grille on peut avoir par exemple :

























Case 1 du Bateau A



Case 1 du Bateau B
Case 2 du Bateau B
Case 3 du Bateau B
Case 4 du Bateau B



Case 2 du Bateau A










Case 3 du Bateau A

































































Donc la grille seule peut permettre de modliser des bateaux dans une grille. Le bateau n'a mme pas besoin de savoir qu'il est en x,y : la grille le sait. Seulement, il est plus simple de stocker le numro de case de bateau pour viter d'avoir  le rechercher  chaque fois qu'on a besoin.

Par exemple :


```

```

Ici, aprs placer un bateau, la grille a dans ces cases des morceaux de bateau et sait de quel bateau il s'agit. Elle ne sait pas si c'est l'avant du bateau, l'arrire ou le milieu. Mais aprs tout on s'en fout, tant qu'on a pas besoin de dessiner. On a juste besoin de savoir s'il y a un bateau (pour savoir si c'est un touch ou dans l'eau) et de savoir quel bateau (pour le toucher et ventuellement le couler). Pour le comptage des cases touches d'un bateau et leur position, on peut utiliser une grille avec les tats (comme dans l'exemple que je t'avais donn au dbut).

Maintenant, on peut aussi grer un petit tableau dans le Bateau, pour connaitre les tats (touch ou pas) et la position dans la grille, et l'orientation, pour plus facilement grer a en objet et faire un rendu plus sympa (dessiner chaque partie du bateau, dtruite ou pas, ou en train de couler, etc). Il suffit au moment o on place communiquer avec le bateau :



```

```

----------


## SoulHokib

> Le mieux c'est de constituer une reprsentation de ta case indpendante de ce que tu utilises pour la reprsenter dans l'UI : ainsi passer d'une reprsentation par JButton  une reprsentation par autre chose (JLabel avec une image, image directement en Java2D, ou peu importe) ne modifie pas cette rprsentation. On appelle a le MVC : modle/vue/contrleur. Le modle est ce qui reprsente la case indpendamment de sa gestion et de l'UI, donc ses proprits (touch, coul, partie d'un bateau de type x...). Le contrleur est le code de gestion (si on tire sur la case, et qu'il y a une partie de bateau dedans, alors il se passe ceci...), y compris la partie venement d'UI. La vue est la reprsentation graphique. Un moyen simple d'viter d'avoir du code qui dpend du contrleur ou de la vue dans le modle est de procder par vnement (voir les classes PropertyChangeSupport et SwingPropertyChangeSupport). Le modle ignore compltement le contrleur et la vue : il reprsente une case de jeu de bataille navale et c'est tout, mais permet  d'autres objets d'tre informs des changements de ses attributs par venement. La vue se met  jour en coutant les changements dans le modle. Le contrleur coute les deux et envoie des ordres aux deux pour raliser le fonctionnement de tout a (changer telle proprit dans le modle).
> 
> Maintenant, on peut aussi simplifier en faisant des tableaux qui contiennent les tats.
> 
> 
> 
> ```
> 
> ```
> ...


Comme tu me l'as suggr, je me suis pench sur cet exemple que tu m'as fourni. Je n'ai pas utilis la mthode setIcon car je ne la comprennais pas, j'ai adapt certains trucs. Cependant, dans la mthode CaseClick(), je ne comprends pas d'o sortent tous les "hit(x,y)"; "getLocation" etc. Sont-ce des mthodes que je dois crer dans ma classe Bateau ?

J'avoue que malgr les aides, je suis perdu et j'ai vraiment du mal, j'en suis dsol

----------


## joel.drigo

> Cependant, dans la mthode CaseClick(), je ne comprends pas d'o sortent tous les "hit(x,y)"; "getLocation" etc. Sont-ce des mthodes que je dois crer dans ma classe Bateau ?


Oui, ce sont bien des mthodes  implmenter dans la classe Bateau. Ou pas. C'est comme tu veux. Le but de cet exemple tait de donner l'ide gnral de l'algorithme. Disons qu'en objet c'est toujours mieux que les comportements soient dans les objets, puisque a permet d'isoler le code.

hit(x,y) 
Cette mthode est cense retourner true si on touche le bateau. Le fait de faire une mthode dans le bateau permet de faire ce qu'on veut au sein du bateau ( commencer par stocker une information qui va permettre de savoir qu'une case du bateau est touche, ce qui permet par exemple de faire un rendu spcial de la case, ou n'importe quoi d'autres comme traitement), et mme de dcider si le coup porte ou non selon des conditions diffrentes par type de bateau. Le plus simple soit qu'elle retourne true.getLocation() est cense retourner la liste des couples de coordonnes de case du bateau, ce qui permet  tout moment de les parcourir pour tester leur tat, donc de pouvoir dterminer si un bateau est coul ou pas, par exemple.




> Je n'ai pas utilis la mthode setIcon car je ne la comprennais pas


Cette mthode est cense dterminer en fonction de l'tat d'une case, l'image qu'on doit affecter au bouton, pour que le rendu soit conforme  cet tat. Par exemple, si la case est de la mer, on affiche une image de mer (a peut tre un carr tout bleu, ou une image symbolique bleu avec des petites vaguelettes blanches, ou une photo de mer, ou un M, ou n'importe quoi d'autres qu'on veut afficher. Evidemment pour de la mer, l'tat ne change pas en thorie (Il y a des variantes de batailles navales o on peut changer tout les n tours la position d'un bateau, et dans ce cas, une case pourrait passer de l'tat mer  l'tat bateau dedans). A chaque fois qu'on change l'tat d'une case (de bateau  bateau touch, de bateau touch  bateau coul, etc) on dtermine le nouvel icne  affecter au bouton qui est dans cet case. On peut aussi procder par venement (le bouton coute quelque chose lui disant voil ta nouvelle icne, mais a me semble plus compliqu  faire pour toi. Si tu avais opt pour la solution tout graphique comme on t'avait conseill au dpart, a aurait probablement t mieux.

----------


## SoulHokib

Si j'ai bien suivi tes explications, il va rester compliqu pour moi de faire la fameuse actualisation en cascade dont je parlais avec les JButton, car il est compliqu d'actualiser l'icne du bouton s'il n'est pas cliqu. Etant donn qu'il me reste du temps, penses-tu qu'il serait raisonnable de recommencer le projet du point de vue graphique en passant donc sur du Java2D + images ? Les mthodes dans leur conception logiquement ne seraient pas tant chamboules.

----------


## joel.drigo

Je ne comprends pas trop de quoi tu parles par "actualisation en cascade". 

On peut changer l'icne du bouton indpendamment du fait qu'il soit cliqu et a n'a rien de complexe ni de particulire compliqu. Mais changer l'icne d'un bouton est ncessaire suite  un changement d'tat : pour un joueur humain qui joue via l'interface, c'est forcment  la suite d'une action. Pour ce qui est d'une IA, le processus est le mme, simplement doit-il dlguer  l'EDT le changement d'tat (dans un MVC, ce serait fait par le contrleur naturellement), ce que doit faire de toute manire tout processus non graphique lorsqu'il doit modifier quelque chose dans l'UI.

Le truc qui est plus simple avec une UI en Java2D, c'est que tu peux faire des composants qui ont une mthode de rendu, alors qu'avec un bouton, sans faire un modle custom (ce qui n'est pas simple pour un nophyte), c'est que tu ne peux procder que par changement d'tat (l'tat dont je parle ici, c'est l'icne du bouton). 

Pour la dernire question, tout dpend de ce qu'il te reste comme temps et de tes facults  crer une interface purement graphique. Pour quelqu'un connaissant trs bien Java et ayant de bonne facults de conception, crer tout le jeu de bataille navale en Java2D avec un systme de base, sans la partie "cra graphique" et sans IA (a c'est une autre histoire), c'est l'affaire de quelques heures, sans se presser. Mais ce n'est pas ton cas.

----------


## SoulHokib

Quand je dis "en cascades" c'est qu'actuellement, quand je plaais un bateau, a n'actualisait l'icne que de la premire case du bateau, pas le reste. C'est a que je n'arrive pas  faire.

Cependant, tant donn qu'il me reste jusqu' Mai (thoriquement, j'aimerais avoir fini d'ici 1 mois) pour boucler la bataille navale, je vais srement rorienter sur du Java2D en utilisant des pane content (GridBagLayout ? Je ne sais encore lequel) dans lequel je dessinerais ma grille. Le travail jusque l n'tant pas perdu tant donn que certaines mthodes pourront tre rutilises en adaptant bien videmment au dessin.

----------


## joel.drigo

Ah, il n'y a pas de "cascade" dans cette histoire : la notion de cascade, c'est rcursif, c'est quand quelque chose dclenche quelque chose qui dclenche quelque chose qui dclenche quelque chose etc (comme une suppression en cascade d'un lment, qui va supprimer les lments qui lui sont rattachs par un lien dtermin, et donc la suppression de ces lments va elle mme dclencher la suppressions de ceux qui leur sont rattachs, etc).

On pourrait implmenter le placement de bateau de manire rcursive, mais ce serait se compliquer la vie alors qu'une simple boucle et une incrmentation est suffisante.

----------


## SoulHokib

Je ne vois pas quel type de boucle raliser. J'ai certes rcupr les valeurs x et y de la case du dbut du bateau, mais je ne peux pas changer ma valeur de case (qui permet de changer l'affichage) en faisant une boucle incrmentant par exemple sur x ou sur y.

J'ai par ailleurs commenc  travailler sur du Java2D et  faire des tests avec une reprsentation de grille  part de mon projet. J'ai aussi russi  crer un MouseListener fonctionnel. J'essaierais bientt d'adapter a pour ma bataille navale, je reviendrais vous si j'ai des questions. Encore merci, une fois de plus, vous m'aidez beaucoup.

----------


## joel.drigo

> Cependant, tant donn qu'il me reste jusqu' Mai (thoriquement, j'aimerais avoir fini d'ici 1 mois)


Il y a largement assez de temps !




> pour boucler la bataille navale, je vais srement rorienter sur du Java2D en utilisant des pane content (GridBagLayout ? Je ne sais encore lequel)


euh non justement plus de layout manager avec Java2D.

Regarde cet exemple :



```

```







> Je ne vois pas quel type de boucle raliser. .


Une boucle sur des cases. C'est ce que je te montre dans le message 21.
a c'est une boucle :


```
for(int i=0; i<bateau.getLongueur(); i++) {
```

L'image pour la petite dmo est en pice joint (image que j'ai rcupre sur OpenGameArt.org)

----------


## SoulHokib

Merci !

Je vais me pencher sur l'exemple ds que possible. J'ai juste une question. Est-il possible, par exemple quand je trace ma grille, de prendre l'angle haut gauche de la grille comme coordonne (0,0) ? (Peut-tre est-ce crit dans l'exemple, je le verrais  ce moment l alors). Ca simplifierait grandement les manipulations. Encore une fois merci beaucoup, je vais rester sur le Java2D.

----------


## joel.drigo

> Est-il possible, par exemple quand je trace ma grille, de prendre l'angle haut gauche de la grille comme coordonne (0,0) ?


oui, justement, c'est bien le cas, le haut-gauche, c'est toujours 0,0. Et c'est effectivement bien plus facile pour les calculs comme a.

----------


## SoulHokib

Je me suis peut-tre mal exprim. Concrtement, quand je vais faire ma fentre de jeu, j'aimerais tracer 2 grilles : une ordinateur, une pour le joueur. De ce fait, les deux ne seront pas "colls"  l'angle de la fentre (en 0,0), c'est donc possible de faire en sorte que pour chaque grille, son angle en haut  gauche soit considr comme tant la coordonne (0,0) (il y'aurait donc un systme de coordonnes propre  chaque grille) ?

Si c'est le cas, je me pencherais dessus pour trouver comment faire par moi-mme ! Merci encore.

----------


## joel.drigo

tu gres chaque grille dans un JPanel diffrent. Tu fais un objet Grille donc (qui tend JPanel). Aprs tout les deux grilles c'est la mme chose, donc autant en faire un objet. Ce qui vitera d'avoir  dupliquer tout le code. Et du coup, dans un panel, tu ne dessines qu'une grille. Donc pas de problme  se poser pour dessiner l'autre. Et ce panel, tu peux en faire autant d'instances que ncessaires, toutes les afficher dans une mme fentre ou dans plusieurs. Et tu peux mme ensuite faire des versions de grille : la grille pour placer peut s'afficher d'une manire lgrement diffrente que celle pour jouer. Celle du joueur va s'afficher diffremment de celle qui correspond  celle de l'autre joueur : dans celle du joueur il voit tous ses bateaux, et dans celle de l'autre, il ne voit que les parties de bateaux qu'il a dj touches.

----------


## SoulHokib

Bonjour !

Cela fait un moment que je ne suis pas pass, mais  l'approche de devoir rendre ma bataille navale, j'ai besoin une dernire fois de votre aide. Tout d'abord, ma bataille navale est finalement fonctionnelle, et j'ai russi  avoir un rendu qui me plat. Cependant, un dernier problme subsiste : lorsque je la lance, les cases (des Jbuttons) de mes grilles n'apparassent pas tant que je n'ai pas pass ma souris dessus. Ci-dessous un screen pour vous dmontrer le problme : 



Ci-joint, le code de mon main, qui cre la fentre, et celui de mon Panel de joueur, avec la cration des cases.

Le main : 



```

```

Ci-dessous mon panel de joueur, avec les parties intressantes :



```

```

Encore une fois en avance, merci pour votre aide.

----------


## joel.drigo

Salut,

Ne voyant rien de spcial, j'ai repris les deux classes et j'ai complt, en affichant des JButton normaux. Aucun souci de mon ct, ils sont bien tous visibles. Donc,  priori, le problme est dans la classe Case. Tu peux me montrer le code ?

----------


## SoulHokib

Merci pour la rponse rapide, voici ma classe Case :



```

```

----------


## joel.drigo

Le gros problme, c'est que tu redfinis des mthodes de Swing avec tes propres mthodes, du coup a le fait foirer jusqu' qu'il rattrape le problme (et du coup a doit foutre la zone dans ton appli,  moins que tu ne fasses tout a pour rien (je veux dire que tu ne t'en sers pas) ce qui est doublement dommage.

setX(), getX(), setY(), getY() ce sont des mthodes de Swing, dont il se sert pour positionner les composants dans un container. Comme toi tu les as rdfinis pour t'en servir pour tes propres donnes  toi, plus rien de fonctionne correctement jusqu' ce qu'un layout passe et a remet tout en ordre (mais il n'est pas exclu que a puisse refoirer).

Nulle part dans ton code tu utilises ces mthodes pour connatre les valeurs de X et Y ou les modifier. D'ailleurs,  quoi a servirait de les modifier : une case ne bouge pas dans le tableau. Donc dj supprime setX et setY. Et si tu n'a pas eu besoin d'appeler les getX() et getY(), tu peux aussi bien les enlever. D'ailleurs, tu pourrais aussi bien du coup virer X et Y, puisque tu ne t'en sers pas.

----------


## SoulHokib

Je vais essayer de les supprimer et je reviendrais vers vous pour vous tenir au courant. Merci de la rponse.

EDIT : C'tait bien a. Je vous remercie, plus qu' intgrer a dans notre bote  jeu et  rendre le travail. Merci beaucoup pour toute l'aide apporte au cours de mon projet.

----------

