Partage
  • Partager sur Facebook
  • Partager sur Twitter

type error 'str' object is not callable

    6 novembre 2023 à 21:11:15

    Bonjour, je découvre les class en python et il m'a été demandé d'en créer une. Mon programme fonctionnait jusqu'à ce que j'ajoute la def obstacle, car elle m'affiche un message d'erreur typeerror: str object is not callable. Pourtant ma def marche en dehors de ce programme. Je n'arrive pas à trouver et à résoudre mon erreur, est-ce que quelqu'un pourrait  m'aider svp ? :)

    Voici mon programme: 

    from random import*
    
    class Mariokart:
        '''Classe définissant un joueur caractérisé par :
            -ses points de vie
            -son personnage
            -la difficulté du jeu'''
    
        def __init__(self,perso,pv,dif):
            '''Constructeur de la classe Mariokart'''
            self.couleur = perso
            self.pv = pv
            self.obstacle = dif
    
        def pv(self):
            return pv
    
        def couleur(self,perso):
            color=0
            if perso == "Mario":
                self.couleur == "rouge"
                color = 1
            else:
                if perso == "Luigi":
                    self.couleur == "vert"
                    color = 2
                else:
                    if perso == "Peach":
                        self.couleur == "rose"
                        color = 3
                    else:
                        if perso == "Daisy":
                            self.couleur == "jaune"
                            color = 4
            return color
    
        def obstacle(self,dif):
            if dif=='Facile':
                danger = randint(0,10)
                if danger==10:
                    vitesse = 0
                    print(self.couleur,"a été ralenti par une marmotte ... ",self.couleur,"passe son tour !")
                else:
                    vitesse = 1
            if dif=='Moyen':
                danger = randint(0,5)
                if danger==5:
                    vitesse = 0
                    print(self.couleur,"a été ralenti par un calamar ... ",self.couleur,"passe son tour !")
                else:
                    vitesse = 1
            if dif=='Difficile':
                danger = randint(0,3)
                if danger==3:
                    vitesse = 0
                    print(self.couleur,"a été ralenti par une fleur ... ",self.couleur,"passe son tour !")
                else:
                    vitesse = 1
            return vitesse
    
        def SetPieges(self,pv):
            attaque=randint(1,3)
            if attaque==1:
                self.pv=self.pv-10
                print(self.couleur,"a lancé une banane.")
            else:
                if attaque==2:
                    self.pv=self.pv-20
                    print(self.couleur,"a lancé une carapace.")
                else:
                    if attaque==3:
                        self.pv=self.pv-30
                        print(self.couleur,"a lancé une bombe.")
            return self.pv
    
        def SetEsquive(self,att):
            touche=att
            champi=att+15
            esquive={0:touche,1:champi}
            defense=randint(0,1)
            if defense==0:
                if att>0:
                    print("Cette attaque a fonctionner !",self.couleur," a maintenant",att,"points de vie.")
                else:
                    print(self.couleur,"n'a plus de points de vie.")
            else:
                if defense==1:
                    if att>0:
                        print(self.couleur,"a évité l'attaque grâce à un champignon,",self.couleur," a maintenant",champi,"points de vie.")
                    else:
                        print(self.couleur,"n'a plus de points de vie.")
            return att
    
    
    #on choisit le niveau de difficulté
    difficulte = input("Choisissez le niveau de difficulté : facile, moyen, difficile; ")
    
    #liste des noms de personnages proposés :
    liste_nom=["Mario","Luigi","Peach","Daisy"]
    
    #on crée le joueur 1 :
    joueur1 = input("Choisissez un personnage : Mario, Luigi, Peach, Daisy ; ")
    if joueur1 in liste_nom :
        print('True')
    else :
        print('False')
    pv1=randint(50,100)
    print(joueur1,"a",pv1,"points de vie !")
    j1=Mariokart(joueur1,pv1,difficulte)
    
    #on crée l'ordinateur que l'on va afronter :
    joueur2 = input("Choisissez votre adversaire : Mario, Luigi, Peach, Daisy ; ")
    if joueur2 in liste_nom :
        print('True')
    else :
        print('False')
    pv2=randint(50,100)
    print("Votre adversaire",joueur2,"a",pv2,"points de vie.")
    j2=Mariokart(joueur2,pv2,difficulte)
    
    #le combat commence:
    print("La course peut commencer !")
    
    while pv1>0 or pv2>0:
        obstacleJ2 = j2.obstacle(difficulte)
        if obstacleJ2 == 1 : #si le joueur 2 ne reçoit pas d'obstacle
            attaqueJ2 = j2.SetPieges(pv1) #le joueur 2 choisi une attaque
            esquiveJ1 = j1.SetEsquive(attaqueJ2) #choix de la potentielle esquive du joueur 1
            pv1 = esquiveJ1 #on actualise le nombre de points de vie du  joueur 1 après l'attaque du joueur 2
            if pv1<0: #si le joueur 1 n'a plus de points de vie
                break #alors on arrete la boucle
        obstacleJ1 = j1.obstacle(difficulte)
        if obstacleJ1 == 1: #si le joueur 2 ne reçoit pas d'obstacle
            attaqueJ1 = j1.SetPieges(pv2) #le joueur 1 choisi une attaque
            esquiveJ2 = j2.SetEsquive(attaqueJ1) #choix de la potentielle esquive du joueur 2
            pv2 = esquiveJ2 #on actualise le nombre de points de vie du  joueur 2 après l'attaque du joueur 2
            if pv2<0 : #si le joueur 2 n'a plus de points de vie
                break #alors on arrete la boucle,
    
    
    if pv2<pv1: #si le joueur 2 a moins de points que le joueur 1
        print("Bravo,",joueur1,"a gagné !") #alors le joueur 1 a gagné
    else: #sinon
        print("Bravo,",joueur2,"a gagné !") #alors le joueur 2 a gagné

    merci d'avance 

    • Partager sur Facebook
    • Partager sur Twitter
      7 novembre 2023 à 9:57:39

      Dans l'__init__, vous avez créé l'attribut d'instance "obstacle" qui "écrase" l'attribut de classe de la méthode "obstacle"... 9a av essayer d'exécuter la chaine de caractère plutôt que la méthode.
      • Partager sur Facebook
      • Partager sur Twitter
        7 novembre 2023 à 10:15:17

        ça marche, merci beaucoup !! :))
        • Partager sur Facebook
        • Partager sur Twitter
          7 novembre 2023 à 14:00:24

          EmmaCrunelle a écrit:

          ça marche, merci beaucoup !! :))

          Bonjour,

          Sujet résolu

          Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

          • Partager sur Facebook
          • Partager sur Twitter

          type error 'str' object is not callable

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown