Skip to content
Advertisement

EXP system for adjusting instance attributes in Python (text-based RPG)

I have recently begun programming in Python and decided to start my journey by writing a text-based RPG. The issue that I have now stumbled upon is that I was trying to create an EXP-system to make the character’s stats dependent on their level, but it doesn’t seem to work the way I want it to. While I have achieved to change the character’s level based on their EXP, it does not seem to affect the other instance’s values (i.e. health, strenght etc.).

First, I defined the class “Player” which is a child class:

from termcolor import colored

class Player(Subject):
    def __init__(self, name, sex, health, power, accuracy, speed):
        super().__init__(name, sex, health, power, accuracy, speed)
        self.level = 0
        self.health = int(health + self.level * 30)
        self.power = int(power + self.level * 20)
        self.accuracy = float(accuracy + self.level * 0.005)
        self.speed = float(speed + self.level * 10)
        self.exp = 0

After that, I defined an instance method and created a list for the EXP required to reach a certain level. (the list is actually imported, but I am going to put it here):

    def player_level(self, exp):
        print("You receive", colored(f"{exp} EXP.", "green"))
        old_level = self.level
        self.exp = self.exp + exp
        self.level = len([x for x in levels if self.exp >= x])
        if self.level > old_level:
            print(colored(f"You are now LvL {self.level}!", "green"))
   
levels = [0, 50, 100, 200, 300, 400, 600, 850]

# let's assume I wanted to run the following
p = Player("Alpha", "male", 100, 40, 0.7, 100)
Player.level(p, 200)

The issue that now occurs is that I can say print(p.level) and it returns the correct value, but if I let it print any other attribute: print(p.health, p.power, p.accuracy, p.speed) , they remain exactly the same as defined at the beginning.

How could I fix this so that if e.g. p.level = 4, p.health would be 220?

Edit: I put self.level at the top and tried out different values. I does calculate the other attributes correctly, but I cannot change it with my method outside of the __init__.

Advertisement

Answer

Your class variables retain the value you initialized them with until you change them. You need to modify your player_level method to update the attributes on a change of level from their old values to new values.

It should look like this:

def player_level(self, exp):
    print("You receive", colored(f"{exp} EXP.", "green"))
    old_level = self.level
    self.exp = self.exp + exp
    self.level = len([x for x in levels if self.exp >= x])
    if self.level > old_level:
        self.health = int(self.health + self.level * 30)
        self.power = int(self.power + self.level * 20)
        self.accuracy = float(self.accuracy + self.level * 0.005)
        self.speed = float(self.speed + self.level * 10)
        print(colored(f"You are now LvL {self.level}!", "green"))

Additionally you could modify your method to print out the new values and verify they are as expected.

Finally you never call your player_level method. I would have expected code like

p = Player("Alpha", "male", 100, 40, 0.7, 100)
p.player_level(200)
User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement