Algorithme Bataille Navale

Résolu/Fermé
Vitaldix Messages postés 116 Date d'inscription vendredi 9 novembre 2012 Statut Membre Dernière intervention 18 août 2013 - 28 avril 2013 à 20:42
jeremux Messages postés 58 Date d'inscription samedi 23 octobre 2010 Statut Membre Dernière intervention 30 mai 2013 - 30 avril 2013 à 08:20
Bonsoir,
je dois programmer une bataille navale en java, mais j'ai quelques interrogations quant à l'algorithme.
Le "plateau" est représenté par un tableau de 10 lignes sur 10 colonnes (+ 1 ligne et +1 colonne pour les coordonnées). Il s'agit ici de placer les bateaux (qui exceptionnellement n'ont pas uniquement la forme de "ligne", mais parfois de carré etc). On renseigne une ligne et une colonne "centrale" de la forme, et le vaisseau occupera ces coordonnées.

Le but de cet algorithme est de faire en sorte d'empêcher l'utilisateur que les coordonnées de deux vaisseaux se confondent.

Par exemple, pour un vaisseau en forme de croix, on renseigne la case du milieu :
ligne ?
colonne ?
*vérifier que ça ne sort pas du tableau*

Jusque là c'est bon
Puis les valeurs du tableau à tabl[ligne][colonne]; tabl[ligne+1][colonne]; tabl[ligne-1][colonne]; tabl[ligne][colonne+1]; tabl[ligne][colonne-1] (ça fait une forme de croix) sont remplacées par "C"

Ça c'est facile, mais le problème est là : vu qu'il y a plusieurs formes de vaisseaux différents, je dois faire une vérification pour chaque case et pour chaque lettre, du style
Pour un vaisseau en ligne "XXX", j'aurai une ligne de condition pour répéter de reposer la ligne si les coordonnées se confondent de ce style là :
( tabl[ligne][colonne] != C || tabl[ligne][colonne] != D tabl[ligne][colonne] != E || tabl[ligne][colonne+1] != C ||  tabl[ligne][colonne+1] != D tabl[ligne][colonne+1] != tabl[ligne][colonne+1] != E || tabl[ligne][colonne-1] != C ||tabl[ligne][colonne-1] != D || tabl[ligne][colonne-1] != E)

et là encore j'ai que 3 coordonnées, et 3 lettres (donc 3 vaisseaux), je précise que je monte en général à 5 vaisseaux et jusqu'à 5 coordonnées (par exemple la croix)

Je précise également que je suis "obligé" d'attribuer une lettre différente pour chaque vaisseau, pour que le programme reconnaisse sur quel vaisseau on a tiré (si c'est C, -> croix, si c'est D -> carré par exemple etc...)

Donc je me demandais si il n'y avait pas moins long comme condition, parce que vu que ça va jusqu'à 5*5 conditions à vérifier, ça fait un peu long pour le programme non ? L'algorithme est-il à revoir, ou je n'ai pas d'autre solution ?

Merci !

2 réponses

jeremux Messages postés 58 Date d'inscription samedi 23 octobre 2010 Statut Membre Dernière intervention 30 mai 2013 4
Modifié par jeremux le 29/04/2013 à 14:21
Salut,

Je n'ai pas bien compris...en gros faut que tab[ligne][colonne] soit vide c'est ça ? Dans ce cas avant de remplir avec les vaisseaux initialise avec des valeurs qui representeront "pas de vaisseaux".
En gros ça devient si ( tab[ligne][colonne]=='Z') alors...si Z ne représente pas de vaisseaux.
Sinon pour chaque vaisseaux t'implémente une méthode par exemple pour la croix,

public int testVide(int c,int l) 
{ 
    return tab[l][c]=='Z' && tab[l+1][c]=='Z'.... 
} 




Un string dans l'array.
0
Vitaldix Messages postés 116 Date d'inscription vendredi 9 novembre 2012 Statut Membre Dernière intervention 18 août 2013 6
29 avril 2013 à 18:01
"en gros faut que tab[ligne][colonne] soit vide c'est ça ? " pas seulement tab[ligne][colonne] (qui correspond à la coordonnée "centrale" du vaisseau) mais également les coordonnées adjacentes donc tab[ligne+1][colonne] etc...

par exemple dans mon code j'ai ceci :
public static void carre(String [][] tabl, int colonne, int ligne)
	{
		try
		{
			if (colonne<2 || ligne <1 || ligne>9|| colonne>10 || tabl[ligne][colonne] == "C" || tabl[ligne+1][colonne] == "C" || tabl[ligne+1][colonne-1] == "C" || tabl[ligne][colonne-1] == "C")
			{
				do
				{
					System.out.println("Veuillez ressaisir les coordoonnées");
					System.out.println("Ligne ?");
					Scanner M = new Scanner(System.in);
					ligne = M.nextInt();
   
					System.out.println("Colonne?");
					Scanner D = new Scanner(System.in);
					colonne = D.nextInt();
				} while (colonne<2 || ligne <1 || ligne>9 || colonne>10 || tabl[ligne][colonne] =="C");
			}

			System.out.println(tabl[ligne][colonne]+" " + tabl[ligne+1][colonne]+ " " + tabl[ligne+1][colonne-1]+ " " + tabl[ligne][colonne-1]);
			tabl[ligne][colonne] = tabl[ligne+1][colonne] = tabl[ligne+1][colonne-1] = tabl[ligne][colonne-1] = "CA";
		}
		catch (ArrayIndexOutOfBoundsException e)
		{
			System.out.println("Erreur, sortie du tableau");
		}
	}


C'est pour placer un carré, et ça vérifie pour l'instant seulement si une des coordonnée occupée n'est pas égale à "C" (une croix)



"si ( tab[ligne][colonne]=='Z') alors...si Z ne représente pas de vaisseaux. "
Je ne suis pas sûr de bien comprendre ! En gros, quand on pose le vaisseau, cela vérifie si toutes les coordonnées du vaisseaux sont identiques à Z (et si c'est le cas, on pose le vaisseau?). Je veux bien, mais j'aimerai en fait que le programme reconnaisse ces coordonnées comme un vaisseau, donc je leur ai attribué une lettre à chacun d'où la vérification de chacune des lettres lors de la pose de vaisseau (sauf pour le premier). Cela me sert pour compter les "vies" du vaisseaux, vu que je me suis débrouillé pour que la console tire au hasard mais pas deux fois sur la même case, on a :

int colhas = 0;
			int lighas = 0;
			do 
				{
				colhas = 1 + (int) (Math.random() * 10);
				lighas = 1 + (int) (Math.random() * 10);
				} while (tabl[colhas][lighas]=="O");
			
			System.out.println(tabl[colhas][lighas]);
			if (tabl[colhas][lighas]=="C")
				{compteurcroix = compteurcroix-1; System.out.println("Aoutch croix");}
                        tabl[colhas][lighas] = "O";
pour la croix

En tous cas, merci !
0
jeremux Messages postés 58 Date d'inscription samedi 23 octobre 2010 Statut Membre Dernière intervention 30 mai 2013 4
30 avril 2013 à 08:20
Une méthode pour chaque vaisseaux, pour tester si c'est occupé?
//return 1 si il y a un vaisseau croix
public int testCroix(String [][] t, int c, int l)
{
    if (t[l][c]=="c" && t[l+1][c]=="c" && t[l][c+1]=="c"&&  t[l][c-1]=="c" && t[l-1][c]=="c")
        return 1;
    else 
        return 0;
}


Ensuite pour placer tu vérifies si la ligne et la colonne et que testCroix(...)==0 et testCarre(...)==0 ..., mais après ça va dépendre du nombre de vaisseaux que t'as.
0