Python Forum
Help with Classes and dictionaries
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Help with Classes and dictionaries
#1
Hello, I'm am trying to convert my old game engine into a newer version that uses classes instead of just dictionaries.

My goal is to add similar key values together from two different classes in order to modify stats of the player.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class player:
    def __init__(self, name, level, xp, nextlvlxp, stats, inventory):
        self.name = ''
        self.level = 1
        self.xp = 0
        self.nextlvlxp = 25
        self.stats = {
            'str': [],
            'dex': [],
            'con': [],
            'int': [],
            'wis': [],
            'cha': [],
            'modstr': [],
            'moddex': [],
            'modcon': [],
            'modint': [],
            'modwis': [],
            'modcha': []
        }
        self.combat_stats = {
            'totalhp': [],
            'currenthp':[],
            'totalmp': [],
            'currentmp': [],
            'baseatk': [],
            'attack': [],
            'speed': [],
            'perception':[]
             
        }
        self.noncombat_stats = {
            'evasion': [],
        }
        self.inventory = {}
 
 
class Item():
    def __init__(self, name, description, stats, value):
        self.name = name
        self.description = description
        self.stats = {}
        self.value = value
class Weapon(Item):
    def __init__(self, name, description, stats, value):
        self.stats = stats
        super().__init__(name, description, value)
  
    def __str__(self):
        return "{}\n=====\n{}\nValue: {}\nStats: {}".format(self.name, self.description, self.value, self.stats)
  
class Sword(Weapon):
    def __init__(self):
        super().__init__(name="Sword",
                         description="A common shortsword",
                         stats = {
                             'str': 2,
                             'dex': 1
                         },
                         value = 10)
Example:items 'sword' 'str' + player 'str' = player 'modstr'

I want to be able to add those together and also the next values for dex, I want to do this in a way that is nonrepetitive. I'm not really sure where to begin, I just barely learned how classes to write Classes today. Is there any way to go through the dictionary and add values together that have the same key?
Reply
#2
1
2
3
4
5
6
a = {1: 2, 3: 4, 5: 6}
b = {1: 8, 3: 2, 7: 8}
 
for key in a:
    if key in b:
        a[key] += b[key]
That's basically what you would do, however I'm not sure in your case, since your default attributes are empty lists.
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#3
Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
class Pool:
    def __init__(self, value):
        self.value = value
        self.max_value = value
 
class Stats:
    def __init__(self, strength=0, dexterity=0, constitution=0, intelligence=0, wisdom=0, charisma=0):
        self.strength = strength
        self.dexterity = dexterity
        self.constitution = constitution
        self.intelligence = intelligence
        self.wisdom = wisdom
        self.charisma = charisma
 
    def __add__(self, stats):
        return Stats(
            self.strength + stats.strength,
            self.dexterity + stats.dexterity,
            self.constitution + stats.constitution,
            self.intelligence + stats.intelligence,
            self.wisdom + stats.wisdom,
            self.charisma + stats.charisma
        )
 
    def copy(self):
        return Stats(
            self.strength,
            self.dexterity,
            self.constitution,
            self.intelligence,
            self.wisdom,
            self.charisma
        )
 
    def __repr__(self):
        return str(vars(self))
 
class Equipment:
    def __init__(self):
        self.weapon = Weapon('None', 'None', 0, Stats())
        self.chest = Weapon('None', 'None', 0, Stats())
        self.hands = Weapon('None', 'None', 0, Stats())
        self.head = Weapon('None', 'None', 0, Stats())
        self.legs = Weapon('None', 'None', 0, Stats())
 
    def __repr__(self):
        return str(vars(self))
 
class Player:
    def __init__(self, name, next_xp, stats, inventory):
        self.xp = 0
        self.name = name
        self.stats = stats
        self.next_xp = next_xp
        self.inventory = inventory
        self.equipment = Equipment()
 
    def get_stats(self):
        stats = self.stats.copy()
        elist = vars(self.equipment)
        for v in elist:
            stats += elist[v].stats
 
        return stats
 
class Item:
    def __init__(self, name, description, value):
        self.name = name
        self.description = description
        self.value = value
 
class Weapon(Item):
    def __init__(self, name, description, value, stats):
        Item.__init__(self, name, description, value)
        self.stats = stats
 
    def __repr__(self):
        return str(vars(self))
 
def main():
    weapons = {}
    weapons['sword'] = Weapon('sword', 'common sword', 10, Stats(2, 1))
    weapons['intelligence sword'] = Weapon('intelligence sword', 'sword of intelligence', 10, Stats(2, 1, intelligence=1))
 
    player = Player('Me', 25, Stats(5, 4, 6, 3, 3, 4), {})
    print(player.get_stats())
    player.equipment.weapon = weapons['sword']
    print(player.get_stats())
    player.equipment.weapon = weapons['intelligence sword']
    print(player.get_stats())
 
main()
99 percent of computer problems exists between chair and keyboard.
Reply
#4
(Jul-30-2019, 06:37 PM)Windspar Wrote: Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
class Pool:
    def __init__(self, value):
        self.value = value
        self.max_value = value
 
class Stats:
    def __init__(self, strength=0, dexterity=0, constitution=0, intelligence=0, wisdom=0, charisma=0):
        self.strength = strength
        self.dexterity = dexterity
        self.constitution = constitution
        self.intelligence = intelligence
        self.wisdom = wisdom
        self.charisma = charisma
 
    def __add__(self, stats):
        return Stats(
            self.strength + stats.strength,
            self.dexterity + stats.dexterity,
            self.constitution + stats.constitution,
            self.intelligence + stats.intelligence,
            self.wisdom + stats.wisdom,
            self.charisma + stats.charisma
        )
 
    def copy(self):
        return Stats(
            self.strength,
            self.dexterity,
            self.constitution,
            self.intelligence,
            self.wisdom,
            self.charisma
        )
 
    def __repr__(self):
        return str(vars(self))
 
class Equipment:
    def __init__(self):
        self.weapon = Weapon('None', 'None', 0, Stats())
        self.chest = Weapon('None', 'None', 0, Stats())
        self.hands = Weapon('None', 'None', 0, Stats())
        self.head = Weapon('None', 'None', 0, Stats())
        self.legs = Weapon('None', 'None', 0, Stats())
 
    def __repr__(self):
        return str(vars(self))
 
class Player:
    def __init__(self, name, next_xp, stats, inventory):
        self.xp = 0
        self.name = name
        self.stats = stats
        self.next_xp = next_xp
        self.inventory = inventory
        self.equipment = Equipment()
 
    def get_stats(self):
        stats = self.stats.copy()
        elist = vars(self.equipment)
        for v in elist:
            stats += elist[v].stats
 
        return stats
 
class Item:
    def __init__(self, name, description, value):
        self.name = name
        self.description = description
        self.value = value
 
class Weapon(Item):
    def __init__(self, name, description, value, stats):
        Item.__init__(self, name, description, value)
        self.stats = stats
 
    def __repr__(self):
        return str(vars(self))
 
def main():
    weapons = {}
    weapons['sword'] = Weapon('sword', 'common sword', 10, Stats(2, 1))
    weapons['intelligence sword'] = Weapon('intelligence sword', 'sword of intelligence', 10, Stats(2, 1, intelligence=1))
 
    player = Player('Me', 25, Stats(5, 4, 6, 3, 3, 4), {})
    print(player.get_stats())
    player.equipment.weapon = weapons['sword']
    print(player.get_stats())
    player.equipment.weapon = weapons['intelligence sword']
    print(player.get_stats())
 
main()

Wow, this is exactly what I needed, and it also shows me how much more I have to learn just to become a beginner at this, lol. Time to study this and break it down so I can maybe figure out how classes work and how i can learn to manipulate them, too.
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020