Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème projet bac ISN canonball

    10 mai 2013 à 12:31:47

    bonjour, j'ai un gros problème, je dois faire un programme en langage python pour l'oral de bac en ISN, j'ai commencé a programmer en python (3.3) et je me heurte désormais à 2 problèmes. mon projet est de faire un canon qui tire sur une cible, si la cible n'est pas toucher, elle réapparaît dans un autre endroit de ma fenêtre et je perds un point, sinon, si la cible est détruite, je gagne un point et la cible réapparaît quand même à un autre endroit. cependant c'est la qu'arrive mon problème, je n'ai absolument aucune idée de comment faire pour détruire la cible et la faire réapparaître  je vous demande donc, si vous avez un peu de temps à m'accorder, un peu d'aide, et surtout des explication les plus clairs possible car je suis débutant, merci.

    ci joint un lien pour télécharger le programme sur drop box : https://www.dropbox.com/sh/7t1p1oc42lww7yt/jgtYxgPc1A

    • Partager sur Facebook
    • Partager sur Twitter
      10 mai 2013 à 21:55:04

      Salut,

      Il faut faire quelque chose dans ce genre :

          def animer_obus(self):
              "animation de l'obus (trajectoire balistique)"
              if self.anim:
                  self.boss.move(self.obus, int(self.vx), int(self.vy))
                  c = tuple(self.boss.coords(self.obus))     # coord. résultantes
                  xo, yo = c[0] +3, c[1] +3   # coord. du centre de l'obus
                  if yo > self.yMax or xo > self.xMax:
                      self.anim =False        # arrêter l'animation
                  self.vy += .5
      #            if  xo > 100 and xo<171 and yo>250 and yo<321 :
      #                ciblex="aleatoire"
      #                cibley="aleatoire"
                  if not self.anim:
                      ciblex = random.randint(25,475)
                      cibley = random.randint(25,350)
                      self.boss.coords(item,ciblex,cibley)
                  self.boss.after(30, self.animer_obus)
      



      • Partager sur Facebook
      • Partager sur Twitter
        11 mai 2013 à 16:43:26

        merci beaucoup de me répondre, j'aimerais quelque explications un peu plus détaillés, je suis vraiment débutant et durant l'année je n'ai pas vraiment eu de cour de python, j'ai donc un peu de mal a tout comprendre, je ne veux surtout pas que l'on me donne la réponse, ça ne servirait à rien car ce n'est pas comme cela qu'on apprends, merci.
        • Partager sur Facebook
        • Partager sur Twitter
          11 mai 2013 à 18:41:05

          Salut,

          Dans le programme principal, le fichier image 'cible1.gif' est intégré dans la canvas can. On y accède par la variable globale item.

          Le déplacement de l'obus est simulé par la méthode animer_obus de la classe Canon. Elle s'appelle de manière récursive. L'attribut self.anim est évalué à chaque appel, il permet d'arrêter la simulation.

          Après un tir, dans tous les cas, il faut déplacer la cible (qu'elle ait été touchée ou pas). Le plus simple est donc de modifier les coordonnées de l'image en fin de déplacement, c'est-à-dire lorsque self.anim vaut False.

          J'utilise la fonction randint du module random pour tirer au hasard les nouvelles coordonnées ciblex et cibley. ciblex pouvant prendre une valeur entre 25 et 475, et cibley entre 25 et 350.

          La classe Canon a un attribut boss qui permet d'accéder à la référence du canvas. La référence de l'image étant donnée par la variable globale item, on peut alors changer ses coordonnées dans le canvas à l'aide de la méthode de classe coords.

          -
          Edité par azertymen 11 mai 2013 à 19:19:06

          • Partager sur Facebook
          • Partager sur Twitter
            16 mai 2013 à 14:27:58

            bonjour, j'ai bien compris le programme, seulement la cible ne se détruit pas lorsqu'elle est touché par le canon, mon oral d'ISN étant dans 1 semaines, je ne me vois pas venir avec un programme qui ne fonctionne pas entièrement, même si grâce a vous c'est déjà plutôt bien, si vous pouviez me donner un dernier petit coup de pouce, merci beaucoup.
            • Partager sur Facebook
            • Partager sur Twitter
              16 mai 2013 à 14:29:11

              from tkinter import*
              from math import pi, sin, cos
              import random
              ciblex=100
              cibley=250
              
              class Canon(object):
              
                  def __init__(self, boss, x, y, angle=50):
                      self.boss = boss            # référence du canevas
                      self.x1, self.y1 = x, y     # axe de rotation du canon
                      # dessiner la buse du canon, à l'horizontale pour commencer :
                      self.lbu = 50               # longueur de la buse
                      self.x2, self.y2 = x + self.lbu, y
                      self.buse = boss.create_line(self.x1, self.y1, self.x2, self.y2,
                                                   width =25)
                      # dessiner ensuite le corps du canon par-dessus :
                      r = 25                      # rayon du cercle
                      boss.create_oval(x-r, y-r, x+r, y+r, fill='blue', width =3)
                      # dessiner un obus (réduit à un simple point, avant animation) :
                      self.obus =boss.create_oval(x, y, x, y, fill='blue', width=5)
                      self.anim =False            # interrupteur d'animation
                      # retrouver la largeur et la hauteur du canevas :
                      self.xMax =int(boss.cget('width'))
                      self.yMax =int(boss.cget('height'))
              
              
              
                  def orienter(self, angle):
                      "choisir l'angle de tir du canon"
                      # rem : le paramètre <angle> est reçu en tant que chaîne de car.
                      # il faut le traduire en nombre réel, puis convertir en radians :
                      self.angle = float(angle)*4*pi/360
                      self.x2 = self.x1 + self.lbu*cos(self.angle)
                      self.y2 = self.y1 - self.lbu*sin(self.angle)
                      self.boss.coords(self.buse, self.x1, self.y1, self.x2, self.y2)
              
                  def feu(self):
                      "déclencher le tir d'un obus"
                      if not self.anim:
                          self.anim =True
                          # position de départ de l'obus (c'est la bouche du canon) :
                          self.boss.coords(self.obus, self.x2 -3, self.y2 -3,
                                                      self.x2 +3, self.y2 +3)
                          v =25              # vitesse initiale
                          # composantes verticale et horizontale de cette vitesse :
                          self.vy = -v *sin(self.angle)
                          self.vx = v *cos(self.angle)
                          self.animer_obus()
              
              
                  def animer_obus(self):
                      "animation de l'obus (trajectoire balistique)"
                      if self.anim:
                          self.boss.move(self.obus, int(self.vx), int(self.vy))
                          c = tuple(self.boss.coords(self.obus))     # coord. résultantes
                          xo, yo = c[0] +3, c[1] +3   # coord. du centre de l'obus
                          if yo > self.yMax or xo > self.xMax or yo=cibley or xo=ciblex:
                              self.anim =False        # arrêter l'animation
                          self.vy += .5
              #            if  xo > 100 and xo<171 and yo>250 and yo<321 :
              #                ciblex="aleatoire"
              #                cibley="aleatoire"
                          if not self.anim:
                              ciblex = random.randint(25,475)
                              cibley = random.randint(25,350)
                              self.boss.coords(item,ciblex,cibley)
                          self.boss.after(30, self.animer_obus)
              
                  def test_obstacle(self, xo, yo):
                      "évaluer si l'obus a atteint une cible ou les limites du jeu"
                      if yo >self.yMax or xo <0 or xo >self.xMax:
                          self.anim =False
                          return
              
              
              
              if __name__ =='__main__' :
              
              
                  # Code pour tester sommairement la classe Canon :
                  f = Tk()
                  can = Canvas(f,width =500, height =500, bg ='white')
                  can.pack(padx =50, pady =50)
                  c1 = Canon(can, 250, 450)
              
                  s1 =Scale(f, label='hausse', from_=90, to=0, command=c1.orienter)
                  s1.pack(side=LEFT, pady =5, padx =20)
                  s1.set(45)                          # angle de tir initial
              
                  Button(f, text='Feu !', command =c1.feu).pack(side=LEFT)
                  bouton=Button(f, text="quitter", command=f.destroy) # Bouton qui détruit la fenêtre
                  bouton.pack()
              
                  photo = PhotoImage(file ='cible1.gif')
                  item = can.create_image(ciblex, cibley, image =photo)
              
              
              
                  f.mainloop()
              
              • Partager sur Facebook
              • Partager sur Twitter

              problème projet bac ISN canonball

              × 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