python紅藍英雄大亂斗(面向對象實現)


紅藍英雄大亂斗

游戲規則

'''
有紅藍兩方英雄(可自定義個數)
    隨機一方英雄使用隨機攻擊方式攻擊另一方英雄,任意一方英雄全部陣亡則游戲結束
        每個英雄有 名字、生命值、普通攻擊、Q技能攻擊、W技能攻擊、E技能攻擊以及對應的傷害值
            當生命值為 0 時陣亡,不再參與戰斗
'''

程序運行截圖

請忽略顏色(Python如何輸出帶顏色的文字方法)

具體實現代碼

程序代碼

import random
import time


class Hero:
    def __init__(self, name, health, attack, q_hurt, w_hurt, e_hurt):
        lcs = locals()
        lcs.pop('self')
        self.__dict__.update(lcs)

    def attack(self, enemy):
        print(f"-- {self.name} --使用普通攻擊攻擊了-- {enemy.name} --,造成了 {self.attack} 點傷害,{enemy.name} 剩余 {enemy.health} 點生命值。\033[0m")
        enemy.health -= self.attack

    def Q(self, enemy):
        print(f"\033[0m-- {self.name} --使用Q技能攻擊了-- {enemy.name} --,造成了 {self.q_hurt} 點傷害,{enemy.name} 剩余 {enemy.health} 點生命值。\033[0m")
        enemy.health -= self.q_hurt

    def W(self, enemy):
        print(f"\033[32m-- {self.name} --使用W技能攻擊了-- {enemy.name} --,造成了 {self.w_hurt} 點傷害,{enemy.name} 剩余 {enemy.health} 點生命值。\033[0m")
        enemy.health -= self.w_hurt

    def E(self, enemy):
        print(f"\033[35m-- {self.name} --使用E技能攻擊了-- {enemy.name} --,造成了 {self.e_hurt} 點傷害,{enemy.name} 剩余 {enemy.health} 點生命值。\033[0m")
        enemy.health -= self.e_hurt


def check_hero(enemy, team):
    if enemy.health <= 0:
        print(f"\033[31m** {enemy.name} ** 陣亡。\033[0m")
        if team == 'blue':
            blue_team.remove(enemy)
        elif team == 'red':
            red_team.remove(enemy)


def get_random_skill():
    return skill_list.get(random.randint(1, 4))


def get_random_blue_hero():
    return blue_team[random.randint(0, len(blue_team) - 1)]


def get_random_red_hero():
    return red_team[random.randint(0, len(red_team) - 1)]


blue_team = [
    Hero('瑞文', 465, 65, 30, 25, 70),
    Hero('提莫', 300, 35, 50, 40, 60),
]

red_team = [
    Hero('李白', 320, 60, 35, 29, 77),
    Hero('魯班', 280, 79, 35, 40, 80),
]

skill_list = {
    1: Hero.attack,
    2: Hero.Q,
    3: Hero.W,
    4: Hero.E,
}


while len(red_team) > 0 and len(blue_team) > 0:
    skill = get_random_skill()
    blue = get_random_blue_hero()
    red = get_random_red_hero()
    flag = random.randint(0, 1)
    if flag:
        skill(blue, red)
        check_hero(red, 'red')
    else:
        skill(red, blue)
        check_hero(blue, 'blue')
    time.sleep(0.3)

    if len(red_team) == 0:
        print(f"藍色方獲勝!")
        print(f"藍色方所剩英雄狀態為:")
        for hero in blue_team:
            print(f"{hero.name} 剩余生命值 {hero.health}")
    elif len(blue_team) == 0:
        print(f"紅色方獲勝!")
        print(f"紅色方所剩英雄狀態為:")
        for hero in red_team:
            print(f"{hero.name} 剩余生命值 {hero.health}")
實現代碼

帶注釋版的代碼

import random
import time


# 定義一個英雄類,表示英雄這一類的共同特征
class Hero:
    def __init__(self, name, health, attack, q_hurt, w_hurt, e_hurt):
        lcs = locals()
        lcs.pop('self')
        self.__dict__.update(lcs)
        '''
            ********************************** 上述代碼講解 *************************************
            # 每次調用類生成對象的時候都會執行這里面的代碼,並將對象作為第一個參數self 傳進來
            print(locals())
            # {'e_hurt': 70, 'w_hurt': 25, 'q_hurt': 30, 'attack': 65, 'health': 465, 'name': '瑞文', 'self': <__main__.Hero object at 0x000002371823B278>}
            lcs = locals()  # 這個locals()在 __init__ 函數里 可以獲取 __init__ 函數名稱空間里的那些名字,他是一個字典
            lcs.pop('self')  # 發現上面的 locals() 多了一個 self 是不需要的,那就把它刪掉
            print(lcs)
            # {'e_hurt': 70, 'w_hurt': 25, 'q_hurt': 30, 'attack': 65, 'health': 465, 'name': '瑞文'}
            # 這些內容正是初始化對象時想做的事(只不過是 對象.e_hurt = 70 這樣的形式而已)
            self.__dict__.update(lcs)  # 將這些東西放到對象里,就重復了n變 self.參數 = 參數 (self.name = name)這樣的動作
            print(self.__dict__)
            # {'e_hurt': 70, 'w_hurt': 25, 'q_hurt': 30, 'attack': 65, 'health': 465, 'name': '瑞文'}
            
            最初始的寫法:
                self.name = name
                self.health = health
                self.attack = attack
                self.q_hurt = q_hurt
                self.w_hurt = w_hurt
                self.e_hurt = e_hurt
        '''

    def attack(self, enemy):
        enemy.health -= self.attack
        print(f"-- {self.name} --使用普通攻擊攻擊了-- {enemy.name} --,造成了 {self.attack} 點傷害,{enemy.name} 剩余 {enemy.health} 點生命值。\033[0m")

    def Q(self, enemy):
        enemy.health -= self.q_hurt
        print(f"\033[0m-- {self.name} --使用Q技能攻擊了-- {enemy.name} --,造成了 {self.q_hurt} 點傷害,{enemy.name} 剩余 {enemy.health} 點生命值。\033[0m")

    def W(self, enemy):
        enemy.health -= self.w_hurt
        print(f"\033[32m-- {self.name} --使用W技能攻擊了-- {enemy.name} --,造成了 {self.w_hurt} 點傷害,{enemy.name} 剩余 {enemy.health} 點生命值。\033[0m")

    def E(self, enemy):
        enemy.health -= self.e_hurt
        print(f"\033[35m-- {self.name} --使用E技能攻擊了-- {enemy.name} --,造成了 {self.e_hurt} 點傷害,{enemy.name} 剩余 {enemy.health} 點生命值。\033[0m")


def check_hero(enemy, team):
    if enemy.health <= 0:
        # \033[31m 這種格式的是打印時的顏色控制(顏色可參考 https://www.cnblogs.com/easypython/p/9084426.html)
        print(f"\033[31m** {enemy.name} ** 陣亡。\033[0m")
        if team == 'blue':
            blue_team.remove(enemy)
        elif team == 'red':
            red_team.remove(enemy)


# 隨機選擇一種攻擊方式
def get_random_skill():
    # random_index = random.randint(1, 4)
    # random_skill = skill_list.get(random_index)
    # return random_skill  # 函數名當做返回值返回,拿到可以直接加括號調用執行函數
    return skill_list.get(random.randint(1, 4))  # 上面代碼的簡便寫法


# 隨機選擇一個藍色方英雄
def get_random_blue_hero():
    # 返回 blue_team 這個列表的索引為 random.randint(0, len(blue_team) - 1) 返回值的元素(英雄對象)
    # return blue_team[random.randint(0, len(blue_team) - 1)]  # 下面幾行的簡便寫法
    random_idndex = random.randint(0, len(blue_team) - 1)
    hero = blue_team[random_idndex]
    return hero


# 隨機選擇一個紅色方英雄
def get_random_red_hero():
    return red_team[random.randint(0, len(red_team) - 1)]


# 藍色方英雄陣容 --- 可自定義 ---
# 方便隨機數取英雄對象
blue_team = [
    # 英雄名 生命值 普通攻擊力 Q技能傷害 W技能傷害 E技能傷害
    #  瑞文   465      65       30        25        70
    Hero('瑞文', 465, 65, 30, 25, 70),
    Hero('提莫', 300, 35, 50, 40, 60),
    Hero('錘石', 600, 15, 20, 0, 32),
]

# 紅色方英雄陣容 --- 可自定義 ---
# 方便隨機數取英雄對象
red_team = [
    Hero('李白', 320, 60, 35, 29, 77),
    Hero('魯班', 280, 79, 35, 40, 80),
    Hero('盾山', 800, 3, 3, 3, 3),
]

# 技能數字對應表(方便根據隨機數取技能)
skill_list = {
    1: Hero.attack,
    2: Hero.Q,
    3: Hero.W,
    4: Hero.E,
}


def run():
    while len(red_team) > 0 and len(blue_team) > 0:
        # 調用方法隨機獲得一個技能
        skill = get_random_skill()
        # 調用方法隨機獲得一個藍色方英雄
        blue = get_random_blue_hero()
        # 調用方法隨機獲得一個紅色方英雄
        red = get_random_red_hero()
        # 隨機選擇一方為攻擊方(那么另一方就是被攻擊方)
        flag = random.randint(0, 1)
        if flag:
            skill(blue, red)
            check_hero(red, 'red')
        else:
            skill(red, blue)
            check_hero(blue, 'blue')
        # 暫停0.3秒,可以慢慢看戰斗過程
        time.sleep(0.3)

        # 如果有任意一方沒有英雄了,即游戲結束
        if len(red_team) == 0:
            print(f"藍色方獲勝!")
            print(f"藍色方所剩英雄狀態為:")
            for hero in blue_team:
                print(f"{hero.name} 剩余生命值 {hero.health}")
        elif len(blue_team) == 0:
            print(f"紅色方獲勝!")
            print(f"紅色方所剩英雄狀態為:")
            for hero in red_team:
                print(f"{hero.name} 剩余生命值 {hero.health}")


if __name__ == '__main__':
    run()
    '''
        戰斗記錄
        ************************** 省略n多中間戰斗步驟  *********************************
        -- 錘石 --使用W技能攻擊了-- 盾山 --,造成了 0 點傷害,盾山 剩余 42 點生命值。
        -- 盾山 --使用E技能攻擊了-- 瑞文 --,造成了 3 點傷害,瑞文 剩余 289 點生命值。
        -- 瑞文 --使用E技能攻擊了-- 盾山 --,造成了 70 點傷害,盾山 剩余 -28 點生命值。
        ** 盾山 ** 陣亡。
        藍色方獲勝!
        藍色方所剩英雄狀態為:
        瑞文 剩余生命值 289
        錘石 剩余生命值 235
        
        戰斗記錄2
        ************************** 省略n多中間戰斗步驟  *********************************
        -- 盾山 --使用普通攻擊攻擊了-- 錘石 --,造成了 3 點傷害,錘石 剩余 11 點生命值。
        -- 錘石 --使用普通攻擊攻擊了-- 盾山 --,造成了 15 點傷害,盾山 剩余 288 點生命值。
        -- 盾山 --使用E技能攻擊了-- 瑞文 --,造成了 3 點傷害,瑞文 剩余 -1 點生命值。
        ** 瑞文 ** 陣亡。
        -- 盾山 --使用普通攻擊攻擊了-- 錘石 --,造成了 3 點傷害,錘石 剩余 8 點生命值。
        -- 盾山 --使用普通攻擊攻擊了-- 錘石 --,造成了 3 點傷害,錘石 剩余 5 點生命值。
        -- 盾山 --使用W技能攻擊了-- 錘石 --,造成了 3 點傷害,錘石 剩余 2 點生命值。
        -- 盾山 --使用Q技能攻擊了-- 錘石 --,造成了 3 點傷害,錘石 剩余 -1 點生命值。
        ** 錘石 ** 陣亡。
        紅色方獲勝!
        紅色方所剩英雄狀態為:
        盾山 剩余生命值 288
    '''
實現代碼(注釋版)

備注:自己寫着玩兒的程序,如有bug,請別當真,這只是python面向對象方面的一個小練習;如果你很感興趣,期待你寫一個更棒的版本分享出來一起玩哦~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM