#100DaysOfCode in Python Transcripts
Chapter: Days 13-15: Text-based games (and classes)
Lecture: Demo: Building our classes
0:00 Okay, so here's our general program.
0:02 Let's put that aside for a minute,
0:03 and go work on the various creatures that we're going to model.
0:06 And I'll call this actors to kind of say,
0:08 here's where I'm going to put a creature,
0:09 the wizard, and so on.
0:11 So what we need to do is create what we talked about,
0:13 something called a class,
0:14 and this is going to be the blueprint of a creature.
0:17 So, the way you create a class in Python
0:19 is really straightforward. You say class, and then you say the name of it.
0:23 Okay, we're going to model everything at the lowest level
0:26 as a creature, and use a colon to define the block
0:29 that is the class, like you do
0:31 all the various blocks in Python.
0:33 Now, there's a couple of things which we can do
0:36 to get started, but, commonly, you want to store
0:39 pieces of data and behaviors with the creature.
0:42 So, for the data part we're going to use
0:44 what's called an initializer.
0:45 So we'll say def init, and there's this dunder init,
0:48 in fact if I say double underscore,
0:51 these methods are called dunder because it's
0:52 double underscores on both ends.
0:55 These are all part of what makes up classes,
0:58 and they all have special meaning.
0:59 The one that we care about is this init.
1:01 This is very common.
1:03 So down here, we might want to have a name for it.
1:06 Equals, let's call it, toad, and it might have a level.
1:10 And the level of the toad is 1, or something like that.
1:13 Now, this is not really helpful
1:15 because every creature is going to be a toad of level one.
1:19 So what we can do is, we can when we create them say,
1:21 this particular creature is a tiger,
1:23 this creature is a bat, and so on,
1:25 and so we could pass in the name here,
1:27 and we could pass in the level.
1:29 So we're going to go like this.
1:31 So, here we've defined this blueprint.
1:32 What is a creature?
1:33 A creature is anything that can be created
1:36 and given explicitly a name and a level.
1:38 We could go farther and give those types,
1:40 as you can in Python 3,
1:42 but we're not going to do that right now.
1:44 The other thing, this is the data part we have so far,
1:47 the other thing is going to be some kind of
1:51 behaviors around it.
1:52 So, a creature, can, let's suppose that one creature
1:56 can be defensive against some kind of attack.
2:00 So we could say it like this.
2:02 So the creature's going to roll a defensive roll.
2:05 And now, you might want this to be
2:07 somewhat based on the creature's level.
2:10 So let's create some sort of randomness.
2:13 Let's say roll equals,
2:15 well I'll go over here and we'll say random.
2:16 Now this comes from the standard library
2:18 so we have to import it here, put like that at the top.
2:22 Then we can say randint(), and you give a lower bound,
2:26 of let's say 1 to 12, and if you want to know whether this
2:31 goes from 1 to 12, 1 to 11, and things like that,
2:34 we can say view quick documentation.
2:37 And what does it say?
2:39 It returns a number such that A,
2:41 the number that comes back is
2:42 less than or equal to the upper and lower bound.
2:45 Perfect. So this is our, let's say, 12-sided die.
2:48 And then we'll return roll times self.level.
2:52 Anytime you want to refer to your own items,
2:55 your own values, you have to say self dot.
2:58 So to get back to this, we say self.level.
3:02 Alright, so this is going to be some kind of defense here.
3:05 Now let's go and create our various creatures in the game.
3:09 There's this little to do here.
3:11 We had a couple of things, we had a bat, we had a toad,
3:14 we had a tiger, we had a wizard, an evil one, and so on.
3:18 So we'll type creature and of course
3:20 we have to import that at the top here, just like any type.
3:25 We go like this and if I ask Python to
3:28 show me the parameters, you'll see it takes a name.
3:30 So let's call this a bat, and this is a level 5 bat.
3:34 I think we had a toad which is a level 1.
3:38 And we had a tiger which was level 12, let's say.
3:41 And we had a dragon, which is a level 50.
3:46 And for now, I'm going to put it this way,
3:48 evil wizard was a 1000.
3:51 I think that's what it said.
3:53 Okay, so if we just run this and
3:56 we could print out our creatures,
3:59 we need to make sure that we're running the main.
4:02 Remember, up here, at the very top, we wrote this,
4:04 but at the bottom we have to do our little main.
4:07 Like this, to say are we running this script as a program?
4:10 Or are we just importing it?
4:12 If this is true, we're running it
4:13 as a program, then we want to invoke our main method.
4:16 So let's go over here and say run,
4:19 and there's some stuff that
4:20 went a little bit crazy somewhere along the way
4:23 because we didn't finish it.
4:25 But here, you'll see that we've created
4:27 a creature object here, and a
4:28 creature object there, and so on.
4:32 Our little creature part worked,
4:33 but then the code that we sort of commented out below,
4:36 isn't quite done.
4:38 So this is close, but remember I said
4:40 you might want to have special features.
4:42 So let's just focus on the dragon for a minute.
4:45 You might want to have special features that
4:46 take into account the scaliness, the fire-breathingness,
4:49 have a different mechanism for defense, and so on.
4:52 So let's say we're going to have a class called dragon.
4:55 And the dragon also is going to have a defensive roll,
4:58 like this, and maybe the dragon also
5:01 wants to have this information.
5:03 Woops, copy that.
5:05 So the dragon is going to go like this,
5:06 and then it's going to copy it,
5:07 and this seems really, really tedious.
5:10 It is and I'll fix it in just a second.
5:12 You'll see that we can model this differently.
5:14 But when we create a dragon, it will have this.
5:16 And let's also say that it has
5:18 a scaliness factor and breathes fire.
5:26 Alright, so we want to store these here, so I'll say,
5:31 "self dot", that equals that.
5:34 In fact, in PyCharm you can hit alt enter
5:36 and it will even write that whole bit for you
5:38 because it knows that this is what you should do.
5:40 But you probably see a lot of duplication here, and here.
5:44 And if I want to change something about this,
5:46 like add a feature to all creatures,
5:48 well I'll have to go in and add it everywhere, like this.
5:51 So, we'll be able to something a little bit better here
5:53 in just a second.
5:54 But let's go ahead and write this.
5:56 Let's take that and let's say
6:00 we're going to multiply that times the self.scaliness,
6:06 let's go that equals that.
6:07 We'll say if self.breathes_fire,
6:11 then value equals value times 2.
6:14 So it's even worse, stronger if it breathes fire.
6:18 Okay, great, so there's that.
6:20 Now, this is not really super helpful.
6:25 Any change we make over here, we would kind of like
6:29 to copy them over there, and really, we would like
6:31 to treat the dragon as just a specialization of a creature.
6:34 Remember, this is a relationship.
6:37 So we can model that by saying this dragon is a creature,
6:42 like this, alright?
6:44 And when we say that, what it lets us do is
6:47 actually take on all the attributes here.
6:50 Notice this is giving us a little warning,
6:52 it says, "you need to say super dot",
6:55 and in pass the name and the level.
6:57 And this basically says we're going to run
6:59 this bit of code, and we don't actually need
7:01 this stuff here, we're just going to store
7:04 let it pass on through, then we're just going to store
7:06 the things that are special about the dragon.
7:09 Similarly, this right here, we could say the role
7:12 is actually whatever the regular creature does.
7:20 And then we could say, okay we're going to do
7:21 that same thing, and we're going to factor in
7:24 the scaliness and the firebreathing, here.
7:28 You can see right here that PyCharm is saying that
7:30 you're actually getting this detail here
7:33 from your creature class that you're driving from.
7:36 Okay, so this is all well and good.
7:39 Let's do one more thing.
7:40 Let's have a wizard.
7:47 Now the wizard is also going to be a creature,
7:49 and the wizard actually has no special items or a passing
7:53 to it, so we can just leave this init thing off.
7:55 We're just going to add one behavior
7:57 to the wizard, which is going to be attack.
7:59 So he's going to have a creature he's going to attack,
8:02 and it's going to return True or False.
8:04 So it'll go something like this.
8:09 Now notice, both the wizard can get this defensive role,
8:12 or offensively, but it's fine,
8:14 and the creature also knows how to get a defensive role.
8:16 And we'll just compare those, we'll say return,
8:19 my role is greater than or equal to their role.
8:25 Alright, so what we're going to do is have the wizard attack
8:28 another creature, and then if we roll something higher
8:31 than we win, otherwise we lose.
8:32 And we're indicating that by returning True or False.
8:35 Alright, so we were able to take on a lot of the features
8:39 and the blueprint of the creature to get this
8:43 defensive role, and all we're doing is adding
8:45 an attack mechanism.
8:46 Whereas the dragon, we said we're going to change the way
8:49 defense works for dragons as well as,
8:50 like, storing additional stuff.
8:53 So we're able to model these
8:55 various actors in our game, all the while
8:58 keeping a sort of common functionality so they can interact
9:00 with each other.