[Python] pas de réorientation.
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

[Python] pas de réorientation.



  1. #1
    Scryper

    [Python] pas de réorientation.


    ------

    Bonjour,

    Je code un petit jeu (canons qui se tirent dessus). Il y a possibilité de jouer contre un canon controlé par l'ordi. Pour éviter des combats statiques, les canons sont replacés après leurs tirs. Donc l'IA doit se réorienter vers la nouvelle position du canon. Le problème c'est que la réorientation ne se fait pas.
    Pour les classes utilisées : Canon (création d'un canon controlé par le joueur, et classe mère de Ordi), et Ordi (classe gérant les canons gérés par l'ordi).
    Voici le code concerné (j'ai retiré l'inutile) :
    Code:
    class Canon :
        """Création du canon et de la fonctionnalité d'ajustement de la buse."""
        # Création du canon
        def __init__(self, canv, x, y, fen, coul_buse = 'Black', coul_corps = 'Black', nom = "") :
            # code
    
        def orientation(self, angle) :
            """Orientation de la buse du canon pour choisir l'angle de tir."""
            self.ang = float(angle) * pi / 180   # Conversion de la chaine de caractère 'angle' en radians
            self.x2 = self.x1 + self.l_bu * cos(self.ang)
            self.y2 = self.y1 + self.l_bu * sin(self.ang)
            self.canv.coords(self.buse, self.x1, self.y1, self.x2, self.y2)  # buse est la partie orientable du canon
            # x1, y1 => base de la buse
            # x2, y2 => bout de la buse
    
        def verifier(self) :
            # code
    
        def feu(self) :
            # code
            self.replacer()
    
        def modifier_couleur(self, elt_a_modifier, nvle_couleur = "") :
            # code
    
        def anim_explosion(self, intervalle = 50, _previous = None) :
            # code
    
        def replacer(self) :
            """Après chaque tir, le canon est déplacé."""
            nvl_pos_x_canon, nvl_pos_y_canon = randint(50, 450), randint(50, 450)
            # code
            self.x1 = nvl_pos_x_canon
            self.y1 = nvl_pos_y_canon
            dict_cibles[self.nom] = (self.x1, self.y1)  # MàJ de la position du canon dans le dictionnaire
            self.orientation(0)
            reorientation_ordi() # les canons controlés par l'ordi sont réorientés
    
    class Ordi(Canon) :
        """Création d'un adversaire controlé par l'ordi."""
        def __init__(self, canvas, x, y, matrice, difficulte, coul_buse_ordi = 'Black', coul_corps_ordi = 'Black', nom = "") :
            # code
            self.angle_tir()  # orientation dès la création
    
        def angle_tir(self) :
            """On choisit l'angle a adopter en fonction de la cible choisie.
            Etape 1 : on choisit une cible.
            Etape 2 : on détermine si la cible se trouve plus haut ou plus bas que le canon controlé par l'ordi.
            Etape 3 : calcul de l'angle.
            Etape 4 : ajustements.
            Etape 5 : orientation du canon."""
            x_cible_choisie, y_cible_choisie = self.choisir_cible()  # Etape 1
            if self.y1 < y_cible_choisie :  # Etape 2
                angle = atan((y_cible_choisie - self.y1) / (x_cible_choisie - self.x1)) * (180 / pi)   # Etape 3
                if self.x1 > x_cible_choisie :
                    angle -= 180   # Etape 4
            else :
                angle = atan((x_cible_choisie - self.x1) / (y_cible_choisie - self.y1)) * (180 / pi)   # Etape 3
                angle = 360 - abs(angle)   # Etape 4
                if self.x1 > x_cible_choisie :
                    angle -= 90  # Etape 4
            self.orientation(angle)   # Etape 5
    
        def choisir_cible(self) :
            """Choisi aléatoirement la cible sur laquelle va tirer l'ordi."""
            if nb_canons - 1 != 0 :  # nb_canons est une variable globale contenant le nombre de canons joués par le/les utilisateurs
                pos_cible = randint(0, nb_canons - 1)
            else :
                pos_cible = 0
            tuple_pos = dict_cibles[pos_cible] # récupération du tuple contenant les positions x et y de la cible
            # Le dictionnaire contient toutes les cibles possibles (canons créés par l'ordi + leurs positions) Ex : {"Billy" : (x, y)}
            x_cible = tuple_pos[0] # récupération de la position x
            y_cible = tuple_pos[1] # récupération de la position y
            return x_cible, y_cible
    
    def reorientation_ordi() :  # méthode globale pour une interaction Canon-Ordi facilitée
        for elt in liste_adversaires : # liste contenant tout les adversaires créés
            elt.angle_tir()
    N'hésitez pas si vous avez besoin d'infos complémentaires.
    Merci.
    P.S : si vous voyez des problèmes concernant l'héritage, merci de le faire remarquer. Je ne le maîtrise pas encore totalement.

    -----

  2. #2
    Scryper

    Re : [Python] pas de réorientation.

    Un petit up.
    Merci.

  3. #3
    polo974

    Re : [Python] pas de réorientation.

    ajoute des traces et regarde où tu perds l'info...
    Jusqu'ici tout va bien...

  4. #4
    Scryper

    Re : [Python] pas de réorientation.

    J'ai déjà mis des tests (avec des print()). J'en ai mis avant l'appel de la fonction, après l'appel de la fonction et dans la fonction elle même. Et chacun des tests se sont révélés être bons (je les ai tous eu en output).
    C'est pour ça que j'ai besoin de votre aide.

  5. A voir en vidéo sur Futura
  6. #5
    polo974

    Re : [Python] pas de réorientation.

    1. quelle fonction ? toutes les fonctions ?
    2. qu'as-tu tracé ? il faut bien vérifier si c'est cohérent au fil de l'appel des fonctions.
    (et pourquoi passer en degrés pour les angles...)
    Dernière modification par polo974 ; 21/11/2017 à 11h50.
    Jusqu'ici tout va bien...

  7. #6
    Scryper

    Re : [Python] pas de réorientation.

    Lorsque j'avais une variable à vérifier je faisais un print de cette variable sinon je mettais un print("test n°x")lorsque je n'avais pas de variables a vérifier.
    J'ai mis un print pour vérifier que les coordonnées du canon ont bien été mises à jour dans le dictionnaire, j'en ai mis avant l'appel de reorientation_ordi(), après l'appel de reorientation_ordi(). Ensuite, dans reorientation_ordi(), j'en ai mis un dans la boucle. Dans angle_tir(), j'en ai mis a chaque étape. Et dans orienter() j'en ai mis après la conversion de l'angle et après les calculs de x2 et y2. Et ce que je ne comprends pas c'est que tout était correct...

    Je passe en degré car dans orienter() je convertis l'angle en radian (cette fonction est aussi utilisée quand on oriente un canon de joueur avec un scale, qui a ses graduations en degrés) et que si je fais 2 fois un angle * pi / 180 eh bien l'angle sera incorrect.
    Dernière modification par Scryper ; 21/11/2017 à 19h53.

  8. #7
    polo974

    Re : [Python] pas de réorientation.

    à te lire, il semble que les données soient bonnes, mais que l'affichage n'est pas fait comme tu le souhaites, sauf que là, on ne sait pas comment tu affiches...

    si c'est ça, il faut chercher plus loin (derrière self.canv.coords(...) sans doute.
    Jusqu'ici tout va bien...

  9. #8
    Scryper

    Re : [Python] pas de réorientation.

    Et on a accès à des modules pour tester ça ? Du genre unittest ?
    Sinon, quel genre de technique je dois utiliser ?

Discussions similaires

  1. [Python] subprocess, lancer un autre programme avec python
    Par Loupsio dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 30/11/2016, 18h56
  2. en python le multi tache n'est pas possible alors pourquoi les threads existent sur python?
    Par docEmmettBrown dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 10/06/2015, 15h47
  3. Boa ou Python
    Par Nicolas12 dans le forum Identification des espèces animales ou végétales
    Réponses: 4
    Dernier message: 13/09/2012, 12h10
  4. Boa ? Python ?
    Par Nicolas12 dans le forum Identification des espèces animales ou végétales
    Réponses: 5
    Dernier message: 19/11/2011, 17h00
  5. Orientation, Réorientation, Re-réorientation... et Architecture
    Par invite78eac30a dans le forum Orientation après le BAC
    Réponses: 0
    Dernier message: 26/05/2007, 15h24