Python实训 姓名大作战进阶版(封装,继承)

本文介绍了一个基于姓名和角色选择的回合制战斗游戏的Python代码实现。游戏包含法师、战士、ADC和奶妈四个角色,每个角色有独特的技能和属性。玩家通过输入姓名和选择角色开始游戏,进行攻防回合直至一方生命值归零。

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

简介:

发表人:蒲成伟
发表时间:2020-5-15
发表目的:保存代码以便后期查询,可以参考,严禁抄袭。。。。

题目要求:

实验内容
在上一实验“姓名大作战小游戏设计开发”的基础上,完成如下要求:
(1)战斗过程采用回合制,每次攻击由游戏者来操纵
(2)引入行动力概念,每个玩家每回合有十点行动力,玩家的每次行动都会消耗一定的行动力,行动力不足时则无法行动,若无特殊技能,本回合剩余行动力将在回合结束后清空。
(3)设定四到六个角色,每个角色拥有自己的特殊技能(例如本回合攻击力上升点、本回合防御力上升点、治愈伤害点、本回合剩余行动力存入下回合使用、本回合行动所消耗行动力降低点、本回合剩余行动力用于增加防御力……等),注:使用角色的特殊技能也要消耗行动力(具体消耗数值自己设定),为了降低编程难度,角色的特殊技能只能对自身属性进行加成,不能攻击对手。
(4)游戏开始时,玩家除了输入自己的姓和名之外,还要选择各自的角色。
(5)游戏开始时,除计算玩家各自的攻击力、防御力、生命值外,还需计算敏捷值(计算规则由自己确定),敏捷值用于增加对方攻击无效的概率(例如生成一个0~敏捷值之间的随机数,将该随机数和防御力相加之后再进行攻击效果判定)
(6)游戏过程:一次攻防算作一个回合,直到某一方生命值为零或负数为止。每个玩家在自己的进攻环节开始前会显示双方的攻击力、防御力、敏捷值、生命值;玩家在自己的进攻环节可以选择“攻击”、“使用技能”、“结束行动”,每次行动后都要计算并显示行动造成的影响和行动后双方的攻击力、防御力、生命值、敏捷值和剩余行动力等信息。
其他特别要求:
1、变量名、类名都要以“姓的全拼和名字的声母作为前缀”,例如学生张三的类名叫Player,那么张三实际的类名叫“ZhangsPlayer”
2、玩家应作为游戏角色的父类存在,游戏过程中只把参与游戏的对象视作玩家,而不对其具体角色进行判断。
3、玩家的各项属性除了玩家自己外,不能由外部程序修改

作者提醒:

	对玩法做出了一点改变(1)行动力每局恢复4点,且不会清零,初始值为10点
	# 1级标题

代码:

Puscharacter.py
class player:
    __xing = None
    __Ming = None
    __Name = None
    __Blood = None
    __Defense = None
    __Exocet = None
    __Stamina = 10

    def __init__(self):
        self.__Xing = input("请输入你的姓:")
        self.__Ming = input("请输入你的名:")
        for i in range(len(self.__Xing)):
            self.__Exocet = ord(self.__Xing[i])
        self.__Exocet /= 200
        for j in range(len(self.__Ming)):
            self.__Defense = ord(self.__Ming[j])
        self.__Defense /= 100
        self.__Name = self.__Xing + self.__Ming
        self.__Blood = (self.__Exocet * 6 + self.__Defense)
        self.__Defense = round(self.__Defense, 0)
        self.__Blood = round(self.__Blood, 0)
        self.__Exocet = round(self.__Exocet, 0)
        # print('{} 的血量为:{} 攻击力:{} 防御力: {}'.format(self.__name, self.__blood, self.__Exocet, self.__Defense))

    def inquire(self, blood, exocet, defense):  #实例化对象角色时,计算总的生命值
        self.__Blood += blood
        self.__Exocet += exocet
        self.__Defense += defense
        return self.__Blood, self.__Exocet, self.__Defense

    def get_Name(self):
        return self.__Name
    def get_Exocet(self):
        return self.__Exocet
    def get_Stamina(self):
        return self.__Stamina
    def get_Blood(self):
        return self.__Blood
    def get_Defense(self):
        return self.__Defense

    def set_Defense(self, num):
        self.__Defense += num
    def set_Blood(self, num):
        self.__Blood += num
    def set_Exocet(self,num):
        self.__Exocet += num
    def set_Name(self, str):
        self.__Name = str
    def set_Stamina(self, num):
        self.__Stamina += num


class Spell(player):
    __blood = 500
    __defense = 300
    __exocet = 65
    __stamina = 10
    skill = ['雪舞漫天(攻击加成80)', 80, 0, 0]  #攻击力。生命力,体力

    def __init__(self):
        super(Spell, self).__init__()
        self.__blood,self.__defense,self.__exocet=super(Spell, self).inquire(self.__blood, self.__defense, self.__exocet)  #将角色的加成属性传递给player
        self.__name=super(Spell, self).get_Name()
        print(self.get_Name()+"创建 法师 成功")
        print("血量:"+str(self.__blood)+"  护甲:"+str(self.__defense)+"  攻击力:"+str(self.__exocet))


class warrior(player):
    __blood = 500
    __defense = 300
    __exocet = 70
    __stamina = 8

    skill = ['铁铠(生命加持100)', 0, 130,0]

    def __init__(self):
        super(warrior, self).__init__()
        self.__blood,self.__defense,self.__exocet=super(warrior, self).inquire(self.__blood, self.__defense, self.__exocet)  #将角色的加成属性传递给player
        self.__name=super(warrior, self).get_Name()
        print(self.get_Name()+"创建 战士 成功")
        print("血量:"+str(self.__blood)+"  护甲:"+str(self.__defense)+"  攻击力:"+str(self.__exocet))


class striker(player):
    __blood = 200
    __defense = 100
    __exocet = 60
    __stamina = 10
    skill = ['狙击!(攻击+120,生命+10)', 120, 10,0]

    def __init__(self):
        super(striker, self).__init__()
        self.__blood,self.__defense,self.__exocet=super(striker, self).inquire(self.__blood, self.__defense, self.__exocet)  #将角色的加成属性传递给player
        self.__name=super(striker, self).get_Name()
        print(self.get_Name()+"创建 ADC 成功")
        print("血量:"+str(self.__blood)+"  护甲:"+str(self.__defense)+"  攻击力:"+str(self.__exocet))



class nurse(player):
    __blood = 700
    __defense = 400
    __exocet = 40
    __stamina = 12
    skill = ['守护(体力+5,生命+150)',0,150, 5]


    def __init__(self):
        super(nurse, self).__init__()
        self.__blood,self.__defense,self.__exocet=super(nurse, self).inquire(self.__blood, self.__defense, self.__exocet)  #将角色的加成属性传递给player
        self.__name=super(nurse, self).get_Name()
        print(self.get_Name()+"创建 奶妈 成功")
        print("血量:"+str(self.__blood)+"  护甲:"+str(self.__defense)+"  攻击力:"+str(self.__exocet))

Pussetup.py
from 姓名大作战进阶重置版 import Puscharacter
import time

def select_role():
    print("                                           ")
    print("                                           ")
    print("--------------选择角色---------------")
    print("请玩家选择你的角色:")
    print("1.法师  2.战士  3.ADC  4.辅助")

    while 1:
        a = input("你的选择:")
        if a == str(1):
            return Puscharacter.Spell()
        elif a == str(2):
            return Puscharacter.warrior()
        elif a == str(3):
            return Puscharacter.striker()
        elif a == str(4):
            return Puscharacter.nurse()
        else:
            print("非法代码,请重新选择角色")


def attack(count,Attacker,Deference):
    Attacker_Name=Attacker.get_Name()
    Deference_Name=Deference.get_Name()
    if count!=1:
        print("体力恢复4点")
        Attacker.set_Stamina(4)
    print("-----------"+str(Attacker_Name)+"的回合开始-------------")
    while Attacker.get_Stamina() >= 0 and Deference.get_Blood() >0:
        print("                                           ")
        print("                                           ")
        print("-------请选择技能(体力:"+str(Attacker.get_Stamina())+")-----:")
        print("1.普通攻击(消耗2体力)")
        print("2.秘技:"+str(Attacker.skill[0])+"消耗3体力")
        print("3.退出")
        tili=[-2,-3,0]
        select=int(input("你选择:"))
        if select == 1 and Attacker.get_Stamina() >= tili[select-1]:
            if Deference.get_Defense() >= Attacker.get_Exocet():
                Attacker.set_Stamina(tili[select-1])
                Deference.set_Defense(Attacker.get_Exocet())
                time.sleep(1)
                print("攻击完成:")
                print(str(Deference_Name) + "属性如下:")
                print("血量:" + str(Deference.get_Blood()) + "护甲:" + str(Deference.get_Defense()))
            else:
                Attacker.set_Stamina(tili[select - 1])
                Deference.set_Blood(-Attacker.get_Exocet())  # 如果护甲值不足以抵挡本次攻击,   Blood-=攻击者攻击值,然后  blood+=护甲残值,最后把护甲值赋值为0;
                Deference.set_Blood (Deference.get_Defense())
                Deference.set_Defense(-Deference.get_Defense())
                time.sleep(1)
                print("攻击完成:")
                print(str(Deference_Name) + "属性如下:")
                print("血量:" + str(Deference.get_Blood()) + "护甲:" + str(Deference.get_Defense()))
        elif select == 1 and Attacker.get_Stamina() < tili[select-1]:
            print("体力不足,请重新选择")
            time.sleep(1)
        elif select == 2 and Attacker.get_Stamina() >= tili[select-1]:
            Attacker.set_Blood(+Attacker.skill[2])
            if Deference.get_Defense() >= Attacker.get_Exocet()+Attacker.skill[1]:
                Attacker.set_Stamina(tili[select-1])
                Deference.set_Defense(Attacker.get_Exocet())
                time.sleep(1)
                print("攻击完成:")
                print(str(Deference_Name) + "属性如下:")
                print("血量:" + str(Deference.get_Blood()) + "护甲:" + str(Deference.get_Defense()))
            else:
                Attacker.set_Stamina(tili[select - 1])
                Attacker.set_Exocet(Attacker.skill[1])
                Attacker.set_Blood(Attacker.skill[2])
                Attacker.set_Stamina(Attacker.skill[3])
                time.sleep(1)
                print("攻击完成:")
                print(str(Deference_Name)+"属性如下:")
                print("血量:" + str(Deference.get_Blood()) + "护甲:" + str(Deference.get_Defense()))
        elif select == 2 and Attacker.get_Stamina() < tili[select-1]:
            print("体力不足,请重新选择")
            time.sleep(1)
        elif select == 3:
            print(str(Attacker.get_Name())+"的攻击回合结束")
            print("              ")
            print("              ")
            break
        else:
            print("输入无效,请重新选择")
    if Deference.get_Blood() <= 0:
        return 1   #死亡
    else:
        return 0   #还活着

if __name__ == '__main__':
    print("-----------------------------------------------------------------------------")
    print("-----------------------------欢迎来到姓名大作战-------------------------------")
    print("-----------------------------------------------------------------------------")
    player1 = select_role()
    time.sleep(1.5)
    player2 = select_role()
    for i in range(1,6):
        print("游戏将在"+str(6-i)+"秒后开始!")
        time.sleep(1)

    count = 1
    while 1:
        print("-----------------------第"+str(count)+"回合开始-----------------------")
        time.sleep(1)
        if attack(count,player1,player2) == 1:
            print(str(player1.get_Name())+"WIN")
            break
        time.sleep(2)
        print("-----------------------第"+str(count+1)+"回合开始-----------------------")
        if attack(count+1,player2,player1) == 1:
            print(str(player2.get_Name())+"WIN")
            break
        count += 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值