1
class Berserker:
    def __init__(self, player_name):
        self.player_name=player_name
        self.char='berserker'
        self.ad=14
        self.crit=0.2
        self.evas=0.2
        self.deff=4
        self.hp=200
        self.mp=100
        self.hpreg=2
        self.mpreg=5

    def speak(self):
        print(f"""
                My name is {self.player_name}
                I'm {self.char}
                Myy stats are:
                Attack damage: {self.ad}
                Critical chance: {self.crit}
                Evasion: {self.evas}
                Deffense: {self.deff}
                Health: {self.hp}
                Health regen:{self.hpreg}
                Energy: {self.mp}
                Energy regen: {self.mpreg}
                """)

class PlayerCreation:
    def __init__(self):
        self.player_name = input('Enter your character name: ')
        self.char_index = input("""Choose your character:
                Press 1 for: Berserker
                """)
        self.create_player()

    def create_player(self):
        if self.char_index == 1:
            self.player = Berserker(self.player_name)

    def show(self):
        self.player.speak()


game=PlayerCreation()
game.show()
Enter your character name: asd
Choose your character:
                Press 1 for: Berserker
                1
Traceback (most recent call last):
  File "C:/Users/kebabas/PycharmProjects/Fighter/Player2.py", line 47, in <module>
    game.show()
  File "C:/Users/kebabas/PycharmProjects/Fighter/Player2.py", line 43, in show
    self.player.speak()
AttributeError: 'PlayerCreation' object has no attribute 'player'

Process finished with exit code 1
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Lukas
  • 11
  • 2
  • 6
    `input()` returns a string. You need to convert it to an `int()` before calling `self.create_player()`. – Craig Jul 21 '19 at 14:18
  • 2
    As a hint, in `create_player()`, you might want to `print(type(self.char_index))` and `print(type(1))`. – Nelewout Jul 21 '19 at 14:19
  • 3
    Or use a string in the if statement: `if self.char_index == "1":` – Daniel Roseman Jul 21 '19 at 14:19
  • omg thank you all, it was input = str, YESSS finally – Lukas Jul 21 '19 at 14:24
  • Possible duplicate of [How can I read inputs as numbers?](https://stackoverflow.com/questions/20449427/how-can-i-read-inputs-as-numbers) – wwii Jul 21 '19 at 14:27
  • 1
    Consiider [Can I answer my own question?](https://stackoverflow.com/help/self-answer) or delting the question or voting for the duplicate if you feel it is applicable. – wwii Jul 21 '19 at 14:54
  • When you create a variable or attribute in an `if`, use an `else` to set the same thing. – hpaulj Jul 21 '19 at 15:04

1 Answers1

0

The problem was you were taking string input but matching with an integer. Nevertheless, It's always a great idea to check an attribute before calling if it's initialized in a conditional statement.

class Berserker:
    def __init__(self, player_name):
        self.player_name=player_name
        self.char='berserker'
        self.ad=14
        self.crit=0.2
        self.evas=0.2
        self.deff=4
        self.hp=200
        self.mp=100
        self.hpreg=2
        self.mpreg=5

    def speak(self):
        print(f"""
                My name is {self.player_name}
                I'm {self.char}
                Myy stats are:
                Attack damage: {self.ad}
                Critical chance: {self.crit}
                Evasion: {self.evas}
                Deffense: {self.deff}
                Health: {self.hp}
                Health regen:{self.hpreg}
                Energy: {self.mp}
                Energy regen: {self.mpreg}
                """)

class PlayerCreation:
    def __init__(self):
        self.player_name = input('Enter your character name: ')
        self.char_index = input("""Choose your character:
                Press 1 for: Berserker
                """)
        self.create_player()

    def create_player(self):
        print(type(self.char_index))
        if int(self.char_index) == 1:
            self.player = Berserker(self.player_name)

    def show(self):
        if hasattr(self, 'player'):
            self.player.speak()


game=PlayerCreation()
game.show()
Anurag
  • 482
  • 6
  • 23