【python】奥特曼打小怪兽文字游戏

设计基本思路:

  1. 设置一个抽象类(FighterFighterFighter),用来初始化奥特曼与小怪兽的基本属性(name,hpname,hpnamehp);同时设置一个抽象类方法(attackattackattack),奥特曼与小怪兽对象皆可重载该方法设置自己的攻击方法;设置一个alivealivealive函数用于判断对象的hphphp
  2. 设置一个奥特曼类,继承自FighterFighterFighter类,调用父类的初始化方法初始化奥特曼的namenamenamehphphp属性,同时设置自己的属性mpmpmp(魔法值);重载attackattackattack方法对小怪兽造成随机伤害(普通攻击);依靠mpmpmp设置究极必杀技(hugehugehuge_ attackattackattack)以及魔法群体伤害(magicmagicmagic_ attackattackattack);设定普通攻击之后自动恢复一定的魔法值(resumeresumeresume)
  3. 设置一个小怪兽类,继承自FighterFighterFighter类,调用父类的初始化方法初始化小怪兽的namenamenamehphphp属性;重载attackattackattack方法对奥特曼造成随机伤害
  4. 当某一方阵亡则退出游戏:奥特曼使用alivealivealive判断是否存活,设置方法(isisis_ anyanyany_ alivealivealive)判断全体小怪兽是否存活
  5. 每回合攻击选择一只存活的小怪兽:设置方法(selectselectselect_ alivealivealive _oneoneone)用于选择存活的小怪兽
  6. 每回合结束显示奥特曼与小怪兽的信息:设置方法(displaydisplaydisplay _infoinfoinfo)显示信息
  7. 主体设置:(1)定义奥特曼与小怪兽对象,进行游戏;(2)首先选择一个活着的小怪兽并产生一个随机值,当随机值处于某个范围内,奥特曼采用普通攻击(attackattackattack)攻击小怪兽;(3)随机值处于某个范围并且魔法值足够则触发魔法伤害,对全体小怪兽造成伤害,否则使用魔法失败;(4)随机值处于另一个范围且魔法值足够触发究极必杀技,否则使用普通攻击;(5)若选定的小怪兽攻击之后依然存活则回击奥特曼;(6)回合结束显示奥特曼与小怪兽信息;(7)当某一方阵亡则退出游戏,宣布某一方游戏胜利

实现:

1.需要使用抽象类与抽象方法,从abcabcabc模块导入ABCMetaABCMetaABCMeta以及abstractmethodabstractmethodabstractmethod包;需要使用随机值,从randomrandomrandom模块导入randintrandintrandint以及randrangerandrangerandrange

from abc import ABCMeta, abstractmethod
from random import randint, randrange

2.定义抽象类FighterFighterFighter

class Fighter(object, metaclass=ABCMeta):
    """战斗者"""

    #通过__slots__魔法限定对象可以绑定的成员变量
    __slots__ = ('_name', '_hp')

    def __init__(self, name, hp):
        """初始化方法
        :param name: 名字
        :param hp: 生命值
        """

        self._name = name
        self._hp = hp

	#使用property装饰器定义getter以及setter方法
    @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

3.定义奥特曼(UltramanUltramanUltraman)类,继承自FighterFighterFighter

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
        """

        #放出大招,消耗50点魔法值造成伤害;魔法值不够则采用普通攻击
        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
        """

        #释放魔法攻击,消耗20魔法点;魔法值不够则使用魔法失败
        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

4.定义小怪兽(MonsterMonsterMonster)类,继承自FighterFighterFighter

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

5.判断全体小怪兽是否存活

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

6.选择一只活着的小怪兽

def select_alive_one(monsters):
    """选中一只活着的小怪兽"""
    monsters_len = len(monsters)
    while True:
        index = randrange(monsters_len)
        monster = monsters[index]
        if monster.alive > 0:
            return monster

7.显示奥特曼和小怪兽的信息

def display_info(ultraman, monsters):
    """显示奥特曼和小怪兽的信息"""
    print(ultraman)
    for monster in monsters:
        print(monster, end='')

8.主体逻辑

def main():
    u = Ultraman('花花', 1000, 120)
    m1 = Monster('狄仁杰', 250)
    m2 = Monster('李元芳', 500)
    m3 = Monster('王大锤', 750)
    ms = [m1, m2, m3]
    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:
            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奥特曼胜利!\n' % u.name)
    else:
        print('小怪兽胜利!\n')


if __name__ == '__main__':
    main()

测试:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

现在有一个奥特曼怪兽的角色扮演游戏。请你根据下面的描述,定义两个类:奥特曼类和怪兽类。 在奥特曼的世界,打怪兽就是全部。现在人人都有机会成为奥特曼,加入到与怪兽无止境的战斗中。可惜,并非人人生来就是英雄,革命尚未成功,同志仍需努力啊。每一个奥特曼都要从零开始,辛勤劳动,打怪升级,最终才能成为举世瞩目的大英雄。 奥特曼的等级(rank)从第一级开始,随着它打怪兽经验(exp)的增加,等级将不断攀升。随着等级的升高,奥特曼的生命值(hp)上限和攻击力(damage)也将大大增强。在与怪兽的战斗中,奥特曼收获的不仅仅是经验。有时,运气好的话,还能从怪兽身上弄到点小钱(money)。不要小看这些钱,关键时刻,它能给奥特曼买药补血呀。奥特曼没有金刚不坏之身,在与怪兽的战斗中,奥特曼会受到伤害。一旦奥特曼的生命值降到0,它英雄的一生就结束了。 好了,了解了奥特曼的基本情况,现在可以开始战斗了。首先,我们需要一位全新的奥特曼,我们给它赋予一定的初始实力(initial)。让它投入战斗吧! 在与怪兽的战斗中要讲究策略。所谓知己知彼,百战不殆,一旦碰到怪兽,我们首先要查看自己和对方的实力(display),包括双方的等级、生命值、攻击力、经验和所拥有的钱财。所谓打得赢就打,打不赢就跑。如果对手太强大,逃跑吧(escape)!偶尔逃跑无伤颜面,但会耗费一点生命值。如果总是逃跑,生命被虚耗,那英雄就当不成了。所以该出手时就出手,勇敢地战斗(attack)吧!每一回合的战斗中,怪兽会受到攻击(attacked),怪兽也会反击(fightback),让奥特曼受到攻击(attacked)。每一回合结束,只要奥特曼还活着(isalive),而且怪兽也还活着,战斗就要继续。如果奥特曼的生命值太低,也许抵挡不了下一轮的进攻,那么别财迷了,掏钱出来给它补血(restore)吧。当然,如果形势确实不妙,奥特曼也可以中途逃跑。但如果获得了最终的胜利(win),不仅能赢得战斗经验,夺取怪兽身上的钱财,足够多的经验也许能让奥特曼升级(upgrade)。 以及其实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值