// Vérifier que toutes les cases sur lesquelles se trouve le bateau sont disponibles. public bool PeutPlacer(Grille _grille, Flotte _flotte) { bool peutPlacer = true; foreach (var cell in Plage) { if (O == Orientation.Est || O == Orientation.Ouest) { if (!_grille.grille[Y, cell].PeutPlacer()) // Les lignes et les colonnes sont dans l'autre sens dans les tableaux C# (donc Y à la place du X) { peutPlacer = false; break; } } else { if (!_grille.grille[cell, X].PeutPlacer()) { peutPlacer = false; break; } } } if (peutPlacer) { if (O == Orientation.Est || O == Orientation.Ouest) { foreach (var Case in Plage) { _grille.grille[Y, Case].ChangerEtat(EtatCase.Bateau); } } else { foreach (var Case in Plage) { _grille.grille[Case, X].ChangerEtat(EtatCase.Bateau); } } EauInaccessible(_grille); } else { Console.WriteLine("Impossible de placer le bateau. Suppression ..."); } return peutPlacer; }
// Beaucoup de code plus ou moins compliqué mais surtout très répétitif public void PlacerMaFlotte() { NomsBateau NomBat; string CodeDep; int XBat, YBat; Orientation Orient; // Initialiser la flotte et la liste des bateaux pour répertorier les différentes instances. MaFlotte = new Flotte(ID); ListBateaux = new List<Bateau>(); while (MaFlotte.Total != 0) { Console.WriteLine("Vous pouvez placer {0} porte-avions, {1} cuirassé(s), {2} croiseur(s), {3} torpilleur(s), {4} sous-marin(s).", MaFlotte.QuantitePA, MaFlotte.QuantiteCuir, MaFlotte.QuantiteCrois, MaFlotte.QuantiteTorpi, MaFlotte.QuantiteSousMarin); Console.WriteLine("Choisissez un bateau à placer : PorteAvions / Cuirassé / Croiseur / Torpilleur / SousMarin"); while (!Enum.TryParse(Console.ReadLine(), out NomBat)) // Tant que ce qu'on écrit n'est pas un nom de bateau, demander à écrire un nom de bateau. { Console.WriteLine("Attention à l'orthographe ! Vérifiez que vous avez écrit le nom du bateau comme les exemples ci-dessus !"); } Console.WriteLine("Entrez la poupe (l'arrière) du bateau. (ex : A1 / C5 ...)"); CodeDep = Console.ReadLine(); while (!Program.IdCases.Contains(CodeDep)) // Tant que ce qu'on écrit n'est pas un code de case, demander à écrire un code de case. { Console.WriteLine("Veuillez entrer une valeur crédible. (Pensez à écrire le code en majuscules ! (A1 / C2...))"); CodeDep = Console.ReadLine(); } // Une fois que c'est fait, on peut retrouver les coordonnées avec le code. XBat = int.Parse(CodeDep.Substring(1)); YBat = char.ToUpper(char.Parse(CodeDep.Substring(0, 1))) - 64; Console.WriteLine("Entrez son orientation : Nord / Sud / Est / Ouest"); while (!Enum.TryParse(Console.ReadLine(), out Orient)) // Tant que ce qu'on écrit n'est pas une orientation, demander à écrire une orientation { Console.WriteLine("Attention à l'orthographe ! Vérifiez que vous avez écrit l'orientation comme les exemples ci-dessus !"); } Console.Clear(); // En fonction du nom de bateau, on va instancier une sous-classe précise. switch (NomBat) { case NomsBateau.PorteAvions: if (MaFlotte.QuantitePA != 0) { Bateau PA = new PorteAvions(XBat, YBat, Orient); // On l'instancie. ListBateaux.Add(PA); // On l'ajoute à la liste de nos bateaux. if (!PA.PeutPlacer(MaGrille, MaFlotte)) // Mais s'il s'avère qu'il est impossible de le placer... ListBateaux.Remove(PA); // On le retire de la liste. else // S'il est effectivement possible de le placer on appelle cette procédure de la flotte pour décrémenter le total de bateaux à placer MaFlotte.PlacerBateau(NomsBateau.PorteAvions); } else { Console.WriteLine("Vous ne pouvez plus placer de bateau de ce type."); } break; case NomsBateau.Cuirassé: // Idem pour tous les autres cas. if (MaFlotte.QuantiteCuir != 0) { Bateau Cuir = new Cuirrasse(XBat, YBat, Orient); ListBateaux.Add(Cuir); if (!Cuir.PeutPlacer(MaGrille, MaFlotte)) ListBateaux.Remove(Cuir); else MaFlotte.PlacerBateau(NomsBateau.Cuirassé); } else { Console.WriteLine("Vous ne pouvez plus placer de bateau de ce type."); } break; case NomsBateau.Croiseur: if (MaFlotte.QuantiteCrois != 0) { Bateau Crois = new Croiseur(XBat, YBat, Orient); ListBateaux.Add(Crois); if (!Crois.PeutPlacer(MaGrille, MaFlotte)) ListBateaux.Remove(Crois); else MaFlotte.PlacerBateau(NomsBateau.Croiseur); } else { Console.WriteLine("Vous ne pouvez plus placer de bateau de ce type."); } break; case NomsBateau.Torpilleur: // Cas particulier : le Torpi et les SM ont sont dispos DEUX fois. Il faut différencier Bateau Torpi1 = null, Torpi2; // les instanciations. if (MaFlotte.QuantiteTorpi == 0) { Console.WriteLine("Vous ne pouvez plus placer de bateau de ce type."); break; } if (!ListBateaux.Contains(Torpi1)) { Torpi1 = new Torpilleur(XBat, YBat, Orient); ListBateaux.Add(Torpi1); if (!Torpi1.PeutPlacer(MaGrille, MaFlotte)) ListBateaux.Remove(Torpi1); else MaFlotte.PlacerBateau(NomsBateau.Torpilleur); } else { Torpi2 = new Torpilleur(XBat, YBat, Orient); ListBateaux.Add(Torpi2); if (!Torpi2.PeutPlacer(MaGrille, MaFlotte)) ListBateaux.Remove(Torpi2); else MaFlotte.PlacerBateau(NomsBateau.Torpilleur); } break; case NomsBateau.SousMarin: Bateau SM1 = null, SM2; if (MaFlotte.QuantiteSousMarin == 0) { Console.WriteLine("Vous ne pouvez plus placer de bateau de ce type."); break; } if (!ListBateaux.Contains(SM1)) { SM1 = new SousMarin(XBat, YBat, Orient); ListBateaux.Add(SM1); if (!SM1.PeutPlacer(MaGrille, MaFlotte)) ListBateaux.Remove(SM1); else MaFlotte.PlacerBateau(NomsBateau.SousMarin); } else { SM2 = new SousMarin(XBat, YBat, Orient); ListBateaux.Add(SM2); if (!SM2.PeutPlacer(MaGrille, MaFlotte)) ListBateaux.Remove(SM2); else MaFlotte.PlacerBateau(NomsBateau.SousMarin); } break; } // Quand on a placé un bateau, on actualise la grille à afficher à l'écran. Console.WriteLine("Actualisation de la grille..."); MaGrille.Draw(); } // On réinitialise la flotte pour les calculs pendant la phase de tirs MaFlotte = new Flotte(ID); }