1. 程式人生 > >Python基於類和物件實現的決鬥遊戲

Python基於類和物件實現的決鬥遊戲

需求: 基本任務: 1 建立角色類,角色擁有生命值的屬性和攻擊的方法,攻擊值是隨機的。 2 建立職業子類,刀客, (傷害少,血量多)劍客(傷害正常,血量正常,有機率兩倍暴擊), 女賊(傷害高,血量少,有機率 3 倍暴擊) 3 歡迎介面,選擇職業,建立角色,替電腦建立角色(角色名為同桌名) 4 選擇與電腦決鬥還是聊天 如果為聊天則隨機和電腦聊三句話 如果選擇決鬥則直至一方死亡,列印中間打鬥過程,打鬥過程為隨機打鬥,不同職業打鬥描 述要求不同。一人出招後,停下幾秒給觀眾讀打鬥的時間 5 新增勝利或失敗介面 Importrandom,time Random.choice((元素,元素,元素))從元組的元素中隨機選取。 Random.int(a,b)a 為下限,b 為上限,隨機選取數字 引數 Self 為物件本身,引數 other 為其它物件。 Time.sleep(秒數),可以延緩下一個程式執行時間 功能進階(可選功能) : 1 建立其它職業,要求有職業特性,遊戲平衡 Eg:新增嗜血刀客職業,有機率攻擊造成等量傷害的血量回復 2 建立角色特性技能,要求技能隨機釋放 Eg:新增醫聖職業,有機率釋放技能讓自己血量回復 3 新增裝備系統,增加角色生命值或傷害值 4 新增寵物系統,建立角色後隨機獲得一個寵物 5 新增物理防禦系統,建立武僧職業,有機率忽視防禦 6 新增謀士職業(法傷),增加法術傷害體系和法術防禦體系 7 添加升級系統,打鬥勝利獲取經驗升級,傷害和血量增加 8 增加答題系統,通過答題來獲得裝備或者是屬性提升 *9 故事系統,按順序擊敗一些列劇情人物,和每個人物擁有劇情對話,角色屬性和傷害 逐步提升 10 可存檔和讀檔 程式碼實現: #進階功能除6 4 以外全部實現

import random
import time
import sys
global sss
global mylevel
global comlevel
class Role:
    def set_damage(self,damage):
        self.__damage=damage
    def get_damage(self):
        return self.__damage
    def set_hp(self,hp):
        self.__hp=hp
    def get_hp(self):
        return self.__hp
    def set_name(self,name):
        self.__name=name
    def get_name(self):
        return self.__name
    def get_money(self):
        return self.__money
    def set_money(self,money):
        self.__money=money
    def set_defense(self,defense):
        self.__defense=defense
    def get_defense(self):
        return self.__defense
class Tank(Role):
    def attack(self,enemy):
        print("%s 是一位Tank" %(self.get_name()))
        print("攻擊力為%d" %(self.get_damage()))
        print("防禦力為%d" %(self.get_defense()))
        zs1=random.randint(1,2)
        if zs1==1:
            print('%s大錘一掄 捲起陣陣風浪 頓時間呼呼作響 直向%s的胸膛砸去...' % (self.get_name(),enemy.get_name()))
        else:
            print('%s雙錘並起 兵分兩路 暗影蔽日 打向%s的左肋 右肋 ' % (self.get_name(),enemy.get_name()))
        print("Hit %d" %(self.get_damage()))
        print("對方護甲為%d" %(enemy.get_defense()))
        print("真實傷害為%d" %(self.get_damage()-enemy.get_defense()))
        nowlife=0
        nowlife=enemy.get_hp()-self.get_damage()+enemy.get_defense()
        enemy.set_hp(nowlife) 
        print("%s剩餘血量%d" %(enemy.get_name(),enemy.get_hp()))
        #enemy.life_value -= self.attack2
        #return enemy.life_value
class Sword(Role):
    def attack(self,enemy):
        rate=random.randint(1,100)
        if rate>=0 and rate<=25:
            print("%s 是一位Sword" %(self.get_name()))
            print("攻擊力為%d" %(self.get_damage()))
            print("%s打出了暴擊!" %(self.get_name()))
            zs2=random.randint(1,2)
            if zs2==1:
                print('%s哈哈一笑,突然間左腿微蹲,長劍呼的甩出,打在%s的腰間。' % (self.get_name(),enemy.get_name()))
            else:
                print('%s一劍分刺敵人雙手腕,自有先後之別,只是劍勢實在太快,%s的兩個手腕彷彿同時中劍一般。' % (self.get_name(),enemy.get_name()))
            print("Hit %d Critical" %(self.get_damage()*2))
            print("對方護甲為%d" %(enemy.get_defense()))
            print("真實傷害為%d" %(self.get_damage()*2-enemy.get_defense()))
            nowlife=0
            nowlife=enemy.get_hp()-self.get_damage()*2+enemy.get_defense()
            enemy.set_hp(nowlife)
            print("%s剩餘血量%d" %(enemy.get_name(),enemy.get_hp()))
        else:
            print("%s 是一位Sword" %(self.get_name()))
            print("攻擊力為%d" %(self.get_damage()))
            zs2=random.randint(1,2)
            if zs2==1:
                print('%s哈哈一笑,突然間左腿微蹲,長劍呼的甩出,打在%s的腰間。' % (self.get_name(),enemy.get_name()))
            else:
                print('%s一劍分刺敵人雙手腕,自有先後之別,只是劍勢實在太快,%s的兩個手腕彷彿同時中劍一般。' % (self.get_name(),enemy.get_name()))
            print("Hit %d" %(self.get_damage()))
            print("對方護甲為%d" %(enemy.get_defense()))
            print("真實傷害為%d" %(self.get_damage()-enemy.get_defense()))
            nowlife=0
            nowlife=enemy.get_hp()-self.get_damage()+enemy.get_defense()
            enemy.set_hp(nowlife) 
            print("%s剩餘血量%d" %(enemy.get_name(),enemy.get_hp()))
class Thief(Role):
    def attack(self,enemy):
        rate=random.randint(1,100)
        if rate>=0 and rate<=50:
            print("%s 是一位Thief" %(self.get_name()))
            print("攻擊力為%d" %(self.get_damage()))
            print("%s打出了三倍暴擊!" %(self.get_name()))
            zs2=random.randint(1,2)
            if zs2==1:
                print('%s手若蓮花 飛快的從腰間掏出數枚飛針 暴雨梨花般向%s射去' % (self.get_name(),enemy.get_name()))
            else:
                print('%s雙手合十 手中匕首在空中飛舞 一個閃步來到了%s身邊 順勢刺去' % (self.get_name(),enemy.get_name()))
            print("Hit %d Critical" %(self.get_damage()*3))
            print("對方護甲為%d" %(enemy.get_defense()))
            print("真實傷害為%d" %(self.get_damage()*3-enemy.get_defense()))
            nowlife=0
            nowlife=enemy.get_hp()-self.get_damage()*3+enemy.get_defense()
            enemy.set_hp(nowlife)
            print("%s剩餘血量%d" %(enemy.get_name(),enemy.get_hp()))
        else:
            print("%s 是一位Thief" %(self.get_name()))
            print("攻擊力為%d" %(self.get_damage()))
            zs2=random.randint(1,2)
            if zs2==1:
                print('%s手若蓮花 飛快的從腰間掏出數枚飛針 暴雨梨花般向%s射去' % (self.get_name(),enemy.get_name()))
            else:
                print('%s雙手合十 手中匕首在空中飛舞 一個閃步來到了%s身邊 順勢刺去' % (self.get_name(),enemy.get_name()))
            print("Hit %d" %(self.get_damage()))
            print("對方護甲為%d" %(enemy.get_defense()))
            print("真實傷害為%d" %(self.get_damage()-enemy.get_defense()))
            nowlife=0
            nowlife=enemy.get_hp()-self.get_damage()+enemy.get_defense()
            enemy.set_hp(nowlife)
            print("%s剩餘血量%d" %(enemy.get_name(),enemy.get_hp()))
class Blood(Role):
    def attack(self,enemy):
        rate=random.randint(1,100)
        if rate>=0 and rate<=50:
            print("%s 是一位嗜血刀客" %(self.get_name()))
            print("攻擊力為%d" %(self.get_damage()))
            print("%s觸發了吸血特效!" %(self.get_name()))
            print("%s恢復了%d 的血量!!" %(self.get_name(),self.get_damage()))
            nowlife=0
            nowlife=self.get_hp()+self.get_damage()
            self.set_hp(nowlife)
            print("%s現在的血量是%d" %(self.get_name(),self.get_hp()))
            zs2=random.randint(1,2)
            if zs2==1:
                print('%s狂刀拔出 帶出陣陣腥風 彷彿沾血為畫 %s劈去' % (self.get_name(),enemy.get_name()))
            else:
                print('%s一個閃身 來到%s背後 刀刃如亂披風一般向%s砍去' % (self.get_name(),enemy.get_name()))
            print("Hit %d" %(self.get_damage()))
            print("對方護甲為%d" %(enemy.get_defense()))
            print("真實傷害為%d" %(self.get_damage()-enemy.get_defense()))
            nowlife=0
            nowlife=enemy.get_hp()-self.get_damage()+enemy.get_defense()
            enemy.set_hp(nowlife)
            print("%s剩餘血量%d" %(enemy.get_name(),enemy.get_hp()))
        else:
            print("%s 是一位嗜血刀客" %(self.get_name()))
            print("攻擊力為%d" %(self.get_damage()))
            zs2=random.randint(1,2)
            if zs2==1:
                print('%s狂刀拔出 帶出陣陣腥風 彷彿沾血為畫 %s劈去' % (self.get_name(),enemy.get_name()))
            else:
                print('%s一個閃身 來到%s背後 刀刃如亂披風一般向%s砍去' % (self.get_name(),enemy.get_name()))
            print("Hit %d" %(self.get_damage()))
            print("對方護甲為%d" %(enemy.get_defense()))
            print("真實傷害為%d" %(self.get_damage()-enemy.get_defense()))
            nowlife=0
            nowlife=enemy.get_hp()-self.get_damage()+enemy.get_defense()
            enemy.set_hp(nowlife)
            print("%s剩餘血量%d" %(enemy.get_name(),enemy.get_hp()))
class Doctor(Role):
    def attack(self,enemy):
        rate=random.randint(1,100)
        if rate>=0 and rate<=50:
            print("%s 是一位醫聖" %(self.get_name()))
            print("攻擊力為%d" %(self.get_damage()))
            print("%s觸發了治療技能!" %(self.get_name()))
            print("%s恢復了20的血量!!" %(self.get_name()))
            nowlife=0
            nowlife=self.get_hp()+20
            self.set_hp(nowlife)
            print("%s現在的血量是%d" %(self.get_name(),self.get_hp()))
            zs2=random.randint(1,2)
            if zs2==1:
                print('%s輕捏蓮花指 彈指順技 一枚鐵珠向%s打去' % (self.get_name(),enemy.get_name()))
            else:
                print('%s雙掌分開 雙腿發力 如狂轟亂炸 向%s胸前打去' % (self.get_name(),enemy.get_name()))
            print("Hit %d" %(self.get_damage()))
            print("對方護甲為%d" %(enemy.get_defense()))
            print("真實傷害為%d" %(self.get_damage()-enemy.get_defense()))
            nowlife=0
            nowlife=enemy.get_hp()-self.get_damage()+enemy.get_defense()
            enemy.set_hp(nowlife)
            print("%s剩餘血量%d" %(enemy.get_name(),enemy.get_hp()))
        else:
            print("%s 是一位醫聖" %(self.get_name()))
            print("攻擊力為%d" %(self.get_damage()))
            zs2=random.randint(1,2)
            if zs2==1:
                print('%s輕捏蓮花指 彈指順技 一枚鐵珠向%s打去' % (self.get_name(),enemy.get_name()))
            else:
                print('%s雙掌分開 雙腿發力 如狂轟亂炸 向%s胸前打去' % (self.get_name(),enemy.get_name()))
            print("Hit %d" %(self.get_damage()))
            print("對方護甲為%d" %(enemy.get_defense()))
            print("真實傷害為%d" %(self.get_damage()-enemy.get_defense()))
            nowlife=0
            nowlife=enemy.get_hp()-self.get_damage()+enemy.get_defense()
            enemy.set_hp(nowlife)
            print("%s剩餘血量%d" %(enemy.get_name(),enemy.get_hp()))
class Monks(Role):
    def attack(self,enemy):
        rate=random.randint(1,100)
        if rate>=0 and rate<=50:
            print("%s 是一位武僧" %(self.get_name()))
            print("攻擊力為%d" %(self.get_damage()))
            print("%s觸發了克敵機先技能!" %(self.get_name()))
            print("%s此次攻擊無視對方護甲!!" %(self.get_name()))
            zs2=random.randint(1,2)
            if zs2==1:
                print('%s手持棍棒 胡亂飛舞向%s 打去' % (self.get_name(),enemy.get_name()))
            else:
                print('%s用出一招如來神掌向%s 打去' % (self.get_name(),enemy.get_name()))
            print("Hit %d" %(self.get_damage()))
            print("直接造成真實傷害為%d!" %(self.get_damage()))
            nowlife=0
            nowlife=enemy.get_hp()-self.get_damage()
            enemy.set_hp(nowlife)
            print("%s剩餘血量%d" %(enemy.get_name(),enemy.get_hp()))
        else:
            print("%s 是一位武僧" %(self.get_name()))
            print("攻擊力為%d" %(self.get_damage()))
            zs2=random.randint(1,2)
            if zs2==1:
                print('%s手持棍棒 胡亂飛舞向%s 打去' % (self.get_name(),enemy.get_name()))
            else:
                print('%s用出一招如來神掌向%s 打去' % (self.get_name(),enemy.get_name()))
            print("Hit %d" %(self.get_damage()))
            print("對方護甲為%d" %(enemy.get_defense()))
            print("真實傷害為%d" %(self.get_damage()-enemy.get_defense()))
            nowlife=0
            nowlife=enemy.get_hp()-self.get_damage()+enemy.get_defense()
            enemy.set_hp(nowlife)
            print("%s剩餘血量%d" %(enemy.get_name(),enemy.get_hp()))

com=Tank()
com.set_name("倪海龍")
global sss
sss=random.randint(15,25)
com.set_damage(sss)
com.set_hp(100)
com.set_defense(10)
#me=Thief()
#me.set_name("Lancer")
#me.set_damage(random.randint(20,30))
#me.set_hp(60)
#me.attack(com)
def main():
    global mylevel
    global comlevel
    while True:
        print("*********************************************")
        print("**************歡迎來到決鬥場*****************")
        print("*********************************************")
        print("           輸入S來創 建 角 色                ")
        print("*********************************************")
        print("           輸入Q來退 出 遊 戲                ")
        print("*********************************************")
        ch=input("輸入你的選擇:")
        if ch=='S' or ch=='s':
            first()
            break
        elif ch=='Q' or ch=='q':
            break
        else:
            print("請輸入正確的選擇")
            continue
def first():
    global mylevel
    global comlevel
    mylevel=0
    comlevel=0
    list1=['人生苦短要及時行樂','你的家裡是有礦嗎','咦咦咦咦咦咦切切切','真實是人生的命脈,是一切價值的根基','人生貴知心,定交無暮早','理想是人生的太陽。']
    wodezy=0
    ff=0
    zhiye=0
    mydef=0
    while True:
        print("勇士 請選擇你的職業:")
        cf=input("T 坦克(傷害少,血量多,護甲為10)\nS 劍客(傷害正常,血量正常,有機率兩倍暴擊,護甲為5)\nD 盜賊(傷害高,血量少,有機率三倍暴擊,護甲為0)\nB 嗜血刀客(中等傷害 低生命值 有機率攻擊造成等量傷害的血量回復,護甲為3)\nE 醫聖(低傷害 低生命值 有機率觸發技能恢復20的Hp,護甲為3)\nM 武僧(中等傷害 中等生命 有機率觸發技能克敵機先 無視對方護甲。護甲為6):")
        print("-------------------------------------------------------------------------------")
        if cf=='T' or cf=='t':
            class Hero(Tank):
                def __init__(self):
                    print("您選擇的職業是坦克")
            me=Hero()
            zhiye='t'
        elif cf=='S' or cf=='s':
            class Hero(Sword):
                def __init__(self):
                    print("您選擇的職業是劍士")
            me=Hero()
            zhiye='s'
        elif cf=='D' or cf=='d':
            class Hero(Thief):
                def __init__(self):
                    print("您選擇的職業是盜賊")
            me=Hero()
            zhiye='d'
        elif cf=='B' or cf=='b':
            class Hero(Blood):
                def __init__(self):
                    print("您選擇的職業是嗜血刀客")
            me=Hero()
            zhiye='b'
        elif cf=='E' or cf=='e':
            class Hero(Doctor):
                def __init__(self):
                    print("您選擇的職業是醫聖")
            me=Hero()
            zhiye='e'
        elif cf=='M' or cf=='m':
            class Hero(Monks):
                def __init__(self):
                    print("您選擇的職業是武僧")
            me=Hero()
            zhiye='m'
        else:
            print("輸入錯誤請重新輸入")
            continue
        print("接下來為你的職業為你隨機賦予攻擊力")
        if zhiye=='t':
            gongji=random.randint(11,15)
            wodezy="坦克"
            myhp=120
            mydef=10
        elif zhiye=='s':
            gongji=random.randint(15,20)
            wodezy="劍士"
            myhp=80
            mydef=5
        elif zhiye=='b':
            gongji=random.randint(20,25)
            wodezy="嗜血刀客"
            myhp=70
            mydef=3
        elif zhiye=='e':
            gongji=random.randint(20,30)
            wodezy="醫聖"
            myhp=50
            mydef=3
        elif zhiye=='m':
            gongji=random.randint(20,30)
            wodezy="武僧"
            myhp=80
            mydef=6
        else:
            gongji=random.randint(30,35)
            wodezy="盜賊"
            myhp=60
            mydef=0
        print("你的攻擊力為%d" %gongji)
        print("龍哥當然是一個坦克")
        print("龍哥的攻擊力是%d" %sss)
        print("***************************************")
        print("現在 不用你充錢 我給你一個變強的機會!")
        print("Bouns: 答對這個問題 攻擊力 +10 !!")
        a=random.randint(1,100)
        b=random.randint(1,100)
        c=a+b
        ee=input("請問! %d+%d等於多少!:" %(a,b))
        ee=int(ee)
        if ee==c:
            print("答對了!攻擊力增加10點!")
            gongji+=10
            print("現在 你的攻擊力是 %d !!!" %(gongji))
        else:
            print("答錯了!很遺憾你失去了變強的機會!")
        print("*********************************************************")
        print("為了助你打敗龍哥 我贈你1000金幣 可以用來購買裝備讓自己變強")
        me.set_money(1000)
        me.set_damage(gongji)
        me.set_defense(mydef)
        me.set_hp(myhp)
        me.set_name("lancer")
        break
    while True:
        count=0
        print("1.  與倪海龍閒聊幾句")
        print("2.  與倪海龍決鬥!!")
        print("3.  進入商城        ")
        print("4,  退出決鬥場      ")
        cd=input("您接下來的選擇是:")
        if cd=='1':
            count=0
            while count<3:
                ju=random.randint(0,5)
                print("龍哥說:%s" %list1[ju])
                count+=1
        elif cd=='3':
            while True:
                print("歡迎來到商城")
                ccc=input("*********************************************************\n選擇你要購買的裝備:\n1.長劍 售價100 效果 攻擊力+10\n2.紅水晶 售價50 效果 血量+10\n3.退出\n你的選擇是:")
                if ccc=='1':
                    if me.get_money()<100:
                        print("金幣不足 100 你現在只有%d個金幣" %(me.get_money()))
                    else:
                        print("購買成功 你的攻擊力+10 你現在剩下金幣%d" %(me.get_money()-100))
                        me.set_money(me.get_money()-100)
                        me.set_damage(me.get_damage()+10)
                elif ccc=='2':
                    if me.get_money()<50:
                        print("金幣不足 50 你現在只有%d個金幣" %(me.get_money()))
                    else:
                        print("購買成功 你的血量+10 你現在剩下金幣%d" %(me.get_money()-50))
                        me.set_money(me.get_money()-50)
                        me.set_hp(me.get_hp()+10)
                elif ccc=='3':
                    break
                else:
                    print("輸入錯誤 請輸入 1 2 3來選擇功能")
                    continue
        elif cd=='2':
            print("為表地主之誼 龍哥決定讓你先出手!")
            print("——————————————————————————")
            print("--------------------決鬥開始------------------------")
            print("     Player1:%s            Player2:%s               " %(me.get_name(),com.get_name()))
            print("----------------------------------------------------")
            print(" Player1: 名字:%s 職業:%s 攻擊力:%s 生命值%s  等級:%d " %(me.get_name(),wodezy,me.get_damage(),me.get_hp(),mylevel))
            print(" Player2: 名字:%s 職業:坦克 攻擊力:%s 生命值%s 等級:%d        " %(com.get_name(),com.get_damage(),com.get_hp(),comlevel))
            print("----------------------------------------------------")
            mycsd=me.get_damage()
            mycshp=me.get_hp()
            comcsd=com.get_damage()
            comcshp=com.get_hp()
            while True:
                me.attack(com)
                if com.get_hp()<=0:
                    mylevel+=1
                    print("你贏得了決鬥!")
                    print("經過這次決鬥 你提升了一級!")
                    print("你的Hp增加了10 傷害增加了5點!")
                    me.set_damage(mycsd+5)
                    me.set_hp(mycshp+10)
                    com.set_damage(comcsd)
                    com.set_hp(comcshp)
                    print("現在 你的hp是%d 你的攻擊力是%d" %(me.get_hp(),me.get_damage()))
                    ff=1
                    count+=1
                    break
                print("----------------------------------------------------")
                time.sleep(1)
                com.attack(me)
                if me.get_hp()<=0:
                    comlevel+=1
                    print("龍哥贏得了決鬥!")
                    #print("你贏得了決鬥!")
                    print("經過這次決鬥 龍哥提升了一級!")
                    print("龍哥的Hp增加了10 傷害增加了5點!")
                    com.set_damage(comcsd+5)
                    com.set_hp(comcshp+10)
                    me.set_damage(mycsd)
                    me.set_hp(mycshp)
                    print("現在 龍哥的hp是%d 你的攻擊力是%d" %(com.get_hp(),com.get_damage()))
                    ff=1
                    count+=1
                    break
                print("----------------------------------------------------")
                time.sleep(1)
        elif cd=='4':
            break
        else:
            print("輸入錯誤 請重新輸入")
        if ff==1:
            continue      
if __name__=='__main__':
    main();
'''
z
zz
z
z
z
z
z
z
z
'''