public void placerNavire(Pos[] positions) { //pour chaque trou.. for (int i = 0; i < positions.Length; ++i) { //on donne sa position definirPosition(i, positions[i]); } }
//Trouver où cette position est (son indice) dans le tableau de positions du navire. int trouverIndicePosition(Navire nav, Pos p) { int indice = 0; while ((nav._pos[indice]._x != p._x || nav._pos[indice]._y != p._y) && indice < nav._pos.Length) { ++indice; } if (indice >= nav._pos.Length) { //position non trouvée return -1; } return indice; }
void toucherBateau(Navire nav, Pos p) { int indice = trouverIndicePosition(nav, p); nav._pos[indice]._estTouche = true; }
//recuperer nom du bateau dans la grille String nombateauToucheEst(Pos p) { return _flotteAttaquee._grille[p._x, p._y].ToString(); }
//change le string a toutes les positions du bateau pour ajouter "coule" //pour le joueur attaqué. bool CaseTireeEstOccupee(Pos p) { return !(_flotteAttaquee._grille[p._x, p._y] == ""); }
//Analyse le tir et retourne un message selon le protocol établi avec le client String analyserTir(Pos tir) { String resultat = ""; //vérifie si l'espace est occupée if (CaseTireeEstOccupee(tir)) { //Trouver le navire attaqué dans la flotte attaquée Navire navireAttaque = trouverNavireAttaque(nombateauToucheEst(tir)); //marquer le navire touché toucherBateau(navireAttaque, tir); //Vérifie si navire est coulé if (bateauEstCoule(navireAttaque)) { //marquer le navire coulé navireAttaque._estCoule = true; //Vérifie si tous les bateaux coulés _partieEstFinie = PartieEstTerminee(_flotteAttaquee); resultat = "Coule=" + navireAttaque.ToPos(); if (_partieEstFinie) { resultat = "" + tir._x + tir._y; //position qui a fait ganger } } else { //touché, non coulé resultat = "Touche=" + tir._x + tir._y; } } else { resultat = "Manque=" + tir._x + tir._y; } return resultat; }
//Méthodes utilisées: //Recoit les valeurs numériques sous forme de String et les mets sous forme de notre objet Pos //Ne pourrais être utilisé pour des positions de plus de 10 ( de 0 à 9) Pos stringToPos(String tir) { Pos p = new Pos(); p._x = int.Parse(tir[0].ToString()); p._y = int.Parse(tir[1].ToString()); return p; }
private Pos[] posBateauCourant(DataGridView dgv) { Pos[] tabPos = new Pos[dgv.SelectedCells.Count]; int compteurCell = 0; foreach (DataGridViewCell cell in dgv.SelectedCells) { tabPos[compteurCell] = new Pos(); tabPos[compteurCell]._x = cell.ColumnIndex; tabPos[compteurCell]._y = cell.RowIndex; ++compteurCell; } return tabPos; }
/// <summary> /// Cette fonction transforme un String(formatter en Pos) en Pos et retourne le résultat /// </summary> /// <param name="aConvertir">Le String à convertir</param> /// <returns>La position qui à été transformée</returns> private Pos convertStringToPos(String aConvertir) { Pos pos = new Pos(); if (aConvertir.Length > 1) { pos._x = int.Parse(aConvertir.Substring(0, 1)); pos._y = int.Parse(aConvertir.Substring(1, 1)); } return pos; }
/// <summary> /// Cette fonction valide si les positions passées en paramètre est unique /// </summary> /// <param name="tabPos">Tableau de positions à valider</param> /// <returns>Si les positions sont unique ou non</returns> private bool validerPositionUnique(Pos[] tabPos) { bool estUnique = true; // Vérifie si les points sélectionnés correspondent au point d'un bateau déjà placé foreach (Navire navire in maFlotte._flotte) { foreach (Pos p in tabPos) { for (int i = 0; i < navire._pos.Length; ++i) { if (navire._pos[i]._x == p._x && navire._pos[i]._y == p._y) { estUnique = false; } } } } return estUnique; }
/// <summary> /// Cette fonction valide la consécutivité des cases sélectionnées /// </summary> /// <param name="tabPos">Tableau de positions à valider</param> /// <returns>Si les positions sont consécutives ou non</returns> private bool validerConsecutivite(Pos[] tabPos) { bool estConsecutif = false; if (tabPos != null) { int DifferenceX = Math.Abs(tabPos[0]._x - tabPos[tabPos.Length - 1]._x); int DifferenceY = Math.Abs(tabPos[0]._y - tabPos[tabPos.Length - 1]._y); // Avec les possibilités de sélection réduit à une seule ligne droite (pas de diagonale), // si la sélection est valide (consécutive), la taille de la selection doit être égal à la différence entre la première // et la dernière case if (DifferenceX + DifferenceY == tabPos.Length - 1) { estConsecutif = true; } } return estConsecutif; }
//Place les positions des trous d'un navire spécifique. //Intrants: no du navire: de 0 à 4 // un tableau avec la position de chaque trous. public void placerNavire(int noNav, Pos[] positions) { this._flotte[noNav].placerNavire(positions); }
private void definirPosition(int noCase, Pos position) { this._pos[noCase] = position; }