每天学点python-面向对象进阶(2)

本案例介绍了一个基于Python的简单游戏程序,名为“奥特曼大战小怪兽”。游戏中,奥特曼与多个小怪兽进行战斗,运用普通攻击、魔法攻击和究极必杀技等技能。游戏采用面向对象编程,定义了Fighter基类和Ultraman、Monster子类,实现了角色的属性、攻击方式和恢复魔法值等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下内容学习自:https://github.com/jackfrued/Python-100-Days

综合案例
案例1:奥特曼打小怪兽

# -*- coding: utf-8 -*-
"""
Created on Thu Aug 15 15:31:26 2019

@author: fengzi
"""
from abc import ABCMeta, abstractmethod
from random import randint, randrange

class Fighter(object, metaclass=ABCMeta):
    """战斗者"""
    
    __slots__ = ("_name", "_hp")  # 通过__slots__魔法限定对象可以绑定的成员变量
    
    def __init__(self, name, hp):
        """初始化方法

        :param name: 名字
        :param 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
        
    @property
    def alive(self):
        return self._hp > 0
    
    @abstractmethod
    def attack(self, other):
        
        """攻击

        :param other: 被攻击的对象
        """
        
        pass
    
class Ultraman(Fighter):
    """奥特曼"""
    
    __slots__ = ("_name", "_hp", "_mp")
    
    def __init__(self, name, hp, mp):
        """初始化方法

        :param name: 名字
        :param hp: 生命值
        :param mp: 魔法值
        """
        
        super().__init__(name,hp)
        self._mp = mp
    
    def attack(self, other):
        other.hp -= randint(15, 25)
    
    def huge_attack(self, other):
        """究极必杀技(打掉对方至少50点或四分之三的血)

        :param other: 被攻击的对象

        :return: 使用成功返回True否则返回False
        """
        
        if self._mp >= 50:
            self._mp -= 50
            injury = other.hp * 3 // 4
            injury = injury if injury >= 50 else 50
            other.hp -= injury
            return True
        else:
            self.attack(other)
            return False
        
    def magic_attack(self, others):
        """魔法攻击

        :param others: 被攻击的群体

        :return: 使用魔法成功返回True否则返回False
        """
        
        if self._mp >= 20:
            self._mp -= 20
            for temp in others:
                if temp.alive:
                    temp.hp -= randint(10, 15)
            return True
        else:
            return False
        
    def resume(self):
        """恢复魔法值"""
        
        incr_point = randint(1, 10)
        self._mp += incr_point
        return incr_point
    
    def __str__(self):
        return "~~~%s奥特曼~~~\n" % self._name + \
               "生命值:%d\n" % self._hp + \
               "魔法值:%d\n" % self._mp
               
class Monster(Fighter):
    """小怪兽"""
    
    __slots__ = ("_name", "_hp")
    
    def attack(self, other):
        other.hp -= randint(10, 20)
        
    def __str__(self):
        return "~~~%s小怪兽~~~\n" %  self._name + \
               "生命值:%d\n" % self._hp
               

def is_any_alive(monsters):
    """判断有没有小怪兽是活着的"""
    for monster in monsters:
        if monster.alive > 0:
            return True
    return False

def select_alive_one(monsters):
    """选中一只活着的小怪兽"""
    monsters_len = len(monsters)
    while True:
        index = randrange(monsters_len)
        monster = monsters[index]
        if monster.alive > 0:
            return monster
    
def display_info(ultraman, monsters):
    """显示奥特曼和小怪兽的信息"""
    print(ultraman)
    for monster in monsters:
        print(monster, end = "")
        
def main():
    u = Ultraman("大小姐", 2000, 120)
    m1 = Monster("狄仁杰", 250)
    m2 = Monster("李元芳", 500)
    m3 = Monster("鲁班", 750)
    m4 = Monster("玄策", 800)
    m5 = Monster("貂蝉", 400)
    m6 = Monster("小乔", 900)
    ms = [m1, m2, m3, m4, m5, m6]
    fight_round = 1
    while u.alive and is_any_alive(ms):
        print("========第%02d回合========" % fight_round)
        m = select_alive_one(ms) #选中一只小怪兽
        skill = randint(1, 10) #通过随机数选择使用那种技能
        if skill <= 6:  # 60%的概率使用普通攻击
            print("%s使用普通攻击打了%s。" % (u.name, m.name))
            u.attack(m)
            print("%s的魔法值恢复了%d点。" % (u.name, u.resume()))
        elif skill <= 9:  # 30%的概率使用魔法攻击(可能因魔法值不足而失败)
            if u.magic_attack(ms):
                print("%s使用了魔法攻击。" % u.name)
            else:
                print("%s使用魔法失败。" % u.name)
        else:   # 10%的概率使用究极必杀技(如果魔法值不足则使用普通攻击)
            if u.huge_attack(m):
                print('%s使用究极必杀技虐了%s.' % (u.name, m.name))
            else:
                print('%s使用普通攻击打了%s.' % (u.name, m.name))
                print('%s的魔法值恢复了%d点.' % (u.name, u.resume()))
        if m.alive > 0:  # 如果选中的小怪兽没有死就回击奥特曼
            print('%s回击了%s.' % (m.name, u.name))
            m.attack(u)
        display_info(u, ms)  # 每个回合结束后显示奥特曼和小怪兽的信息
        fight_round += 1
    print('\n========战斗结束!========\n')
    if u.alive > 0:
        print('%s奥特曼胜利!' % u.name)
    else:
        print('小怪兽胜利!')


if __name__ == '__main__':
    main()

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值