Problème Jeu Bataille Navale

Fermé
nico77fire Messages postés 5 Date d'inscription samedi 15 mai 2021 Statut Membre Dernière intervention 7 novembre 2021 - 16 mai 2021 à 19:04
jee pee Messages postés 39585 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 19 avril 2024 - 17 mai 2021 à 09:57
Bonjour, je suis en train de coder une bataille navale dans le cadre d'un projet et j'ai un problème que je n'arrive pas du tout à résoudre, dans mon code tout marche bien, le joueur peut bien donner le tir qu'il veut effectuer, s'il rate son tir tout marche très bien, il y a bien le message qui affiche le fait qu'il a raté et ca va afficher sur le grille une étoile qui correspond à l'endroit du raté mais quand il réussit son tir il ne se passe rien, c'est comme s'il le tir n'avait pas été pris en compte, il n'y pas de message pour la réussite du tir et pas d'affichage sur la grille et c'est la même chose pour l'ordi qui est une version automatisé du système de tir du joueur, quand il rate tout marche mais pas quand il touche, voici un lien ou il y a tout mon code:

https://github.com/LenaB78/Bataille-Navale/blob/main/Battleship.py

Merci d'avance
Configuration: Windows / Firefox 88.0

5 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929
16 mai 2021 à 19:47
Bonjour

pour poster un code, il faut faire comme décrit là
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929
16 mai 2021 à 19:48
D'ailleurs, on te l'a déjà dit cette nuit
0
nico77fire Messages postés 5 Date d'inscription samedi 15 mai 2021 Statut Membre Dernière intervention 7 novembre 2021
16 mai 2021 à 20:00
Je repose mon code ici du coup, merci
import random


COLONNES = {'A':0, 'B':1, 'C':2, 'D':3, 'E':4, 'F':5, 'G':6, 'H':7, 'I':8, 'J':9}

LETTRES = ['A','B','C','D','E','F','G','H','I','J']

NAVIRES = {'Porte-avion':5,'Croiseur':4,'Contre-torpilleur1':3, 'Contre-torpilleur2':3, 'Sous-marin':2}

SENS = ['H','V']


IA_PORTE_AVION = []
IA_TIR_PORTE_AVION = []
IA_CROISEUR = []
IA_TIR_CROISEUR = []
IA_CONTRE_TORPILLEUR1 = []
IA_TIR_CONTRE_TORPILLEUR1 = []
IA_CONTRE_TORPILLEUR2 = []
IA_TIR_CONTRE_TORPILLEUR2 = []
IA_SOUS_MARIN = []
IA_TIR_SOUS_MARIN = []


PLAYER_PORTE_AVION = []
PLAYER_TIR_PORTE_AVION = []
PLAYER_CROISEUR = []
PLAYER_TIR_CROISEUR = []
PLAYER_CONTRE_TORPILLEUR1 = []
PLAYER_TIR_CONTRE_TORPILLEUR1 = []
PLAYER_CONTRE_TORPILLEUR2 = []
PLAYER_TIR_CONTRE_TORPILLEUR2 = []
PLAYER_SOUS_MARIN = []
PLAYER_TIR_SOUS_MARIN = []


def init_grille(symbole):
	grille=[]
	for i in range(10):
		grille.append([])
		for j in range (10):
			grille[i].append(symbole)
	return grille


def Affichage_grille_tirs(tirs):
	lettrecolonne=0
	print("  ", end="")
	while lettrecolonne<=9:
		print(LETTRES[lettrecolonne], end=" ")
		lettrecolonne+=1
	print()
	numligne=1
	while numligne<=10:
		for ligne in tirs:
			print(numligne, end=" ")
			for element in ligne:
				if element==-1:
					print(".", end=" ")
				elif element==0:
					print("*", end=" ")
				elif element==1 or element==2:
					print("X", end=" ")
			print()
			numligne+=1
            
def Affichage_grille_bateau(bateaux):

	lettrecolonne=0
	print("  ", end="")
	while lettrecolonne<=9:
		print(LETTRES[lettrecolonne], end=" ")
		lettrecolonne+=1
	print()
	numligne=1
	while numligne<=10:
		for ligne in bateaux:
			print(numligne, end=" ")
			for element in ligne:
				if element==0:
					print(".", end=" ")
				elif element==1:
					print("O", end=" ")
				elif element=='tirmanqué':
					print("*", end=" ")
				elif element=='tirtouché':
					print("X", end=" ")
			print()
			numligne+=1
            
            
def Init_placement_bateaux(c, l, bateau, sens, grille, joueur):
    taille=NAVIRES[bateau]
    if sens == 1:
        if c+(taille-1)<10 and c<=(10-taille):
            c1=c
            for i in range (taille):
                grille[l][c1]=1
                Sauvegarde_placement(c1, l, bateau, joueur)
                c1+=1
            return grille
    elif sens == 2:
        if l+(taille-1)<10 and l<=(10-taille):
            l1 = l
            for i in range(taille):
                grille[l1][c]=1
                Sauvegarde_placement(c, l1, bateau, joueur)
                l1+=1
            return grille
    else:
        print("/!\ Sens inconnu /!\ ")
        
        
def Placement_bateau_player(bateaux):

	for bateau in NAVIRES :
		taille=NAVIRES[bateau]
		print("\nVous allez placer le bateau :", bateau, "de longueur", taille, "case.\n")
		Affichage_grille_bateau(bateaux)
		possible = 0
		while possible != 1:
			x=str(input("\nEntrez ici la lettre souhaitée :"))
			x=x.upper()
			while x not in LETTRES:
				print("/!\ Erreur de lettre, veuillez resaisir la lettre ! /!\ ")
				x=str(input("Entrez ici la lettre souhaitée :"))
				x=x.upper()
			x=int(COLONNES[x])

			cond=0
			while cond!=1:	
				y = input("Entrez ici la colonne souhaitée :")
				while not y.isdigit():
					print("/!\ Erreur de colonne, veuillez resaisir la colonne ! /!\ ")
					y = input("Entrez ici la colonne souhaitée :")
				y=int(y)
				if y in range(1,11):
					y=y-1
					cond=1
				else:
					print("/!\ Erreur de colonne, resaisie ta colonne ! /!\ ")

			sens=str(input("Entrez ici le sens souhaité (Horizontal ou Vertical) [H/V] :"))
			sens=sens.upper()
			while sens not in SENS:
				print("/!\ Erreur de sens, veuillez resaisir le sens ! /!\ ")
				sens=str(input("Entrez ici le sens souhaité (Horizontal ou Vertical) [H/V] :"))
				sens=sens.upper()
			if sens=='H':
				sens=1
			elif sens=="V":
				sens=2

			possible = Placement_possible(x, y, taille, sens, bateaux)
			if possible == 0:
				print("Erreur dans le placement, recommencez votre placement !")
		Init_placement_bateaux(x, y, bateau, sens, bateaux, 'player')
	return bateaux


def Placement_bateaux_aleatoire(grille):

	for bateau in NAVIRES:
		taille = NAVIRES[bateau]
		possible = 0
		while possible != 1:
			x = random.randint(0,9)
			y = random.randint(0,9)
			sens = random.randint(1,2)
			possible = Placement_possible(x, y, taille, sens, grille)
		Init_placement_bateaux(x, y, bateau, sens, grille, "ia")
	return grille
            


def Placement_possible(c, l, taille, sens, grille):

	if sens == 1:
		if c+(taille-1)<10 and c<=(10-taille):
			c1 = c
			cpt = 0
			possible = 1
			while cpt !=taille and possible ==1:
				possible = 0
				if grille[l][c1] == 0:
					possible = 1
					c1+=1
					cpt+=1
			return possible
		else:
			return 0

	if sens == 2:
		if l+(taille-1)<10 and l<=(10-taille):
			l1 = l
			cpt = 0
			possible = 1
			while cpt !=taille and possible ==1:
				possible = 0
				if grille[l1][l] == 0:
					possible = 1
					l1+=1
					cpt+=1
			return possible
		else:
			return 0
        
def Sauvegarde_placement(x, y, bateau, joueur):
    
    if joueur == "ia":
        if bateau == "Porte-avion":
            IA_PORTE_AVION.append((x,y))
        elif bateau == "Croiseur":
            IA_CROISEUR.append((x,y))
        elif bateau == "Contre-torpilleur1":
            IA_CONTRE_TORPILLEUR1.append((x,y))
        elif bateau == "Contre-torpilleur2":
            IA_CONTRE_TORPILLEUR2.append((x,y))
        elif bateau == "Sous-marin":
            IA_SOUS_MARIN.append((x,y))
            
    elif joueur == 'player':
        if bateau == "Porte-avion":
            PLAYER_PORTE_AVION.append((x,y))
        elif bateau == "Croiseur":
            PLAYER_CROISEUR.append((x,y))
        elif bateau == "Contre-torpilleur1":
            PLAYER_CONTRE_TORPILLEUR1.append((x,y))
        elif bateau == "Contre-torpilleur2":
            PLAYER_CONTRE_TORPILLEUR2.append((x,y))
        elif bateau == "Sous-marin":
            PLAYER_SOUS_MARIN.append((x,y))
            
            
def Tour_de_jeu(tirs, joueur):

    if joueur=='player':
        print("Saisissez la position de votre prochain tir :")
        colonne=str(input("Lettre de la colonne :"))
        colonne=colonne.upper() #Répare l'erreur si l'utilisateur rentre un a au lieu de A
        while colonne not in LETTRES:
            print("/!\ Erreur de lettre, veuillez ressaisir votre lettre ! /!\ ")
            colonne=str(input("Lettre de la colonne :"))
            colonne=colonne.upper()
        colonne=int(COLONNES[colonne])
        
        cond=0
        while cond!=1:	
            ligne = input("N° de la ligne :")
            while not ligne.isdigit():
                print("/!\ Erreur de ligne, veuillez ressaisir votre ligne ! /!\ ")
                ligne = input("N° de la ligne :")
            ligne = int(ligne)
            if ligne in range(1,11):
                ligne = ligne-1 #car ligne 5 en vrai = ligne 4 en python
                cond=1
            else:
                print("/!\ Erreur de ligne, veuillez ressaisir votre ligne ! /!\ ")
                
    elif joueur == "ia":
        ligne = random.randint(0,9)
        colonne = random.randint(0,9)

    if (0<=ligne<=9) and (0<=colonne<=9) and (tirs[ligne][colonne]==-1):
        return (ligne, colonne)
    else:
        if joueur=='player':
            print("/!\ Erreur tir (déjà fait ou incorrect). Veuillez recommencer votre tir ! /!\ ")
        return Tour_de_jeu(tirs, joueur)
    
def tirer(bateaux, tirs, ligne, colonne, joueur):
    
    if joueur == "player":
        PORTE_AVION = IA_PORTE_AVION
        TIR_PORTE_AVION = IA_TIR_PORTE_AVION
        CROISEUR = IA_CROISEUR
        TIR_CROISEUR = IA_TIR_CROISEUR
        CONTRE_TORPILLEUR1 = IA_CONTRE_TORPILLEUR1
        TIR_CONTRE_TORPILLEUR1 = IA_TIR_CONTRE_TORPILLEUR1
        CONTRE_TORPILLEUR2 = IA_CONTRE_TORPILLEUR2
        TIR_CONTRE_TORPILLEUR2 = IA_TIR_CONTRE_TORPILLEUR2
        SOUS_MARIN = IA_SOUS_MARIN
        TIR_SOUS_MARIN = IA_TIR_SOUS_MARIN

        
    elif joueur == "ia":
        PORTE_AVION = PLAYER_PORTE_AVION
        TIR_PORTE_AVION = PLAYER_TIR_PORTE_AVION
        CROISEUR = PLAYER_CROISEUR
        TIR_CROISEUR = PLAYER_TIR_CROISEUR
        CONTRE_TORPILLEUR1 = PLAYER_CONTRE_TORPILLEUR1
        TIR_CONTRE_TORPILLEUR1 = PLAYER_TIR_CONTRE_TORPILLEUR1
        CONTRE_TORPILLEUR2 = PLAYER_CONTRE_TORPILLEUR2
        TIR_CONTRE_TORPILLEUR2 = PLAYER_TIR_CONTRE_TORPILLEUR2
        SOUS_MARIN = PLAYER_SOUS_MARIN
        TIR_SOUS_MARIN = PLAYER_TIR_SOUS_MARIN
    
    res=resultat_tir(bateaux, ligne, colonne, joueur)
    if res==0:
        tirs[ligne][colonne]=0
        return 0
    
    elif res==1:
        tirs[ligne][colonne]=1
        return 1
    
    elif res==2:
        tirs[ligne][colonne]=2
        return 2


def resultat_tir(bateaux, ligne, colonne, joueur):

    if joueur == "player":
        PORTE_AVION = IA_PORTE_AVION
        TIR_PORTE_AVION = IA_TIR_PORTE_AVION
        CROISEUR = IA_CROISEUR
        TIR_CROISEUR = IA_TIR_CROISEUR
        CONTRE_TORPILLEUR1 = IA_CONTRE_TORPILLEUR1
        TIR_CONTRE_TORPILLEUR1 = IA_TIR_CONTRE_TORPILLEUR1
        CONTRE_TORPILLEUR2 = IA_CONTRE_TORPILLEUR2
        TIR_CONTRE_TORPILLEUR2 = IA_TIR_CONTRE_TORPILLEUR2
        SOUS_MARIN = IA_SOUS_MARIN
        TIR_SOUS_MARIN = IA_TIR_SOUS_MARIN
    
    elif joueur == "ia":
        PORTE_AVION = PLAYER_PORTE_AVION
        TIR_PORTE_AVION = PLAYER_TIR_PORTE_AVION
        CROISEUR = PLAYER_CROISEUR
        TIR_CROISEUR = PLAYER_TIR_CROISEUR
        CONTRE_TORPILLEUR1 = PLAYER_CONTRE_TORPILLEUR1
        TIR_CONTRE_TORPILLEUR1 = PLAYER_TIR_CONTRE_TORPILLEUR1
        CONTRE_TORPILLEUR2 = PLAYER_CONTRE_TORPILLEUR2
        TIR_CONTRE_TORPILLEUR2 = PLAYER_TIR_CONTRE_TORPILLEUR2
        SOUS_MARIN = PLAYER_SOUS_MARIN
        TIR_SOUS_MARIN = PLAYER_TIR_SOUS_MARIN
    
    if (bateaux[ligne][colonne]==0):
        return 0
    
    elif (bateaux[ligne][colonne]==1):
        if ((ligne, colonne) in PORTE_AVION):
            PORTE_AVION.remove((ligne, colonne))
            TIR_PORTE_AVION.append((ligne, colonne))
            if len(PORTE_AVION)!=0:
                return 1
            elif len(PORTE_AVION)==0:
                return 2
        
        elif ((ligne, colonne) in CROISEUR):
            CROISEUR.remove((ligne, colonne))
            TIR_CROISEUR.append((ligne, colonne))
            if len(CROISEUR)!=0:
                return 1
            elif len(CROISEUR)==0:
                return 2
        
        if ((ligne, colonne) in CONTRE_TORPILLEUR1):
            CONTRE_TORPILLEUR1.remove((ligne, colonne))
            TIR_CONTRE_TORPILLEUR1.append((ligne, colonne))
            if len(CONTRE_TORPILLEUR1)!=0:
                return 1
            elif len(CONTRE_TORPILLEUR1)==0:
                return 2
            
        elif ((ligne, colonne) in CONTRE_TORPILLEUR2):
            CONTRE_TORPILLEUR2.remove((ligne, colonne))
            TIR_CONTRE_TORPILLEUR2.append((ligne, colonne))
            if len(CONTRE_TORPILLEUR2)!=0:
                return 1
            elif len(CONTRE_TORPILLEUR2)==0:
                return 2
        
        elif ((ligne, colonne) in SOUS_MARIN):
            SOUS_MARIN.remove((ligne, colonne))
            TIR_SOUS_MARIN.append((ligne, colonne))
            if len(SOUS_MARIN)!=0:
                return 1
            elif len(SOUS_MARIN)==0:
                return 2
            

            
def partie_finie(tirs):

	#Cette partie va compter le nombre de 2 dans le tableau
	compteur=0
	for ligne in tirs:
		for valeur in ligne:
			if valeur==2:
				compteur +=1
	#Cette partie va compter la somme de la longueur de tous les bateaux
	total=0
	for valeur in NAVIRES.values():
		total += valeur
	if compteur==total:
		return True
	else:
		return False

    
def debut():
    
    print("            -------------------------------------")
    print("            - Bienvenue dans la Bataille Navale -")
    print("            -------------------------------------\n")
    print("\nVous allez affronter un ordinateur, les règles sont les suivantes:\n")
    print("- Vous pouvez disposer les bateAux de façon horizontale ou de façon verticale")
    print("- Attention? vous ne pouvez pas mettre deux bateaux l'un sur l'autre\n")
    print("\nVous disposez des bateaux suivants:")
    print("- 1 Porte-avion (5 cases)\n - 1 Croiseur (4 cases)\n - 2 Contre-torpilleurs (3 cases)\n - 1 Sous-marin (2 cases)\n \n")
    print("\nVous êtes maintenant prêt à jouer, bonne chance ! \n")
    
def fin(score_player, score_ia):
    print("Votre score final :", score_player)
    print("Score final de l'ordinateur :", score_ia)
    print("\n          -----------------------------------------  ")
    print("            - Vous avez gagné la partie, bien joué ! - ")
    print("            -----------------------------------------\n")


def Jeu():

    bateaux_player = init_grille(0)
    tirs_player = init_grille(-1)

    bateaux_ia = init_grille(0)
    bateaux_ia = Placement_bateaux_aleatoire(bateaux_ia)
    tirs_ia = init_grille(-1)
    
    score_player=25
    score_ia=25

    debut()

    print("Pour placer vos bateaux, saisissez la case de départ,\nensuite son sens. Il se placera automatiquement.\n")
    input("Appuyez sur <Entrée> pour commencer à placer vos bateaux.")

    Placement_bateau_player(bateaux_player)
    print()

    copie_bateaux_player=list(bateaux_player)

    input("Votre grille est prête, appuyez sur <Entrée> pour commencer à jouer !")
    while not partie_finie(tirs_player) and not partie_finie(tirs_ia):
        print("Vos bateaux (O) et les tirs de l'ordinateur :\n - (*) pour un tir manqué\n - (X) pour un bon tir\n")
        Affichage_grille_bateau(copie_bateaux_player)
        print("\nVotre grille de tirs :\n")
        Affichage_grille_tirs(tirs_player)
        print("\nVotre score :", score_player)
        print("\nScore ordinateur :", score_ia)
        print("\nA vous de jouer !\n")

        res_player=Tour_de_jeu(tirs_player, 'player')
        tir=tirer(bateaux_ia, tirs_player, res_player[0], res_player[1], 'player')
        if tir==0:
            print("\nVous avez raté votre tir.")
            score_player -= 1
        elif tir==1:
            print("\nVous avez touché un bateau.")
            score_player += 3
        elif tir==2:
            print("\nVous avez coulé un bateau.")
            score_player += 3
        
        #while tirer(bateaux_ia, tirs_player, res[0], res[1], 'player')==1 or tirer(bateaux_ia, tirs_player, res[0], res[1], 'player')==2:
         #   res=Tour_de_jeu(tirs_player, 'player')
          #  tirer(bateaux_ia, tirs_player, res[0], res[1], 'player')

        res_ordi=Tour_de_jeu(tirs_ia, 'ia')
        print("L'ordinateur à tiré en", LETTRES[res_ordi[1]], res_ordi[0]+1)
        res=tirer(bateaux_player, tirs_ia, res_ordi[0], res_ordi[1], 'ia')
        triche=input("\nRentrez 0 si l'ordinateur a manqué son tir, 1 si l'ordinateur a touché un bateau et 2 s'il a coulé un bateau :")
        triche=int(triche)
        while triche not in (0,1,2):
            print("\nVous n'avez pas choisi une valeur valide")
            triche=input("\nRentrez 0 si l'ordinateur a manqué son tir, 1 si l'ordinateur a touché un bateau et 2 s'il a coulé un bateau :")
            triche=int(triche)
            
        if res != triche:
            print("Vous avez triché, vous perdez 10 points.")
            score_player -= 10
        
        if res==0:
            print("\nL'ordinateur a raté son tir")
            score_ia -= 1
        if res==1:
            print("\nL'ordinateur à touché un bateau")
            score_ia += 3
        if res==2:
            print("\nL'ordinateur a coulé un bateau")
            score_ia += 3
            
        if res==0:
            copie_bateaux_player[res_ordi[0]][res_ordi[1]]='tirmanqué'
        else:
            copie_bateaux_player[res_ordi[0]][res_ordi[1]]='tirtouché'
#            while copie_bateaux_player[res_ordi[0]][res_ordi[1]]=='tirtouché':
#                res=tirer(bateaux_player, tirs_ia, res_ordi[0], res_ordi[1], 'ia')
#                if res==0:
#                    copie_bateaux_player[res_ordi[0]][res_ordi[1]]='tirmanqué'
#                else:
#                    copie_bateaux_player[res_ordi[0]][res_ordi[1]]='tirtouché'
        
		#Réponses affichées pour le test, à retirer apres !
        #Affichage_grille_bateau(bateaux_ia)
        
        print("Votre score :", score_player)
        print("Score de l'ordinateur :", score_ia)

        if partie_finie(tirs_player) or score_ia == 0:
            fin()
        elif partie_finie(tirs_ia) or score_player == 0:
            print("Votre score final :", score_player)
            print("Score final de l'ordinateur :", score_ia)
            print("\n          -----------------------------------------  ")
            print("            - L'ordinateur a gagné, dommage... -")
            print("            -----------------------------------------\n")
        else:
            input("Appuyez sur <Entrée> pour continuer...")
            
            
Jeu()
0
yg_be Messages postés 22705 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
16 mai 2021 à 20:31
bonjour,
si tu ne comprends pas le comportement de ton code, ajoute des instruction print() pour suivre ce qu'il fait.
0
jee pee Messages postés 39585 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 19 avril 2024 9 225
16 mai 2021 à 21:29
Après la ligne 455 tu devrais rajouter un
print('Valeur tir=',tir) 


0
jee pee Messages postés 39585 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 19 avril 2024 9 225
16 mai 2021 à 23:28
je pense que le soucis est sur toutes les lignes de ce type :
    elif (bateaux[ligne][colonne]==1):
        if ((ligne, colonne) in PORTE_AVION): 

bateaux est une liste ligne/colonne (pour afficher la grille) mais dans PORTE_AVION les couples stockés sont colonne/ligne (comme saisis : A6). Donc il y a un 1 dans la grille, mais on ne trouve pas le couple correspondant.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nico77fire Messages postés 5 Date d'inscription samedi 15 mai 2021 Statut Membre Dernière intervention 7 novembre 2021
17 mai 2021 à 00:46
Bonsoir, merci de votre réponse,
Que me conseillez vous de modifier pour que le code marche?
0
jee pee Messages postés 39585 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 19 avril 2024 9 225
17 mai 2021 à 09:57
soit tu inverses le couple lors du stockage, soit tu inverses le test des lignes comme la ligne 2, la ligne 1 ne changeant pas
0