Votre avis par rapport à une méthode

ecodhrin Messages postés 22 Date d'inscription jeudi 17 février 2011 Statut Membre Dernière intervention 6 mai 2011 - 1 mai 2011 à 20:12
 Utilisateur anonyme - 6 mai 2011 à 18:41
Bonjour,

Je suis actuellement en train de coder une bataille-navale qui avance bien pour l'instant.

J'ai créé ce topic pour simplement demander votre avis par rapport à ce qui suit :

j'ai réussi à faire un placement correct des bateaux sur la grille du joueur ainsi que sur la grille de l'IA (dans des JTables).

J'arrive à faire en sorte que lorsque le joueur clic sur une cellule ou se trouve un bateau ennemi, celle ci devient orange et un "x" se met dedans. Cependant je n'arrive pas a trouver une manière simple de vérifier après chaque tir, si un bateau à été complétement coulé et dans ce cas le mettre entièrement en rouge.

J'ai pensé à mémoriser les extrémité de chaque bateau et ceci pour les bateaux du joueur et ceux de l'IA (soit 40 variables .... ce qui je pense est énorme) puis à faire une boule for qui vérifie pour chaque bateau si de la proue à la poupe, toutes les "x" ont été trouvée.

Cela représente énormément de codage et je voulais savoir si vous aviez une meilleure idée.

Merci d'avance

Ecodhrin

ps : une petite photo pour illustrer (ps : la grille de gauche est celle des bateaux de l'ia qui est normalement cachée)

Ici, les bateaux ont été tous trouvés et je voudrais donc qu'ils passent en rouge une fois que toutes les cellules les composant aient été trouvées.

11 réponses

Utilisateur anonyme
2 mai 2011 à 20:33
J'aurais bien une idée mais ça va te donner un petit peu de travail.

En fait, tu fais une classe par type de bâtiment différent (j'ai surement dû t'en parler sur ton autre sujet).
Comme attribut de cette classe, tu peux mettre la taille (donc 2, 3, 4, 5, 6).
Tu rajoutes également un attribut que tu peux nommer "dommages" ou "compteur" ou "coups_recus"... Dès que ton bateau se prend un tir, tu incrémentes de 1 ce compteur.
Tu n'as plus qu'à ensuite vérifier si cet attribut est égal à sa taille. Si oui, ton bateau est coulé.
Tu peux même rajouter un attribut "isCoule" de type boolean. Cela pourrait t'aider pour vérifier si tous les vaisseaux sont au fond.

Autre solution (sans la POO comme ci dessus), tu fais un tableau de taille 5. Chaque indice représentera un bateau (donc tab[0] ==> petit bateau, ..., tab[4] ==> gros bateau de taille 6). Dès qu'un navire se prend un tir, tu augmentes de 1 la valeur du tableau correspondante. Limite tu peux faire un deuxième tableau avec pour chaque indice la taille du bateau (donc tab2[0] = 2, tab2[4] = 6).

Voilà voilà...

-- Pylouq : jongleur de clavier AZERTY et de clavier QWERTZ --
0
ecodhrin Messages postés 22 Date d'inscription jeudi 17 février 2011 Statut Membre Dernière intervention 6 mai 2011
2 mai 2011 à 21:39
J'aime assez la solution avec le tableau mais dire au programme que telle case possédant un "x" correspond à tel bateau ?
0
ecodhrin Messages postés 22 Date d'inscription jeudi 17 février 2011 Statut Membre Dernière intervention 6 mai 2011
2 mai 2011 à 21:43
J'ai pensé à faire un tableau de taille 5 par 4 => une ligne pour chaque bateau et une colonne pour chaque coordonnée (en ligne et en colonne) de chaque bateau.

Ensuite faire des boucles pour vérifier après chaque tir si tout le bateau est coulé.

Qu'en penses-tu ?
0
shaiulud Messages postés 404 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 15 juillet 2014 22
3 mai 2011 à 09:27
Tu peux faire une Map avec comme clé une chaine "Colonne"_"Ligne " pour les valeurs ou il y a une case active

Map<String, Boolean> positionEnnemi = new HashMap<String, Boolean>();
positionEnnemi.put("D_2", Boolean.TRUE);


pour le test tu fais
positionEnnemi.contains("D_2")

La Map est rapide d'accès. Pour illustartion, une Map de 100000 éléments donne un temps de récupération d'objet de l'ordre de 0,3 ms sur un celeron 2Ghz avec un JVM 1.6
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ecodhrin Messages postés 22 Date d'inscription jeudi 17 février 2011 Statut Membre Dernière intervention 6 mai 2011
3 mai 2011 à 22:35
Oki merci pour toutes vos réponses j'ai finalement à m'en sortir :

Sachant que j'ai réussi à faire un tableau de 5 ligne (une par bateau) et 4 colonnes (début_x , début_y, fin_x, fin_y), à faire en sorte que les coords soient toujours arrangées de la plus petite à la plus grande. Et la boucle suivante :

for(int k=0 ; k<=4 ; k++) // Boucle pour chaque ligne du tableau = chaque bateau
{       // si au point (début_x,;début_y) du bateau il y a un "." => signifie bateau déjà coulé
if(IHM.grille2.getValueAt(tab[k][0], tab[k][1])!=".")

{
boolean coulé = true; // bateau coulé jusqu'à preuve du contraire
for(int i = tab[k][0] ; i<=tab[k][2] ; i++) // pour lig début à lig fin
{
for(int j = tab[k][1] ; j<=tab[k][3] ; j++)//pour col début à col fin
{
                                                        //si valeur en (lig;col)!="x" => bateau non coulé car il reste case à découvrir 
if(IHM.grille2.getValueAt(i, j)!= "x")
{
coulé = false; // bateau non coulé
}
}
}
if(coulé) // si coulé on place un "." pour chaque coord. du bateau en question
{
for(int l = tab[k][0] ; l<=tab[k][2] ; l++)
{
for(int c = tab[k][1] ; c<=tab[k][3] ; c++)
{
IHM.grille2.setValueAt(".", l, c);
}
}
}
}
}


Voilà je sais pas si c'est clair clair ^^
0
Utilisateur anonyme
3 mai 2011 à 22:47
Grosso modo avec leur tardive j'ai saisi ce que tu voulais faire. 'est une façon comme une autre de faire.
Après, c'est vrai que si tu te sens bien à l'aise avec le langage, des outils comme les Map peuvent faire l'affaire.

Tu en as finis avec ton projet au fait (simple curiosité) ?


--
Pylouq (actuellement jongleur de clavier AZERTY et de clavier QWERTZ)
0
ecodhrin Messages postés 22 Date d'inscription jeudi 17 février 2011 Statut Membre Dernière intervention 6 mai 2011
5 mai 2011 à 01:14
Et bien pas vraiment =)

En gros, on peut faire une partie : placement et tirs.

Par contre, on est quasiment sur de gagné pour le moment car l'IA est stupide dans le sens où si elle tire une case contenant un morceau de bateau elle ne va pas chercher à finir de couler le bateau, elle va continuer à tirer aléatoirement. Je n'ai pas eu le temps de finir de programmer ceci (beaucoup de conditions ...) et je dois rendre mon projet ce jeudi ^^

Donc en gros, le jeu est opérationnel dans le sens où on peut faire une partie mais il reste des choses à développer, notamment ce que j'appelle les bonus : un radar et un super-missile.

Le radar dirait en gros si pour une case choisie, celle-ci et toute celles autour (soit un carré de 3*3) contiennent ou pas un bateau mais sans indiquer la position exacte ( en gros juste dire voila dans ce carré il y a des bateaux).

Le super missile serait en gros un tir sur un carré de 3*3 dont on choisi le centre.

Il me reste aussi à faire une gestion des scores. J'arrive à donner le temps de jeu à la fin en min, sec, ms mais je n'ai pas eu le temps d'organiser un classement en écrivant les scores en fonction du temps dans un fichier texte qui serait appelé.

Voila je crois que j'ai fais le tour. De toute façon, même si je dois rendre le dossier ce jeudi, j'ai encore jusqu'au lundi 16 pour finir le jeu donc j'aurais surement encore besoin de vous ^^
0
ecodhrin Messages postés 22 Date d'inscription jeudi 17 février 2011 Statut Membre Dernière intervention 6 mai 2011
5 mai 2011 à 01:23
D'ailleurs tant que j'y suis, je peux cliquer sur ma grille tout au long de partie pour sélectionner une case.

Comment je peux faire pour faire en sorte qu'on ne puisse plus cliquer sur la grille, ou plus précisément, comment faire pour qu'un clic sur la grille n'entraîne plus aucune action ?
0
Utilisateur anonyme
5 mai 2011 à 21:57
Vu l'heure j'ai du mal à réfléchir mais un peu à la barbare tu peux utiliser un booléen. Tu exécutes le code que tu veux pour ton clic de souris si ce boolen est à vrai. SI tu veux pas que ton clic aie des effets, tu le mets à false.

Sinon, il y a peut être des méthodes comme setClickable ou des choses de ce genre avec JTable ? Je ne connais pas trop cette classe.


--
Pylouq (actuellement jongleur de clavier AZERTY et de clavier QWERTZ)
0
ecodhrin Messages postés 22 Date d'inscription jeudi 17 février 2011 Statut Membre Dernière intervention 6 mai 2011
6 mai 2011 à 15:41
La technique du booléen (aussi appelé la technique du ragondin) marche à merveille =)

Au passage, le jeu est opérationnel =D
0
Utilisateur anonyme
6 mai 2011 à 18:41
Impeccable !

Un petit coup de MP pour prévenir du résultat ferait plaisir

Bonne continuation !


--
Pylouq (actuellement jongleur de clavier AZERTY et de clavier QWERTZ)
0
Rejoignez-nous