#!/usr/bin/python
# -*- coding: utf8 -*-
class Grille :
# Structure de données choisie
# taille: int           taille de la grille
# positions[][]         tableau des positions de la grille

	def __init__(self, tailleGrille):
	#Initialise une grille, avec comme paramètre la taille de celle-ci.
	#Renvoie erreur si grille n'a pas été initialisée
		try:
			self.taille = tailleGrille
			self.positions = [[-1 for j in range(0, tailleGrille)] for i in range(0, tailleGrille)]
		except:
			print("Erreur dans la création de la grille.")

	def placerPositionBateau(self, numBat, xBat, yBat):
	#Données: Grille, numéro du bateau à placer, et coordonnées indiquant où on veut le placer
	#Pré-conditions: numBat:int, xBat:int, yBat:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Ajoute le bateau de numéro numBat à la position (xBat,yBat) sur la grille du joueur et renvoie la grille. Renvoie erreur si la position n'est pas ajoutée !
	#Post-conditions:
		try:
			self.positions[xBat][yBat] = numBat
		except IndexError:
			print("Erreur placement bateau : coordonnées hors grille.")

	def getBateau(self, xBat, yBat):
	#Données: Grille et coordonnées étudiées
	#Pré-conditions: xBat:int, yBat:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Renvoie le numéro du bateau correspondant aux coordonnées xBat, yBat, ou renvoie -1 s'il n'y pas de bateau
	#Post-conditions: numBat:int
		try:
			numBat = self.positions[xBat][yBat]
		except IndexError:
			numBat = -1
		return numBat

	def supprimerPosition(self, xBat, yBat):
	#Données: Grille et cordonnées (xBat,yBat)
	#Pré-conditions: xBat:int, yBat:int , on suppose vérfifiée le fait que la postion contient un bateau et avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Supprime la position indiquée par les coordonnées (xBat,yBat) et renvoie la grille modifiée
	#Post-conditions:
		self.positions[xBat][yBat] = -1

	def envue(self, xTir, yTir):
	#Données: Grille et coordonnées(xTir,yTir)
	#Pré-conditions: xTir:int, yTir:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat:Renvoie True si il y a un bateau sur la coordonnée xTir ou sur la coordonnée yTir, renvoie False sinon
	#Post-conditions: bool
		res = False
		for i in range (0,self.taille):
				if(self.positions[xTir][i] != -1):
						res = True
		for i in range (0, self.taille):
				if(self.positions[i][yTir] != -1):
						res = True
		return res

	def estDansGrille(self, x, y):
	#Données: Grille et coordonnées (x,y)
	#Pré-conditions: x:int, y:int
	#Resultat: Renvoie True si la position indiquée par (x,y) se trouve dans la grille, renvoie False sinon
	#Post-conditions: bool
		res = False
		if(x < self.taille and y < self.taille and x >= 0 and y >= 0):
				res = True
		return res

	def estBateau (self, x, y):
	#Données: Grille et coordonnées (x,y)
	#Pré-conditions: x:int, y:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Renvoie True s'il y a un bateau aux coordonnées (x,y) indiquées, renvoie False sinon
	#Post-conditions: bool
		res = False
		if(self.estDansGrille(x,y)):
				if(self.positions[x][y] != -1):
						res = True
		return res

	def verificationCoordonnees(self, x, y):
	#Données: Grille et coordonnées (x,y)
	#Pré-conditions: x:int, y:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Renvoie True si la position indiquée indiquée par (x,y) est dans la grille et non-occupée par un bateau, renvoie False sinon
	#Post-conditions: bool
		return not(self.estBateau(x,y)) and self.estDansGrille(x,y)

	def estValide(self, numBat, x, y):
	#Données: Grille, numéro du bateau, et coordonnées (x,y)
	#Pré-conditions: numBat:int, x:int, y:int
	#Resultat: Renvoie True si verificationCoordonnees est true et si la position indiquée par (x,y) est juxtaposée à un bateau de même numéro et que toutes les autres position de ce bateau sont sur la même ligne ou la même colonne, renvoie False sinon
	#Post-conditions: bool
		res = False
		if(self.verificationCoordonnees(x,y)):
				# getBateau() gère déjà les erreurs d'index

				#On fait un test pour savoir si il existe déjà une position de ce bateau déjà placé sur la grille
				dejaPlace = False
				i = 0
				j = 0
				while(not(dejaPlace) and i < self.taille):
						j=0
						while(not(dejaPlace) and j < self.taille):

							if (self.positions[i][j] == numBat):
								dejaPlace = True
							j+=1
						#Sortie: On sort si le bateau a été trouvé ou si on est sorti du tableau
						i+=1
				#Sortie: On sort si le bateau a été trouvé ou si on est sorti du tableau

				#Si ce n'est pas la première position placée
				if dejaPlace:
					#Si une case à côté de (x,y) contient le numéro du bateau que l'on veut placer, alors on vérifie que le bateau est bien horizontal ou vertical et ne forme pas un angle droit
					if(self.getBateau(x+1,y) == numBat):
							if(self.getBateau(x+2,y) == numBat):
									res = True
							elif(self.getBateau(x+1,y+1) != numBat and self.getBateau(x+1,y-1) != numBat):
									res = True

					if(self.getBateau(x-1,y) == numBat):
							if(self.getBateau(x-2,y) == numBat):
									res = True
							elif(self.getBateau(x-1,y+1) != numBat and self.getBateau(x-1,y-1) != numBat):
									res = True

					if(self.getBateau(x,y+1) == numBat):
							if(self.getBateau(x,y+2) == numBat):
									res = True
							elif(self.getBateau(x+1,y+1) != numBat and self.getBateau(x-1,y+1) != numBat):
									res = True

					if(self.getBateau(x,y-1) == numBat):
							if(self.getBateau(x,y-2) == numBat):
									res = True
							elif(self.getBateau(x+1,y-1) != numBat and self.getBateau(x+1,y-1) != numBat):
									res = True
		return res

	def noSpace(self,taille,numBat,x,y):
	#Données: Grille,taille du bateau, et coordonnées (x,y)
	#Pré-conditions: numBat:int, x:int, y:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Renvoie True si après vérification, il y a suffisament de place pour inserer le bateau à l'horizontale ou à la verticale
	#après analyse de la direction du bateau si il y a déjà des cases ajoutées pour le numBat donné en paramètre
	#Post-conditions: bool
		res = False
		placeVertical = False
		placeHorizontal = False

		if(self.verificationCoordonnees(x,y)):

			# Vérification horizontale
			cHorizontalPos = 0
			cHorizontalNeg = 0
			while(self.verificationCoordonnees(x+1+cHorizontalPos,y) or self.getBateau(x+1+cHorizontalPos,y) == numBat):
				cHorizontalPos += 1
			# Sortie : on rencontre une case soit prise par un bateau soit hors grille (sens positif horizontal)
			while(self.verificationCoordonnees(x-1-cHorizontalNeg,y) or self.getBateau(x-1-cHorizontalNeg,y) == numBat):
				cHorizontalNeg += 1
			# Sortie : on rencontre une case soit prise par un bateau soit hors grille (sens négatif horizontal)
			placeHorizontal = ((cHorizontalNeg + cHorizontalPos + 1) >= taille)

			# Vérification verticale
			cVerticalPos = 0
			cVerticalNeg = 0
			while(self.verificationCoordonnees(x,y+cVerticalPos+1) or self.getBateau(x,y+cVerticalPos+1) == numBat):
				cVerticalPos += 1
			# Sortie : on rencontre une case soit prise par un bateau soit hors grille (sens positif vertical)
			while(self.verificationCoordonnees(x,y-cVerticalNeg-1) or self.getBateau(x,y-cVerticalNeg-1) == numBat):
				cVerticalNeg += 1
			# Sortie : on rencontre une case soit prise par un bateau soit hors grille (sens négatif vertical)
			placeVertical = ((cVerticalNeg + cVerticalPos + 1) >= taille)

			# 1ère position à placer
			if(not self.estValide(numBat,x,y)):
				res = placeVertical or placeHorizontal

			# 2ème ou + position à placer
			else:
				# on cherche la case juxtaposée
				if(self.getBateau(x+1,y) == numBat or self.getBateau(x-1,y) == numBat):
					# case à droite ou à gauche (x)
					res = placeHorizontal

				if(self.getBateau(x,y-1) == numBat or self.getBateau(x,y+1) == numBat):
					# case en haut ou en bas (y)
					res = placeVertical

		return res

	def estVide(self):
	#Données: Grille
	#Pré-conditions: ---
	#Resultat: Renvoie True si la grille ne comporte plus aucun bateau, renvoie False sinon
	#Post-conditions: bool
		res = True
		i = 0
		j = 0
		while(res and i < self.taille):
				j=0
				while(res and j < self.taille):
					res = not(self.estBateau(i,j))
					j+=1
				i+=1
		return res

	def tirer(self,flotte, xTir, yTir):
	#Données: Grille, flotte et coordonnées (xTir,yTir) du joueur sur lequel on tire
	#Pré-conditions: xTir:int, yTir:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Renvoie le résultat du tir (à l'eau, en vue, touché ou coulé) et modifie la flotte et la grille en cas de tir reussi
	#Post-conditions: resultatTir:string
		res = ""
		if self.estBateau(xTir,yTir):
			# Touché ou coulé ?
			bateauTouche = self.getBateau(xTir,yTir)
			# On supprime la position pour la mettre à -1
			self.supprimerPosition(xTir,yTir)
			# On décrémente la taille du bateau dans la flotte
			flotte.touche(bateauTouche)

			#Vérifie que le bateau est coulé (taille à 0 dans la flotte) sinon renvoie touché
			if (flotte.coule(bateauTouche)):
				res = "coulé"
			else:
				res = "touché"
		else:
			# A l'eau ou en vue ?
			if(self.envue(xTir,yTir)):
				res = "En vue"
			else:
				res = "A l'eau"
		return res

f2f15ab44bf2b0bdc99aa7ada100144e53a64c4e
class Grille:

    def __init__(self, tailleGrille):
        try:
            self.taille = tailleGrille
            self.positions = [[(-1) for j in range(0, tailleGrille)] for i in
                range(0, tailleGrille)]
        except:
            print('Erreur dans la création de la grille.')
    <mask token>

    def getBateau(self, xBat, yBat):
        try:
            numBat = self.positions[xBat][yBat]
        except IndexError:
            numBat = -1
        return numBat
    <mask token>
    <mask token>

    def estDansGrille(self, x, y):
        res = False
        if x < self.taille and y < self.taille and x >= 0 and y >= 0:
            res = True
        return res

    def estBateau(self, x, y):
        res = False
        if self.estDansGrille(x, y):
            if self.positions[x][y] != -1:
                res = True
        return res
    <mask token>
    <mask token>
    <mask token>
    <mask token>
    <mask token>

class Grille:

    def __init__(self, tailleGrille):
        try:
            self.taille = tailleGrille
            self.positions = [[(-1) for j in range(0, tailleGrille)] for i in
                range(0, tailleGrille)]
        except:
            print('Erreur dans la création de la grille.')

    def placerPositionBateau(self, numBat, xBat, yBat):
        try:
            self.positions[xBat][yBat] = numBat
        except IndexError:
            print('Erreur placement bateau : coordonnées hors grille.')

    def getBateau(self, xBat, yBat):
        try:
            numBat = self.positions[xBat][yBat]
        except IndexError:
            numBat = -1
        return numBat
    <mask token>

    def envue(self, xTir, yTir):
        res = False
        for i in range(0, self.taille):
            if self.positions[xTir][i] != -1:
                res = True
        for i in range(0, self.taille):
            if self.positions[i][yTir] != -1:
                res = True
        return res

    def estDansGrille(self, x, y):
        res = False
        if x < self.taille and y < self.taille and x >= 0 and y >= 0:
            res = True
        return res

    def estBateau(self, x, y):
        res = False
        if self.estDansGrille(x, y):
            if self.positions[x][y] != -1:
                res = True
        return res

    def verificationCoordonnees(self, x, y):
        return not self.estBateau(x, y) and self.estDansGrille(x, y)
    <mask token>

    def noSpace(self, taille, numBat, x, y):
        res = False
        placeVertical = False
        placeHorizontal = False
        if self.verificationCoordonnees(x, y):
            cHorizontalPos = 0
            cHorizontalNeg = 0
            while self.verificationCoordonnees(x + 1 + cHorizontalPos, y
                ) or self.getBateau(x + 1 + cHorizontalPos, y) == numBat:
                cHorizontalPos += 1
            while self.verificationCoordonnees(x - 1 - cHorizontalNeg, y
                ) or self.getBateau(x - 1 - cHorizontalNeg, y) == numBat:
                cHorizontalNeg += 1
            placeHorizontal = cHorizontalNeg + cHorizontalPos + 1 >= taille
            cVerticalPos = 0
            cVerticalNeg = 0
            while self.verificationCoordonnees(x, y + cVerticalPos + 1
                ) or self.getBateau(x, y + cVerticalPos + 1) == numBat:
                cVerticalPos += 1
            while self.verificationCoordonnees(x, y - cVerticalNeg - 1
                ) or self.getBateau(x, y - cVerticalNeg - 1) == numBat:
                cVerticalNeg += 1
            placeVertical = cVerticalNeg + cVerticalPos + 1 >= taille
            if not self.estValide(numBat, x, y):
                res = placeVertical or placeHorizontal
            else:
                if self.getBateau(x + 1, y) == numBat or self.getBateau(x -
                    1, y) == numBat:
                    res = placeHorizontal
                if self.getBateau(x, y - 1) == numBat or self.getBateau(x, 
                    y + 1) == numBat:
                    res = placeVertical
        return res
    <mask token>
    <mask token>

class Grille:

    def __init__(self, tailleGrille):
        try:
            self.taille = tailleGrille
            self.positions = [[(-1) for j in range(0, tailleGrille)] for i in
                range(0, tailleGrille)]
        except:
            print('Erreur dans la création de la grille.')

    def placerPositionBateau(self, numBat, xBat, yBat):
        try:
            self.positions[xBat][yBat] = numBat
        except IndexError:
            print('Erreur placement bateau : coordonnées hors grille.')

    def getBateau(self, xBat, yBat):
        try:
            numBat = self.positions[xBat][yBat]
        except IndexError:
            numBat = -1
        return numBat

    def supprimerPosition(self, xBat, yBat):
        self.positions[xBat][yBat] = -1

    def envue(self, xTir, yTir):
        res = False
        for i in range(0, self.taille):
            if self.positions[xTir][i] != -1:
                res = True
        for i in range(0, self.taille):
            if self.positions[i][yTir] != -1:
                res = True
        return res

    def estDansGrille(self, x, y):
        res = False
        if x < self.taille and y < self.taille and x >= 0 and y >= 0:
            res = True
        return res

    def estBateau(self, x, y):
        res = False
        if self.estDansGrille(x, y):
            if self.positions[x][y] != -1:
                res = True
        return res

    def verificationCoordonnees(self, x, y):
        return not self.estBateau(x, y) and self.estDansGrille(x, y)
    <mask token>

    def noSpace(self, taille, numBat, x, y):
        res = False
        placeVertical = False
        placeHorizontal = False
        if self.verificationCoordonnees(x, y):
            cHorizontalPos = 0
            cHorizontalNeg = 0
            while self.verificationCoordonnees(x + 1 + cHorizontalPos, y
                ) or self.getBateau(x + 1 + cHorizontalPos, y) == numBat:
                cHorizontalPos += 1
            while self.verificationCoordonnees(x - 1 - cHorizontalNeg, y
                ) or self.getBateau(x - 1 - cHorizontalNeg, y) == numBat:
                cHorizontalNeg += 1
            placeHorizontal = cHorizontalNeg + cHorizontalPos + 1 >= taille
            cVerticalPos = 0
            cVerticalNeg = 0
            while self.verificationCoordonnees(x, y + cVerticalPos + 1
                ) or self.getBateau(x, y + cVerticalPos + 1) == numBat:
                cVerticalPos += 1
            while self.verificationCoordonnees(x, y - cVerticalNeg - 1
                ) or self.getBateau(x, y - cVerticalNeg - 1) == numBat:
                cVerticalNeg += 1
            placeVertical = cVerticalNeg + cVerticalPos + 1 >= taille
            if not self.estValide(numBat, x, y):
                res = placeVertical or placeHorizontal
            else:
                if self.getBateau(x + 1, y) == numBat or self.getBateau(x -
                    1, y) == numBat:
                    res = placeHorizontal
                if self.getBateau(x, y - 1) == numBat or self.getBateau(x, 
                    y + 1) == numBat:
                    res = placeVertical
        return res
    <mask token>
    <mask token>

class Grille:

    def __init__(self, tailleGrille):
        try:
            self.taille = tailleGrille
            self.positions = [[(-1) for j in range(0, tailleGrille)] for i in
                range(0, tailleGrille)]
        except:
            print('Erreur dans la création de la grille.')

    def placerPositionBateau(self, numBat, xBat, yBat):
        try:
            self.positions[xBat][yBat] = numBat
        except IndexError:
            print('Erreur placement bateau : coordonnées hors grille.')

    def getBateau(self, xBat, yBat):
        try:
            numBat = self.positions[xBat][yBat]
        except IndexError:
            numBat = -1
        return numBat

    def supprimerPosition(self, xBat, yBat):
        self.positions[xBat][yBat] = -1

    def envue(self, xTir, yTir):
        res = False
        for i in range(0, self.taille):
            if self.positions[xTir][i] != -1:
                res = True
        for i in range(0, self.taille):
            if self.positions[i][yTir] != -1:
                res = True
        return res

    def estDansGrille(self, x, y):
        res = False
        if x < self.taille and y < self.taille and x >= 0 and y >= 0:
            res = True
        return res

    def estBateau(self, x, y):
        res = False
        if self.estDansGrille(x, y):
            if self.positions[x][y] != -1:
                res = True
        return res

    def verificationCoordonnees(self, x, y):
        return not self.estBateau(x, y) and self.estDansGrille(x, y)
    <mask token>

    def noSpace(self, taille, numBat, x, y):
        res = False
        placeVertical = False
        placeHorizontal = False
        if self.verificationCoordonnees(x, y):
            cHorizontalPos = 0
            cHorizontalNeg = 0
            while self.verificationCoordonnees(x + 1 + cHorizontalPos, y
                ) or self.getBateau(x + 1 + cHorizontalPos, y) == numBat:
                cHorizontalPos += 1
            while self.verificationCoordonnees(x - 1 - cHorizontalNeg, y
                ) or self.getBateau(x - 1 - cHorizontalNeg, y) == numBat:
                cHorizontalNeg += 1
            placeHorizontal = cHorizontalNeg + cHorizontalPos + 1 >= taille
            cVerticalPos = 0
            cVerticalNeg = 0
            while self.verificationCoordonnees(x, y + cVerticalPos + 1
                ) or self.getBateau(x, y + cVerticalPos + 1) == numBat:
                cVerticalPos += 1
            while self.verificationCoordonnees(x, y - cVerticalNeg - 1
                ) or self.getBateau(x, y - cVerticalNeg - 1) == numBat:
                cVerticalNeg += 1
            placeVertical = cVerticalNeg + cVerticalPos + 1 >= taille
            if not self.estValide(numBat, x, y):
                res = placeVertical or placeHorizontal
            else:
                if self.getBateau(x + 1, y) == numBat or self.getBateau(x -
                    1, y) == numBat:
                    res = placeHorizontal
                if self.getBateau(x, y - 1) == numBat or self.getBateau(x, 
                    y + 1) == numBat:
                    res = placeVertical
        return res

    def estVide(self):
        res = True
        i = 0
        j = 0
        while res and i < self.taille:
            j = 0
            while res and j < self.taille:
                res = not self.estBateau(i, j)
                j += 1
            i += 1
        return res

    def tirer(self, flotte, xTir, yTir):
        res = ''
        if self.estBateau(xTir, yTir):
            bateauTouche = self.getBateau(xTir, yTir)
            self.supprimerPosition(xTir, yTir)
            flotte.touche(bateauTouche)
            if flotte.coule(bateauTouche):
                res = 'coulé'
            else:
                res = 'touché'
        elif self.envue(xTir, yTir):
            res = 'En vue'
        else:
            res = "A l'eau"
        return res

#!/usr/bin/python
# -*- coding: utf8 -*-
class Grille :
# Structure de données choisie
# taille: int           taille de la grille
# positions[][]         tableau des positions de la grille

	def __init__(self, tailleGrille):
	#Initialise une grille, avec comme paramètre la taille de celle-ci.
	#Renvoie erreur si grille n'a pas été initialisée
		try:
			self.taille = tailleGrille
			self.positions = [[-1 for j in range(0, tailleGrille)] for i in range(0, tailleGrille)]
		except:
			print("Erreur dans la création de la grille.")

	def placerPositionBateau(self, numBat, xBat, yBat):
	#Données: Grille, numéro du bateau à placer, et coordonnées indiquant où on veut le placer
	#Pré-conditions: numBat:int, xBat:int, yBat:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Ajoute le bateau de numéro numBat à la position (xBat,yBat) sur la grille du joueur et renvoie la grille. Renvoie erreur si la position n'est pas ajoutée !
	#Post-conditions:
		try:
			self.positions[xBat][yBat] = numBat
		except IndexError:
			print("Erreur placement bateau : coordonnées hors grille.")

	def getBateau(self, xBat, yBat):
	#Données: Grille et coordonnées étudiées
	#Pré-conditions: xBat:int, yBat:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Renvoie le numéro du bateau correspondant aux coordonnées xBat, yBat, ou renvoie -1 s'il n'y pas de bateau
	#Post-conditions: numBat:int
		try:
			numBat = self.positions[xBat][yBat]
		except IndexError:
			numBat = -1
		return numBat

	def supprimerPosition(self, xBat, yBat):
	#Données: Grille et cordonnées (xBat,yBat)
	#Pré-conditions: xBat:int, yBat:int , on suppose vérfifiée le fait que la postion contient un bateau et avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Supprime la position indiquée par les coordonnées (xBat,yBat) et renvoie la grille modifiée
	#Post-conditions:
		self.positions[xBat][yBat] = -1

	def envue(self, xTir, yTir):
	#Données: Grille et coordonnées(xTir,yTir)
	#Pré-conditions: xTir:int, yTir:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat:Renvoie True si il y a un bateau sur la coordonnée xTir ou sur la coordonnée yTir, renvoie False sinon
	#Post-conditions: bool
		res = False
		for i in range (0,self.taille):
				if(self.positions[xTir][i] != -1):
						res = True
		for i in range (0, self.taille):
				if(self.positions[i][yTir] != -1):
						res = True
		return res

	def estDansGrille(self, x, y):
	#Données: Grille et coordonnées (x,y)
	#Pré-conditions: x:int, y:int
	#Resultat: Renvoie True si la position indiquée par (x,y) se trouve dans la grille, renvoie False sinon
	#Post-conditions: bool
		res = False
		if(x < self.taille and y < self.taille and x >= 0 and y >= 0):
				res = True
		return res

	def estBateau (self, x, y):
	#Données: Grille et coordonnées (x,y)
	#Pré-conditions: x:int, y:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Renvoie True s'il y a un bateau aux coordonnées (x,y) indiquées, renvoie False sinon
	#Post-conditions: bool
		res = False
		if(self.estDansGrille(x,y)):
				if(self.positions[x][y] != -1):
						res = True
		return res

	def verificationCoordonnees(self, x, y):
	#Données: Grille et coordonnées (x,y)
	#Pré-conditions: x:int, y:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Renvoie True si la position indiquée indiquée par (x,y) est dans la grille et non-occupée par un bateau, renvoie False sinon
	#Post-conditions: bool
		return not(self.estBateau(x,y)) and self.estDansGrille(x,y)

	def estValide(self, numBat, x, y):
	#Données: Grille, numéro du bateau, et coordonnées (x,y)
	#Pré-conditions: numBat:int, x:int, y:int
	#Resultat: Renvoie True si verificationCoordonnees est true et si la position indiquée par (x,y) est juxtaposée à un bateau de même numéro et que toutes les autres position de ce bateau sont sur la même ligne ou la même colonne, renvoie False sinon
	#Post-conditions: bool
		res = False
		if(self.verificationCoordonnees(x,y)):
				# getBateau() gère déjà les erreurs d'index

				#On fait un test pour savoir si il existe déjà une position de ce bateau déjà placé sur la grille
				dejaPlace = False
				i = 0
				j = 0
				while(not(dejaPlace) and i < self.taille):
						j=0
						while(not(dejaPlace) and j < self.taille):

							if (self.positions[i][j] == numBat):
								dejaPlace = True
							j+=1
						#Sortie: On sort si le bateau a été trouvé ou si on est sorti du tableau
						i+=1
				#Sortie: On sort si le bateau a été trouvé ou si on est sorti du tableau

				#Si ce n'est pas la première position placée
				if dejaPlace:
					#Si une case à côté de (x,y) contient le numéro du bateau que l'on veut placer, alors on vérifie que le bateau est bien horizontal ou vertical et ne forme pas un angle droit
					if(self.getBateau(x+1,y) == numBat):
							if(self.getBateau(x+2,y) == numBat):
									res = True
							elif(self.getBateau(x+1,y+1) != numBat and self.getBateau(x+1,y-1) != numBat):
									res = True

					if(self.getBateau(x-1,y) == numBat):
							if(self.getBateau(x-2,y) == numBat):
									res = True
							elif(self.getBateau(x-1,y+1) != numBat and self.getBateau(x-1,y-1) != numBat):
									res = True

					if(self.getBateau(x,y+1) == numBat):
							if(self.getBateau(x,y+2) == numBat):
									res = True
							elif(self.getBateau(x+1,y+1) != numBat and self.getBateau(x-1,y+1) != numBat):
									res = True

					if(self.getBateau(x,y-1) == numBat):
							if(self.getBateau(x,y-2) == numBat):
									res = True
							elif(self.getBateau(x+1,y-1) != numBat and self.getBateau(x+1,y-1) != numBat):
									res = True
		return res

	def noSpace(self,taille,numBat,x,y):
	#Données: Grille,taille du bateau, et coordonnées (x,y)
	#Pré-conditions: numBat:int, x:int, y:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Renvoie True si après vérification, il y a suffisament de place pour inserer le bateau à l'horizontale ou à la verticale
	#après analyse de la direction du bateau si il y a déjà des cases ajoutées pour le numBat donné en paramètre
	#Post-conditions: bool
		res = False
		placeVertical = False
		placeHorizontal = False

		if(self.verificationCoordonnees(x,y)):

			# Vérification horizontale
			cHorizontalPos = 0
			cHorizontalNeg = 0
			while(self.verificationCoordonnees(x+1+cHorizontalPos,y) or self.getBateau(x+1+cHorizontalPos,y) == numBat):
				cHorizontalPos += 1
			# Sortie : on rencontre une case soit prise par un bateau soit hors grille (sens positif horizontal)
			while(self.verificationCoordonnees(x-1-cHorizontalNeg,y) or self.getBateau(x-1-cHorizontalNeg,y) == numBat):
				cHorizontalNeg += 1
			# Sortie : on rencontre une case soit prise par un bateau soit hors grille (sens négatif horizontal)
			placeHorizontal = ((cHorizontalNeg + cHorizontalPos + 1) >= taille)

			# Vérification verticale
			cVerticalPos = 0
			cVerticalNeg = 0
			while(self.verificationCoordonnees(x,y+cVerticalPos+1) or self.getBateau(x,y+cVerticalPos+1) == numBat):
				cVerticalPos += 1
			# Sortie : on rencontre une case soit prise par un bateau soit hors grille (sens positif vertical)
			while(self.verificationCoordonnees(x,y-cVerticalNeg-1) or self.getBateau(x,y-cVerticalNeg-1) == numBat):
				cVerticalNeg += 1
			# Sortie : on rencontre une case soit prise par un bateau soit hors grille (sens négatif vertical)
			placeVertical = ((cVerticalNeg + cVerticalPos + 1) >= taille)

			# 1ère position à placer
			if(not self.estValide(numBat,x,y)):
				res = placeVertical or placeHorizontal

			# 2ème ou + position à placer
			else:
				# on cherche la case juxtaposée
				if(self.getBateau(x+1,y) == numBat or self.getBateau(x-1,y) == numBat):
					# case à droite ou à gauche (x)
					res = placeHorizontal

				if(self.getBateau(x,y-1) == numBat or self.getBateau(x,y+1) == numBat):
					# case en haut ou en bas (y)
					res = placeVertical

		return res

	def estVide(self):
	#Données: Grille
	#Pré-conditions: ---
	#Resultat: Renvoie True si la grille ne comporte plus aucun bateau, renvoie False sinon
	#Post-conditions: bool
		res = True
		i = 0
		j = 0
		while(res and i < self.taille):
				j=0
				while(res and j < self.taille):
					res = not(self.estBateau(i,j))
					j+=1
				i+=1
		return res

	def tirer(self,flotte, xTir, yTir):
	#Données: Grille, flotte et coordonnées (xTir,yTir) du joueur sur lequel on tire
	#Pré-conditions: xTir:int, yTir:int avec estDansGrille(xBat) et estDansGrille(yBat)
	#Resultat: Renvoie le résultat du tir (à l'eau, en vue, touché ou coulé) et modifie la flotte et la grille en cas de tir reussi
	#Post-conditions: resultatTir:string
		res = ""
		if self.estBateau(xTir,yTir):
			# Touché ou coulé ?
			bateauTouche = self.getBateau(xTir,yTir)
			# On supprime la position pour la mettre à -1
			self.supprimerPosition(xTir,yTir)
			# On décrémente la taille du bateau dans la flotte
			flotte.touche(bateauTouche)

			#Vérifie que le bateau est coulé (taille à 0 dans la flotte) sinon renvoie touché
			if (flotte.coule(bateauTouche)):
				res = "coulé"
			else:
				res = "touché"
		else:
			# A l'eau ou en vue ?
			if(self.envue(xTir,yTir)):
				res = "En vue"
			else:
				res = "A l'eau"
		return res
