Partage
  • Partager sur Facebook
  • Partager sur Twitter

boucle principale

    31 juillet 2014 à 1:00:51

    Bonsoir,

    J'ai un petit probleme pour la boucle principale du programme que je suis en train de faire :(

    """ Bataille navale """
    import os
    
    from random import*
    
    
    bateau = [ 2,3,4, ]
    
    
    r =  [ 5,6 ]
    
    bateau_trois = [ 8,10,12 ]
    
    continuer = True
    
    tir = 20
    while continuer:
    	while bateau or r or bateau_trois != [] and tir>0:          # tant que les listes ne sont pas vides
    	
    
    		coordonnes = input(" Saisissez un coordonées " )
    		coordonnes = int(coordonnes)
    		if coordonnes >50:
    			print(" Aucun coordonnes n'est supérieur à 50 ")
    		
    
    
    		for liste in bateau:
    			if liste == coordonnes:
    				bateau.remove(coordonnes)
    				print(" Touché, bien joué ")
    				tir += 1
    			if not bateau:
    				print(" Bateau coulé ")	
    	
    		
    		for list in r:
    			if list == coordonnes:
    				r.remove(coordonnes)
    				print(" Touché, bien joué ")
    				tir += 1
    			if not r:
    				print(" Bateau coulé")
    	
    		for lis in bateau_trois:
    			if lis == coordonnes:
    				bateau_trois.remove(coordonnes)
    				print(" Touché, bien joué ")
    				tir += 1
    			if not bateau_trois:
    				print(" Bateau coulé ")
    	
    		if coordonnes >12 and coordonnes <50:
    			print("A l'eau")
    			tir = tir -1
    		elif coordonnes <2:
    			print(" A l'eau ")
    			tir = tir -1
    		elif coordonnes ==7:
    			print(" A l'eau ")
    			tir = tir -1
    		elif coordonnes ==11:
    			print(" A l'eau ")
    			tir = tir -1
    		elif coordonnes ==9:
    			print("A l'eau")
    			tir = tir -1
    	
    		
    		if tir ==0:
    			print(" Vous ne pouvez plus tirer .... En effet, vous n'avez que " , tir , "tirs restants, c'est la fin de la partie" )
    			quitter = input(" Souhaitez vous refaire une partie ? ")
    			if quitter == "o" or quitter == "O":
    				print(" C'est parti ")
    				continuer = True
    			elif quitter != "o" or quitter != "O":
    				print(" au revoir ")
    				continuer = False
    				
    		elif not bateau and not r and not bateau_trois:
    			print("Vous avez détruit tous les bateaux, bien joué et vous terminez la bataille avec" , tir , " tirs disponibles!")
    			quitter = input(" Souhaitez vous refaire une partie ? ")
    			if quitter == "o" or quitter == "O":
    				print(" C'est parti ")
    				continuer = True
    			elif quitter != "o" or quitter != "O":
    				print(" au revoir ")
    				continuer = False
    			
    			
    			
    			
    		
    	
    		
    
    
    os.system("pause")

    Ici, lorsque je fais "o" pour recommencer, la boucle ne redemarre 

    J'ai essayé d'une autre maniere

    """ Bataille navale """
    import os
    
    from random import*
    
    
    bateau = [ 2,3,4, ]
    
    
    r =  [ 5,6 ]
    
    bateau_trois = [ 8,10,12 ]
    
    continuer = True
    
    tir = 20
    
    while bateau or r or bateau_trois != [] and tir>0:          # tant que les listes ne sont pas vides
    	while continuer:
    
    		coordonnes = input(" Saisissez un coordonées " )
    		coordonnes = int(coordonnes)
    		if coordonnes >50:
    			print(" Aucun coordonnes n'est supérieur à 50 ")
    		
    
    
    		for liste in bateau:
    			if liste == coordonnes:
    				bateau.remove(coordonnes)
    				print(" Touché, bien joué ")
    				tir += 1
    			if not bateau:
    				print(" Bateau coulé ")	
    	
    		
    		for list in r:
    			if list == coordonnes:
    				r.remove(coordonnes)
    				print(" Touché, bien joué ")
    				tir += 1
    			if not r:
    				print(" Bateau coulé")
    	
    		for lis in bateau_trois:
    			if lis == coordonnes:
    				bateau_trois.remove(coordonnes)
    				print(" Touché, bien joué ")
    				tir += 1
    			if not bateau_trois:
    				print(" Bateau coulé ")
    	
    		if coordonnes >12 and coordonnes <50:
    			print("A l'eau")
    			tir = tir -1
    		elif coordonnes <2:
    			print(" A l'eau ")
    			tir = tir -1
    		elif coordonnes ==7:
    			print(" A l'eau ")
    			tir = tir -1
    		elif coordonnes ==11:
    			print(" A l'eau ")
    			tir = tir -1
    		elif coordonnes ==9:
    			print("A l'eau")
    			tir = tir -1
    	
    		
    		if tir ==0:
    			print(" Vous ne pouvez plus tirer .... En effet, vous n'avez que " , tir , "tirs restants, c'est la fin de la partie" )
    			quitter = input(" Souhaitez vous refaire une partie ? ")
    			if quitter == "o" or quitter == "O":
    				print(" C'est parti ")
    				continuer = True
    			elif quitter != "o" or quitter != "O":
    				print(" au revoir ")
    				continuer = False
    				
    		elif not bateau and not r and not bateau_trois:
    			print("Vous avez détruit tous les bateaux, bien joué et vous terminez la bataille avec" , tir , " tirs disponibles!")
    			quitter = input(" Souhaitez vous refaire une partie ? ")
    			if quitter == "o" or quitter == "O":
    				print(" C'est parti ")
    				continuer = True
    			elif quitter != "o" or quitter != "O":
    				print(" au revoir ")
    				continuer = False
    			
    			
    			
    			
    		
    	
    		
    
    
    os.system("pause")
    

    Ici ca fonctionne mieux sauf que du coup, lorsque la nouvelle boucle commence, les listes ne se réinitialisent pas .... 

    et il faudra également , que lors de la nouvelle boucle, la variable tir, soit tjrs au minimum à 20. Plus seulement si au cours de la boucle précédente, le nombre de tir etait au dessus de 20, dans ce cas la, on garde le nombre de tir de la partie d'avant. Mais je ne vois pas trop comment faire :( 

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      31 juillet 2014 à 11:55:13

      Essaie de mettre des parenthèses autour des conditions si ton if est contient plusieurs prédicats:

      >>> a, b = 2, 8
      >>> if (a > b) or (a < b): #Revient à faire if a != b mais c'est juste pour l'exemple
      ...    print("a n'est pas égal à b")
      • Partager sur Facebook
      • Partager sur Twitter
        31 juillet 2014 à 12:01:54

        Sacrebleu ! Tu utilise os.pause,met plutot input()

        Pour ta liste tu fais juste : (c'est un exemple, tu généralisera aux autres) r = []

        Pour tir,en fin de boucle tu dois faire tir = 20 et pis ca recommence, etc . . . a chaque fois tu vas vider tes listes et mettre tir a 20 en fin de boucle pour que la prochaine ai des variables "propres".

        Pourrais tu aussi nous indiquer à quoi sert r et bateau et bateau trois, on dirais des coordonnées en 3D / 2D ca dépend de ce que tu utilises.

        Autant faire un dico dont les arguements sont des tuples pour stocker x et y de ton plateau.

        Ex: plateau_de_jeu_placement_des_bateaux = []

        plateau_de_jeu_placement_des_bateaux['1', 'a'] = "bateau" etc (je suis plus sur de l'initialisation d'un dico . . .)

        • Partager sur Facebook
        • Partager sur Twitter
        Python c'est aussi cool qu'une voiture mutlifonctions. - Allez jeter un oeil !
          1 août 2014 à 17:40:12

          Bonjour, 

          J'ai réglé, le problème que j'avais.

          Maintenant que ca marche correctement, j'aimerai faire passer mon programme en mode graphique mais je ne vois pas vraiment comment m'y prendre par exemple pour créer le plateau avec des cases, et lorsque l'utilisateur clique sur l'une d'elles, ca affiche " A l'eau " ou " Touché", comme je l'ai fait dans mon programme 

          J'ai lu la partie tkinter du tuto sur le python . 

          Merci d'avance :)

          • Partager sur Facebook
          • Partager sur Twitter
            1 août 2014 à 19:55:38

            Je vais essayer un truc mais ca risque d être long . . . Sinon tu peux faire du pygame qui je crois plus d'option (hélas je ne connais pas encore pygame . . .)
            • Partager sur Facebook
            • Partager sur Twitter
            Python c'est aussi cool qu'une voiture mutlifonctions. - Allez jeter un oeil !
              1 août 2014 à 20:30:25

              Merci Asyncore ;)

              Sinon d'autres, avis, conseils ?

              • Partager sur Facebook
              • Partager sur Twitter
                3 août 2014 à 10:18:15

                Oui, recommencer ton code depuis le début et le faire en orienté objet.
                • Partager sur Facebook
                • Partager sur Twitter
                  3 août 2014 à 12:22:39

                  Avant de le refaire en objet (pourquoi ?), ça serait intéressant de voir comment le découper proprement. Parce que là, 100 lignes d'un bloc, ça craint grave.

                  def faire_une_partie() :
                     print("et voila une partie")
                     
                  continuer = True  
                  
                  while continuer:
                    faire_une_partie()
                    quitter = raw_input(" Souhaitez vous refaire une partie ? ")
                    if quitter == "n" or quitter == "N":
                      print(" Au revoir ")
                      continuer = False
                  



                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 août 2014 à 13:08:06

                    Salut,

                    Avant de faire de la POO ou une interface graphique, tu pourrai t'amuser à améliorer ton petit code. Voici quelques exemples:

                    #Remplacer les lignes 53 à 67
                    
                    if coordonnee in range(13, 51) or coordonnee in [7, 9, 11] or coordonnee < 2:
                        print("A l'eau")
                        tir -= 1  #équivaut à tir = tir - 1
                    #Remplacer les lignes 70 à 88
                    
                    def nouvelle_partie():
                        partie = input("Souhaitez-vous refaire une partie?")
                    
                        #La méthode lower() met toutes les lettres en minuscules
                        return partie.lower() in ["o", "y", "oui", "yes"]  #On renvoie un booléen
                    
                    
                    if not bateau and not r and not bateau_trois:
                        print("Vous avez détruit tous les bateaux. Bien joué!!! Vous terminez la bataille avec {} tirs disponibles!".format(tir))
                    
                        #La variable continuer sera le booléen renvoyer par la fonction nouvelle_partie()
                        continuer = nouvelle_partie()
                    
                    elif not tir:
                        print(" Vous ne pouvez plus tirer. C'est la fin de la partie")
                    
                        continuer = nouvelle_partie()

                    Tu peux aussi améliorer les lignes 18 à 51 (je te laisse faire :lol:). Indices: La double boucle while n'est pas nécessaire. Seule la deuxième est à garder (celle avec le continuer). Évite d'utiliser le mot-clé list comme variable. Et comme tes 3 boucles for sont indépendantes, tu peux utiliser le même nom de variable de substitution (ici que tu appelle liste, list et lis). Autre chose concernant ce point, essaie d'utiliser des noms de variables logiques. Au lieu de liste, utilise plutôt indice ou position. Sinon, au lieu d'utiliser une boucle for pour comparer chaque position du bateau à ta coordonnée (ce qui est assez peu intuitif), tu peux faire l'inverse: comparer directement ta coordonnée aux positions:

                    #Si la coordonnée correspond à une position du bateau
                    if coordonnee in bateau:


                    Ce ne sont évidemment que des pistes à explorer

                    PS: ATTENTION: j'ai changé le nom de ta variable coordonne en coordonnee (c'est féminin et au singulier)

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Précepte: Le mieux est l'ennemi du bien
                      3 août 2014 à 14:40:53

                      C'est un peu comme ce code : (pas paufiné,l'interface graphique réagit pas et le choix des bateaus mèenent encore a rien) :

                      """ Bataille navale """
                      
                      from random  import *
                      from tkinter import *
                      
                      fenetre = Tk()
                      
                      r = [5, 6]
                      bateau = [2, 3, 4]
                      bateau_trois = [8, 10, 12]
                      continuer = True
                      tir = 20
                      
                      taille_fenetre_frame = Frame(fenetre, width = 760, height = 570, borderwidth = 0)
                      taille_fenetre_frame.pack(fill = BOTH)
                      err_coor = Label(taille_fenetre_frame, text = " Aucunes coordonnes n'est supérieur à 50 ! ")
                      touche = Label(taille_fenetre_frame, text = " Touché, bien joué ! ")
                      coule = Label(taille_fenetre_frame, text = " Bateau coulé ! ")
                      eau = Label(taille_fenetre_frame, text = " A l'eau ! ")
                      tir_nul_fin = Label(taille_fenetre_frame, text = " Vous ne pouvez plus tirer .... En effet, vous n'avez que {0} tirs restants, c'est la fin de la partie ! ".format(tir))
                      quitter_text = Label(taille_fenetre_frame, text = "Souhaitez-vous quitter ? Cliquez sur le bouton pour quitter.")
                      au_revoir = Label(taille_fenetre_frame, text = " Au revoir ! ")
                      bouton_quit = Button(taille_fenetre_frame, text = "Quitter", command = fenetre.quit)
                      var_texte = StringVar()
                      coordonnees_graph = Entry(taille_fenetre_frame, textvariable = var_texte, width = 30)
                      liste_bateau = Listbox(taille_fenetre_frame)
                      liste_bateau.pack(side = "left", fill = Y)
                      liste_bateau.insert(END, "Frégate")
                      liste_bateau.insert(END, "Bateau de pêcheur")
                      liste_bateau.insert(END, "Bateau de guerre")
                      liste_bateau.insert(END, "Autre bateau")
                      retour_de_liste = liste_bateau.curselection()#choix de bateau ici
                      
                      while (bateau, r, bateau_trois) != [] and tir > 0 and continuer: # tant que les listes ne sont pas vides
                      	coordonnes = int(input(" Saisissez une coordonée > "))
                      	coordonnees_graph.pack(side = "bottom", fill = X)
                      	if coordonnes > 50:
                      		print(" Aucunes coordonnes n'est supérieur à 50 ! ")
                      		err_coor.pack(side = "bottom", fill = X)
                      	#
                      	for liste in bateau:
                      		if liste == coordonnes:
                      			bateau.remove(coordonnes)
                      			print(" Touché, bien joué ! ")
                      			touche.pack(side = "bottom", fill = X)
                      			tir += 1
                      		if not bateau:
                      			print(" Bateau coulé ! ")
                      			coule.pack(side = "bottom", fill = X)
                      	#
                      	for list in r:
                      		if list == coordonnes:
                      			r.remove(coordonnes)
                      			print(" Touché, bien joué ! ")
                      			touche.pack(side = "bottom", fill = X)
                      			tir += 1
                      		if not r:
                      			print(" Bateau coulé ! ")
                      			coule.pack(side = "bottom", fill = X)
                      	#
                      	for lis in bateau_trois:
                      		if lis == coordonnes:
                      			bateau_trois.remove(coordonnes)
                      			print(" Touché, bien joué ! ")
                      			touche.pack(side = "bottom", fill = X)
                      			tir += 1
                      		if not bateau_trois:
                      			print(" Bateau coulé ! ")
                      			coule.pack(side = "bottom", fill = X)
                      	#
                      	if coordonnes > 12 and coordonnes < (50, 2)  or coordonnes == (7, 9, 11):
                      		print("A l'eau !")
                      		eau.pack(side = "bottom", fill = X)
                      		tir -= 1
                      	#
                      	print("gg", tir, "e", bateau , "g", r,  bateau_trois, "f")
                      	if tir == 0:
                      		print(" Vous ne pouvez plus tirer .... En effet, vous n'avez que {0} tirs restants, c'est la fin de la partie ! ".format(tir))
                      		tir_nul_fin.pack(side = "bottom", fill = X)
                      		quitter = input(" Souhaitez vous refaire une partie [O/N] ? ")
                      		quitter_text.pack(side = "bottom", fill = X)
                      		#ici le code change un peu pour le graphique je met un bouton
                      		bouton_quit.pack(side = "bottom", fill = X)
                      		if quitter.lower() == "o":
                      			print(" C'est parti ! ")
                      			continuer = True
                      			bateau = [2, 3, 4]
                      			r = [5, 6]
                      			bateau_trois = [8, 10, 12]
                      			tir = 20
                      		#
                      		elif quitter.lower() != "o":
                      			print(" Au revoir ! ")
                      			au_revoir.pack(side = "bottom", fill = X)
                      			continuer = False
                      	#
                      	elif not bateau and not r and not bateau_trois:
                      		print("Vous avez détruit tous les bateaux, bien joué et vous terminez la bataille avec {0} tirs disponibles !".format(tir))
                      		quitter = input(" Souhaitez vous refaire une partie [O/N] ? ")
                      		quitter_text.pack(side = "bottom", fill = X)
                      		#ici le code change un peu pour le graphique je met un bouton
                      		bouton_quit.pack(side = "bottom", fill = X)
                      		if quitter.lower() == "o":
                      			print(" C'est parti ")
                      			continuer = True
                      			bateau = [2, 3, 4]
                      			r = [5, 6]
                      			bateau_trois = [8, 10, 12]
                      		elif quitter.lower() != "o":
                      			print(" Au revoir ! ")
                      			au_revoir.pack(side = "bottom", fill = X)
                      			continuer = False
                      
                      fenetre.mainloop()
                      input()



                      • Partager sur Facebook
                      • Partager sur Twitter
                      Python c'est aussi cool qu'une voiture mutlifonctions. - Allez jeter un oeil !
                        3 août 2014 à 14:43:42

                        Decouper mon programme en fonction me permettra de faire plus facilement une interface graphique ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 août 2014 à 14:45:44

                          Je pense que oui, pour mieux te retrouver et comme je l'ai fait, il n'y a qu'une seule fois le champs 'a l'eau' qui est crée et je le réutilise.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Python c'est aussi cool qu'une voiture mutlifonctions. - Allez jeter un oeil !
                            3 août 2014 à 20:01:15

                            Ok ;)

                            Maintenant que j'ai mon code qui fonctionne comme je veux( j'ai retrecie car effectivement je pouvais faire bcp + court) j'ai vraiment rnvi de faire une interface graphique a partir de ce code

                            Connaissez vous des bons tutos sur tkinter hormis ce qui expliqué dans le tuto du site ? Car ce qui m'interesse maintenant c'est passer en interface graphique

                            A vrai dire je vois pas comment m'y prendre pour faire une sorte de plateau de jeu avec des cases ...

                             Faut il melanger le code tkinter avec mon programme qui gere le mecanisme du jeu ?

                            Merci a vous ;)

                            -
                            Edité par flyn29 3 août 2014 à 20:04:07

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              3 août 2014 à 22:37:40

                              Interface graphique, je pense que tu peux oublier pour l'instant... Pourquoi ?

                              C'est très simple, tu n'ai déjà pas organisé sans interface, alors avec interface, je te dis même pas le bordel.

                              Faut-il mélanger le code tkinter

                              Je dirais que non, il va falloir que t'imagines bien le contexte graphique pour bien préparer le contexte console, afin d'éviter trop de modifications dans la partie console.

                              Comme dis précédemment, découpage par fonction, avec le minimum de print, car faudra les virer pour la partie graphique, et surtout de l'organisation.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 août 2014 à 16:30:07

                                J'avais dit de le refaire en POO car c'est tellement plus simple de rajouter des features, de passer en interface graphique, ou bien simplement pour la lisibilité... Mais c'est vrai qu'il fait réfléchir un peu avant.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  8 août 2014 à 17:49:19

                                  Bonjour,

                                  J'ai avancé 

                                  J'ai réussi à faire un damier sous tkinter + ce qui va me servir à indiquer si le bateau a été touché ou non

                                  Mais je ne vois pas comment faire, pour placer des coordonnés sur le damier .

                                  Mon idée est de faire : 

                                             - que chaque case du damier ait un numéro ( 1,2,3,4 ... jusqu'a 49 ) , si l'utilisateur clique sur la case 1, et qu'il y a une partie du bateau, alors s'affiche un cercle rouge ( que j'ai crééé  ) sinon un rectangle gris ( que j'ai créé aussi ) 

                                  Je bloque à ce niveau, sachant que sur internet, il y a assez peu de cours sur tkinter :(

                                  merci d'avance

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    9 août 2014 à 13:48:00

                                    Ben le principe de tous les jeux 2D que tu feras (enfin presque) de plateau est de faire une liste de liste, ce qui est la représentation la plus simple d'un damier. Et pour accéder à chaque case il suffit de faire liste[x][y], ce qui, tu en conviendra, reste sans doute la méthode la plus efficace et lisible.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    boucle principale

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown