Day11-Python做的打怪兽小游戏(面向对象编程的练习)

      今天第三周的第一天,学的内容真心不多。但是都是硬通货!一个案例几乎讲了半天,可见老师的苦心。重点就是高阶函数!!装饰器!!!具体的深层意义我还是没有明白,大概了解就是把类下面的对象先包装属性,然后设置修改器,以便后续进行调用而不改动。大概是这意思吧,我已经被下划线弄疯了,整个晚自习都在研究这个案例,改了一个小时才算把所有错误改完。起手式和套路反正我了解了。下面的案例是关于奥特曼打小怪兽的下游戏,刚开始我还跟上节奏写出了对象的属性定义,心里窃喜原来小游戏就是这么开发出来的,太简单了!结果后来出错无数次,洋洋洒洒的100行代码我直接被下划线的保护功能搞晕了,没跟上啊

from random import randint #导入randint函数


class Ultraman(object):  #定义类(爸爸、祖宗.......             

                 #后来用student案例终于明白了,原来可以定义大类,子类孙类就可以省好多代码,逻辑更清楚)

    def __init__(self, name, hp, mp): #标准格式,init顾名思义(括号里面是定义对象的属性)
        self._name = name  #固定格式,其中下划线表示属性受保护,不能随便改。要改就得用装饰器
        self._hp = hp   #定义奥特曼的名字、血量、魔法量
        self._mp = mp

    @property  #访问器包装起来方便调用和增加其他功能而不改动本身,我还是不明白,先记住套路!
    def name(self):
        return self._name

    @property
    def hp(self):
        return self._hp

    @hp.setter  #修改器,只要修属性改变量就得用
    def hp(self, hp):
        self._hp = hp if hp >= 0 else 0

    def attack(self, monster): #设置攻击方法,其实就是定义动作属性
        monster.hp -= randint(0, 25)

    def huge_attack(self, monster): #另一种动作属性,大招
        if self._mp >= 50:
            self._mp -= 50
            injury = monster.hp * 3 // 4
            injury = injury if injury >= 50 else 50
            monster.hp -= injury
        else:
            self.attack(monster)  #回合制,下一轮调用monster对象进行动作

    def magic_attack(self, monsters): #另一种动作属性
        if self._mp >= 20:
            self._mp -= 20
        for monster in monsters: #定义多个静态属性monster
            monster.hp -= randint(1, 15)

    def __str__(self):  #返回每次调用之后的剩余参数(血量、魔法量、名字)
        return '%s奥特曼\n' % self._name + \
            '生命值:%d\n' % self._hp + \
            '魔法值:%d\n' % self._mp


class Monster(object): #定义另一个类(怪兽)

    def __init__(self, name, hp): #固定起手式
        self._name = name
        self._hp = hp

    @property    #继续包装器
    def name(self):
        return self._name

    @property
    def hp(self):
        return self._hp

    @hp.setter   #继续修改器
    def hp(self, hp):
        self._hp = hp if hp >= 0 else 0

    def attack(self, ultraman): #定义动态属性(攻击)
        ultraman.hp -= randint(0,15)

    def __str__(self):  
        return '%s小怪兽\n' % self.name + \
            '生命值:%d\n' % self.hp


def main():  #最终调用所有的类对象的属性进行动作,最终的命令执行以上的函数及各种方法
    u = Ultraman('十三哥', 600, 300)
    m1 = Monster('猪头1', 300,)
    m2 = Monster('猪头2', 180)
    m3 = Monster('猪头3', 260)
    ms = [m1, m2, m3]
    at_round = 1
    while u.hp > 0 and m1.hp > 0: #设定while循环直到要求的条件将其打破
        print('===第%d回合===' % at_round)
        u.attack(m1)
        if m1.hp > 0:
            m1.attack(u)
        print(m1)
        print(u)
        at_round += 1
    if u.hp > 0:
        print('%s奥特曼胜利!' % u.name)
    else:
        print('%s怪兽胜利' % m1.name)



if __name__ == '__main__':
    main()
好了好了,我要休息了。这个案例已经把我累到了。下划线的事情明天再看看。以为简单的小游戏,结果

代码都是100行以上,而且涉及到的知识点很重要也有点绕!


展开阅读全文

没有更多推荐了,返回首页