/// <summary> /// Tire sur la case de coordonnées <paramref name="coords"/>[<paramref name="index"/>] /// et choisit "intelligement" les prochaines coordonnées /// </summary> /// <param name="grilleBateauxJoueur"></param> /// <param name="grilleMissileJoueur"></param> /// <param name="tabToucheBateauxJoueur"></param> /// <param name="rdn"></param> /// <param name="coords"></param> /// <param name="dirs"></param> /// <param name="goodDirs"></param> /// <param name="typePrecs"></param> /// <param name="tabtaillesBateaux"></param> /// <param name="index"></param> /// <param name="tirDispo"></param> public static void ObtenirProchainCoup(int[,] grilleBateauxJoueur , int[,] grilleMissileJoueur, int[] tabToucheBateauxJoueur , Random rdn, int[][] coords, int[] dirs, bool[] goodDirs, int[] typePrecs , int[] tabtaillesBateaux, int index, int tirDispo) { int result = GrilleMissile.Tirer(grilleBateauxJoueur, grilleMissileJoueur , tabToucheBateauxJoueur, coords[index], tabtaillesBateaux); if (Grille.CompterNbCaseVide(grilleMissileJoueur) > tirDispo) { //choix de la prochaine coords[index] int incx, incy; int[] coordInter; bool test; //si on ne touche rien ou que l'on touche un autre navire que le navire recherché if (result == 0 || (result != typePrecs[index] && typePrecs[index] != -1)) { //si l'on n'a pas encore trouvé de cible if (typePrecs[index] == -1) { do { //on en cherche une coordInter = Grille.ChoisirCaseVideAlea(grilleMissileJoueur, rdn); } while (Grille.ContenirCoord(coords, coordInter)); coords[index] = coordInter; } else if (tabToucheBateauxJoueur[typePrecs[index] - 1] != 0) { //on retourne dans la direction opposée RetournerArr(coords[index], ref dirs[index], grilleMissileJoueur, grilleBateauxJoueur, typePrecs[index]); //si on est pas sur le bon axe if (!goodDirs[index]) { //on choisis une direction aléatoire dirs[index] = GrilleBateaux.ChoisirRandomDirectionBateau(1, coords[index], grilleMissileJoueur, rdn); } Grille.IncrementerversDir(dirs[index], out incx, out incy); // on avance d'une case dans la direction dirs[index] coords[index] = new int[] { coords[index][0] + incx, coords[index][1] + incy }; } else { dirs[index] = -1; typePrecs[index] = -1; goodDirs[index] = false; do { //on en cherche une coordInter = Grille.ChoisirCaseVideAlea(grilleMissileJoueur, rdn); } while (Grille.ContenirCoord(coords, coordInter)); coords[index] = coordInter; } } else { //debug if (result == -1) { Console.WriteLine("erreur"); } if (typePrecs[index] == -1) { typePrecs[index] = result; } //si la cible n'est pas coulée if (tabToucheBateauxJoueur[typePrecs[index] - 1] != 0) { //si on suit une dirs[index]ection if (dirs[index] != -1 && result == typePrecs[index]) { goodDirs[index] = true; } do { //si on n est pas dans la bonne direction if (!goodDirs[index]) { dirs[index] = GrilleBateaux.ChoisirRandomDirectionBateau(1, coords[index], grilleMissileJoueur, rdn); } Grille.IncrementerversDir(dirs[index], out incx, out incy); coords[index] = new int[] { coords[index][0] + incx, coords[index][1] + incy }; if (coords[index][0] >= 0 && coords[index][0] < 10 && coords[index][1] >= 0 && coords[index][1] < 10) { //si la case a déjà été touchée et la case n'est pas déjà ciblée test = grilleMissileJoueur[coords[index][0], coords[index][1]] != 0 && !coords.Contains(coords[index]); if (test) { //on retourne dans la direction opposée RetournerArr(coords[index], ref dirs[index], grilleMissileJoueur, grilleBateauxJoueur, typePrecs[index]); } } else { test = true; } } while (test); } else { dirs[index] = -1; typePrecs[index] = -1; goodDirs[index] = false; do { //on en cherche une coordInter = Grille.ChoisirCaseVideAlea(grilleMissileJoueur, rdn); } while (Grille.ContenirCoord(coords, coordInter)); coords[index] = coordInter; } } } }
/// <summary> /// Lancement du jeu /// </summary> public static void Demarrer() { //constante int[] tabTaillesBateaux = { 2, 3, 3, 4, 5 }; // définition grilles int[,] grilleJoueurBateaux = new int[10, 10]; int[,] grilleOrdiBateaux = new int[10, 10]; int[,] grilleJoueurMissiles = new int[10, 10]; int[,] grilleOrdiMissiles = new int[10, 10]; //définition tableau int[] tabToucheBateauxJoueur = tabTaillesBateaux.ToArray(); int[] tabToucheBateauxOrdi = tabTaillesBateaux.ToArray(); //random instance Random rdn = new Random(); //variable difficulté int diff = 0; //paramètres de l'application bool saveEachTurn = false; string nameSave = "quicksave"; string path = Fichier.ObtenirPathSave(); //chargement des paramètres à partir du fichier parametre path = Path.GetDirectoryName(path); Fichier.LireSaveParametre(path + "\\" + "parametre.txt", ref saveEachTurn); //init variable ordi int[][] preCoord = new int[5][] { new int[2], new int[2], new int[2], new int[2], new int[2] }; int[] preDir = new int[] { -1, -1, -1, -1, -1 }; bool[] goodDir = new bool[] { false, false, false, false, false }; int[] typePrec = new int[] { -1, -1, -1, -1, -1 }; //placement bateau aléatoire sur la grille de l'ordinateur InitialiserPreCoord(preCoord, grilleJoueurMissiles, rdn); //boucle principale int tour = 0; bool joueur; int tirsDispos; int[] coord; //menu principal DemarrerMenuPrincipal(ref grilleJoueurBateaux, grilleJoueurMissiles, ref grilleOrdiBateaux, grilleOrdiMissiles, tabTaillesBateaux, rdn, tabToucheBateauxJoueur, tabToucheBateauxOrdi , ref diff, ref saveEachTurn, ref preDir, ref typePrec, preCoord, goodDir, ref tour); do { //tour de qui? joueur = (tour % 2 == 0); //tour du joueur if (joueur) { //sauvegarde auto if (saveEachTurn) { Fichier.EcrireSavePartie(Fichier.ObtenirPathSave() + "\\" + nameSave, new int[][, ] { grilleJoueurBateaux, grilleOrdiBateaux, grilleJoueurMissiles, grilleOrdiMissiles }, new int[][] { tabToucheBateauxJoueur, tabToucheBateauxOrdi, preDir, typePrec }, preCoord, goodDir, diff, tour); } //affichage grilles InterfaceJoueur.AfficherGrilles(grilleJoueurBateaux, grilleJoueurMissiles, grilleOrdiBateaux, grilleOrdiMissiles, 0, tabToucheBateauxJoueur, tabToucheBateauxOrdi, tour / 2); //nombre de tirs disponible tirsDispos = 5 - GrilleBateaux.CompterNombreBateauxCoule(tabToucheBateauxJoueur); //init coord des tirs int[,] coordTirs = new int[tirsDispos, 2]; for (int i = 0; i < coordTirs.GetLength(0); i++) { coordTirs[i, 0] = -1; coordTirs[i, 1] = -1; } //demander les coordonnées des tirs Action menu = () => DemarrerMenuContinue(grilleJoueurBateaux, grilleJoueurMissiles, grilleOrdiBateaux, grilleOrdiMissiles, tabTaillesBateaux, rdn, tabToucheBateauxJoueur, tabToucheBateauxOrdi, diff, preDir, typePrec, preCoord, goodDir, tour); InterfaceJoueur.DemanderTirs(tirsDispos, 26, coordTirs , menu); //salve de tir for (int i = 0; i < tirsDispos && tirsDispos < Grille.CompterNbCaseVide(grilleOrdiMissiles); i++) { coord = new int[2]; coord[0] = coordTirs[i, 0]; coord[1] = coordTirs[i, 1]; int result = GrilleMissile.Tirer(grilleOrdiBateaux, grilleOrdiMissiles, tabToucheBateauxOrdi, coord, tabTaillesBateaux); } } //tour de l'ordi else { //nombres de tirs dispo tirsDispos = tabToucheBateauxOrdi.Length - GrilleBateaux.CompterNombreBateauxCoule(tabToucheBateauxOrdi); //salve for (int i = 0; i < tirsDispos && i < Grille.CompterNbCaseVide(grilleOrdiMissiles); i++) { //Facile if (diff == 0) { Ordi_Facile.ObtenirProchainCoup(grilleJoueurBateaux, grilleJoueurMissiles, tabToucheBateauxJoueur , rdn, preCoord, preDir, goodDir, typePrec, tabTaillesBateaux, i, tirsDispos); } //Difficile else if (diff == 1) { Ordi_Difficile.ObtenirProchainCoup(grilleJoueurBateaux, grilleJoueurMissiles, tabToucheBateauxJoueur , rdn, preCoord, preDir, goodDir, typePrec, tabTaillesBateaux, i, tirsDispos); } } } tour++; } while (Grille.VerifierVictoire(tabToucheBateauxJoueur, tabToucheBateauxOrdi) == 0); //Ecran de victoire InterfaceJoueur.AfficherVictoire(Grille.VerifierVictoire(tabToucheBateauxJoueur, tabToucheBateauxOrdi), grilleJoueurBateaux, grilleJoueurMissiles, grilleOrdiBateaux, grilleOrdiMissiles, tabToucheBateauxJoueur, tabToucheBateauxOrdi, tour / 2); }
/// <summary> /// Affiche la grille du joueur ou de l'ordi /// </summary> /// <param name="grilleBateau">grille contenant les bateaux</param> /// <param name="grilleMissile"> grille contenant les missiles</param> /// <param name="isJoueur">booléen vrai si on affiche la grille du joueur, faux si ordi</param> /// <param name="aGagné">-1 si le joueur associé à la grille a perdu, 1 s'il a gagné, 0 si personne n'a encore gagné</param> /// <param name="tabBateauxTouches">tableau contenant les restes des bateaux du propriétaire de la grille</param> public static void AfficherGrille(int[,] grilleBateau, int[,] grilleMissile, bool isJoueur, int aGagné, int[] tabBateauxTouches, int tour) { Console.ForegroundColor = ConsoleColor.White; if (aGagné == -1) { Console.ForegroundColor = ConsoleColor.DarkRed; } if (aGagné == 1) { Console.ForegroundColor = ConsoleColor.Green; } if (!isJoueur) { Console.WriteLine("-----------------------------------------Grille Ordi------------------------------------------------"); } else { Console.WriteLine("-----------------------------------------Grille Joueur----------------------------------------------"); } int[] tabBateaux = { 2, 3, 3, 4, 5 }; string Bateaux = "\u2560\u2550\u2550\u2550\u2563"; int tailleY = grilleBateau.GetLength(0), tailleX = grilleBateau.GetLength(1); char x = ' '; Console.WriteLine(""); for (int i = 0; i < 2 * tailleY + 1; i++) { //Affichage HUD Gauche (Bonne chance pour comprendre même moi j'y arrive plus) if (i == 0) { Console.Write(" {0} bateaux restants ", 5 - GrilleBateaux.CompterNombreBateauxCoule(tabBateauxTouches));//Affichage bateaux restants } else if (isJoueur) { //Affichage statut des bateaux Joueur bool afficheHUDBateau = false; for (int j = 0; j < 5; j++) { if (i == 4 * j + 3) { Console.Write(" "); for (int k = 0; k < 5; k++) { if (k < tabBateaux[j]) { Console.ForegroundColor = ConsoleColor.White; if (tabBateauxTouches[j] - k <= 0) { Console.ForegroundColor = ConsoleColor.Yellow; } if (tabBateauxTouches[j] == 0) { Console.ForegroundColor = ConsoleColor.DarkRed; } if (k == tabBateaux[j] - 1) { Console.Write(Bateaux[4]); } else { Console.Write(Bateaux[k]); } } else { Console.Write(" "); } } Console.Write(" "); afficheHUDBateau = true; } } if (!afficheHUDBateau) { Console.Write(" "); } } else { //Affichage statut des bateaux Ordi bool afficheHUDBateau = false; for (int j = 0; j < 5; j++) { if (i == 4 * j + 3) { Console.Write(" "); for (int k = 0; k < 5; k++) { if (k < tabBateaux[j] && tabBateauxTouches[j] == 0) { Console.ForegroundColor = ConsoleColor.DarkRed; if (k == tabBateaux[j] - 1) { Console.Write(Bateaux[4]); } else { Console.Write(Bateaux[k]); } } else { Console.Write(" "); } } Console.Write(" "); afficheHUDBateau = true; } } if (!afficheHUDBateau) { Console.Write(" "); } } //Affichage de l'intérieur de la grille for (int j = 0; j < 4 * tailleX + 1; j++) { Console.ForegroundColor = ConsoleColor.White; if (aGagné == -1) { Console.ForegroundColor = ConsoleColor.DarkRed; } if (aGagné == 1) { Console.ForegroundColor = ConsoleColor.Green; } if (i % 2 == 0) { if (j % 4 == 0) { x = '\u253C';//Affichage de la grille } else { x = '\u2500';//Affichage de la grille } } else { if (j % 4 == 0) { x = '\u2502';//Affichage de la grille } else { if (j % 2 == 0) { x = AfficherCaractere((i - 1) / 2, (j - 1) / 4, isJoueur, grilleBateau, grilleMissile); //Affiche l'intérieur des cases } else { x = ' '; } } } Console.Write(x); Console.ForegroundColor = ConsoleColor.White; } //Affichage des lignes if (i % 2 == 1) { Console.Write("ABCDEFGHIJKLMNOPQRSTUVWXYZ"[(i - 1) / 2]); } //Affichage légende côté ordi Console.ForegroundColor = ConsoleColor.White; if (i == 0 && !isJoueur) { Console.Write(" TOUR : {0}", tour + 1); } if (i == 7 && !isJoueur) { Console.ForegroundColor = ConsoleColor.Yellow; Console.Write(" O"); Console.ForegroundColor = ConsoleColor.White; Console.Write(" : Bateau touché"); } if (i == 12 && !isJoueur) { Console.ForegroundColor = ConsoleColor.DarkRed; Console.Write(" \u2560 \u2550 \u2550 \u2563"); Console.ForegroundColor = ConsoleColor.White; Console.Write(" : Bateau coulé"); } if (i == 17 && !isJoueur) { Console.Write(" \u00b7 : Case vide"); } //Affichage légende côté joueur if (i == 11 && isJoueur) { Console.Write(" \u2190 \u2191 \u2192 \u2193"); Console.Write(" : Bouger curseur"); } if (i == 1 && isJoueur) { Console.Write(" \u2566"); } if (i == 3 && isJoueur) { Console.Write(" \u2551"); } if (i == 5 && isJoueur) { Console.ForegroundColor = ConsoleColor.Yellow; Console.Write(" \u2551"); Console.ForegroundColor = ConsoleColor.White; Console.Write(" : Bateau touché"); } if (i == 7 && isJoueur) { Console.Write(" \u2569"); } if (i == 15 && isJoueur) { Console.Write(" Enter : Selection"); } if (i == 19 && isJoueur) { Console.Write(" Echap : Menu"); } Console.Write('\n'); } //Affichage des colonnes string str = " "; for (int i = 0; i < tailleX; i++) { str += " " + Convert.ToString(i + 1) + " "; } Console.WriteLine(str); }
/// <summary> /// Lancement du menu principal /// </summary> /// <param name="grilleJoueurBateaux"></param> /// <param name="grilleJoueurMissiles"></param> /// <param name="grilleOrdiBateaux"></param> /// <param name="grilleOrdiMissiles"></param> /// <param name="tabTaillesBateaux"></param> /// <param name="rdn"></param> /// <param name="tabToucheBateauxJoueur"></param> /// <param name="tabToucheBateauxOrdi"></param> /// <param name="diff"></param> /// <param name="saveEachTurn"></param> /// <param name="preDir"></param> /// <param name="typePrec"></param> /// <param name="preCoord"></param> /// <param name="goodDir"></param> /// <param name="tour"></param> public static void DemarrerMenuPrincipal(ref int[,] grilleJoueurBateaux, int[,] grilleJoueurMissiles , ref int[,] grilleOrdiBateaux, int[,] grilleOrdiMissiles, int[] tabTaillesBateaux , Random rdn, int[] tabToucheBateauxJoueur, int[] tabToucheBateauxOrdi, ref int diff, ref bool saveEachTurn, ref int[] preDir, ref int[] typePrec, int[][] preCoord, bool[] goodDir, ref int tour) { //menu principal string[] labels; //menu selection fichier string[] nameFiles; int selectFile; string pathSave = Fichier.ObtenirPathSave(); //menu oui non string[] labelsOuiNon = { "Oui", "Non" }; int selectOuiNon; //menu option string[] labelsOption; int selectOption; //menu difficulté string[] labelsDiff; //si on a des fichiers de sauvegarde existant if (Fichier.EtreDirectoryVide(pathSave)) { labels = new string[] { "Nouvelle Partie", "Option", "Quitter" }; } else { //ajout du labels charger partie labels = new string[] { "Nouvelle Partie", "Charger Partie", "Option", "Quitter" }; } int selection = InterfaceJoueur.CreerMenu(labels, "--------- Menu Principal ------------", true); //Nouvelle Partie if (selection == 0) { //menu diff labelsDiff = new string[] { "Facile", "Difficile" }; diff = InterfaceJoueur.CreerMenu(labelsDiff, "--------- Choix Difficulté ------------"); //init grille bateaux GrilleBateaux.InitialiserGrilleBateaux(grilleOrdiBateaux, tabTaillesBateaux, rdn); do { grilleJoueurBateaux = new int[10, 10]; GrilleBateaux.InitialiserGrilleBateaux(grilleJoueurBateaux, tabTaillesBateaux, rdn); InterfaceJoueur.AfficherGrilles(grilleJoueurBateaux, grilleJoueurMissiles, grilleOrdiBateaux, grilleOrdiMissiles, 0, tabToucheBateauxJoueur, tabToucheBateauxOrdi, 0); selectOuiNon = InterfaceJoueur.CreerMenu(labelsOuiNon, "Voulez-vous charger une nouvelle grille?"); }while (selectOuiNon == 0); return; } //Charger Partie else if (selection == 1 && !Fichier.EtreDirectoryVide(pathSave)) { //obtenir les fichiers dans le directory //Save nameFiles = Fichier.ObtenirNomFichierdansSaveDirectory(pathSave); //menu selection fichier selectFile = InterfaceJoueur.CreerMenu(nameFiles, "--------- Menu Chargement ------------", true); //chargement de la sauvegarde Fichier.LireSavePartie(Fichier.ObtenirPathAvecNom(pathSave, nameFiles[selectFile]), new int[][, ] { grilleJoueurBateaux, grilleOrdiBateaux, grilleJoueurMissiles, grilleOrdiMissiles }, new int[][] { tabToucheBateauxJoueur, tabToucheBateauxOrdi, preDir, typePrec }, preCoord , goodDir, ref diff, ref tour); } //Option else if (selection == 1 && Fichier.EtreDirectoryVide(pathSave) || selection == 2 && !Fichier.EtreDirectoryVide(pathSave)) { while (true) { //menu option labelsOption = new string[] { String.Format("Sauvegarde à chaque tour : {0}", saveEachTurn ? "Oui" : "Non"), "Retour" }; selectOption = InterfaceJoueur.CreerMenu(labelsOption, "--------- Options ------------"); //sauvegarde auto if (selectOption == 0) { selectOuiNon = InterfaceJoueur.CreerMenu(labelsOuiNon, "Voulez vous que le jeu sauvegarde automatiquement votre grille ?"); if (selectOuiNon == 0) { saveEachTurn = true; } else { saveEachTurn = false; } //sauvegarde paramètre string path = Fichier.ObtenirPathSave(); path = Path.GetDirectoryName(path); Fichier.EcrireSaveParametre(path + "\\" + "parametre.txt", saveEachTurn); } //retour else { break; } } //retour au menu principal DemarrerMenuPrincipal(ref grilleJoueurBateaux, grilleJoueurMissiles, ref grilleOrdiBateaux, grilleOrdiMissiles, tabTaillesBateaux, rdn, tabToucheBateauxJoueur, tabToucheBateauxOrdi, ref diff , ref saveEachTurn, ref preDir, ref typePrec, preCoord, goodDir, ref tour); } //Quitter else { Environment.Exit(0); } }