【python】奧特曼打小怪獸文字遊戲

設計基本思路:

  1. 設置一個抽象類(FighterFighter),用來初始化奧特曼與小怪獸的基本屬性(namehpname,hp);同時設置一個抽象類方法(attackattack),奧特曼與小怪獸對象皆可重載該方法設置自己的攻擊方法;設置一個alivealive函數用於判斷對象的hphp
  2. 設置一個奧特曼類,繼承自FighterFighter類,調用父類的初始化方法初始化奧特曼的namenamehphp屬性,同時設置自己的屬性mpmp(魔法值);重載attackattack方法對小怪獸造成隨機傷害(普通攻擊);依靠mpmp設置究極必殺技(hugehuge_ attackattack)以及魔法羣體傷害(magicmagic_ attackattack);設定普通攻擊之後自動恢復一定的魔法值(resumeresume)
  3. 設置一個小怪獸類,繼承自FighterFighter類,調用父類的初始化方法初始化小怪獸的namenamehphp屬性;重載attackattack方法對奧特曼造成隨機傷害
  4. 當某一方陣亡則退出遊戲:奧特曼使用alivealive判斷是否存活,設置方法(isis_ anyany_ alivealive)判斷全體小怪獸是否存活
  5. 每回合攻擊選擇一隻存活的小怪獸:設置方法(selectselect_ alivealive _oneone)用於選擇存活的小怪獸
  6. 每回合結束顯示奧特曼與小怪獸的信息:設置方法(displaydisplay _infoinfo)顯示信息
  7. 主體設置:(1)定義奧特曼與小怪獸對象,進行遊戲;(2)首先選擇一個活着的小怪獸併產生一個隨機值,當隨機值處於某個範圍內,奧特曼採用普通攻擊(attackattack)攻擊小怪獸;(3)隨機值處於某個範圍並且魔法值足夠則觸發魔法傷害,對全體小怪獸造成傷害,否則使用魔法失敗;(4)隨機值處於另一個範圍且魔法值足夠觸發究極必殺技,否則使用普通攻擊;(5)若選定的小怪獸攻擊之後依然存活則回擊奧特曼;(6)回合結束顯示奧特曼與小怪獸信息;(7)當某一方陣亡則退出遊戲,宣佈某一方遊戲勝利

實現:

1.需要使用抽象類與抽象方法,從abcabc模塊導入ABCMetaABCMeta以及abstractmethodabstractmethod包;需要使用隨機值,從randomrandom模塊導入randintrandint以及randrangerandrange

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

2.定義抽象類FighterFighter

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.定義奧特曼(UltramanUltraman)類,繼承自FighterFighter

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.定義小怪獸(MonsterMonster)類,繼承自FighterFighter

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()

測試:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章