2zly
#南昌理工学院人工智能学院实验室WORKSHOP实践项目

import time
import random


SCRIPT_NPC_SCHOOL_SISTER = [\'你好!\',
                                  \'你好!\',
                                  \'你是新生嘛?\',
                                  \'是的\',
                                  \'想要我教你魔法吗?\',
                                  \'\n1、好的 \
                                 \n2、不用了吧,我不和学姐学魔法!\n\'
                                  ]
MAGIC_BOOKS = [
    [\'风巽千叶翔龙\', 1],
    [\'泽兑鬼尘珠\', 2],
    [\'凤翔九天\', 3]
]


class Body:  # 人物类
    LEVEL=1  #等级
    EXP=0    #经验
    NAME = \'\'  # 名字
    HP = 0  # 血量
    MAX_HP = 0  # 最大血量
    MP = 0  # 魔法值
    MAX_MP = 0  # 最大魔法值

    ATTACK = 1
    MAGIC_ATTACK = 1.3
    DEFENSE=5
    HAS_MAGIC = []  # 会的魔法

    POS_NAME = \'南昌理工学院南大门\'  # 地点  

    def __init__(self, NAME_=\'Ice NPC\',LEVEL_=1,EXP_=0, HP_=3, MP_=3, MAX_HP_=3, MAX_MP_=3, ATTACK_=1, MAGIC_ATTACK_=1.3, HAS_MAGIC_=[],
                 POS_NAME_=\'南昌理工学院南大门\', DEFENSE_=5):
        # 初始化 默认值

        self.LEVEL=LEVEL_
        self.EXP=EXP_
        self.NAME = NAME_
        self.HP = HP_
        self.MP = MP_
        self.MAX_HP = MAX_HP_
        self.MAX_MP = MAX_MP_
        self.ATTACK = ATTACK_
        self.MAGIC_ATTACK = MAGIC_ATTACK_
        self.DEFENSE=DEFENSE_
        self.POS_NAME = POS_NAME_
        self.HAS_MAGIC = HAS_MAGIC_

    def display_status(self):  # 显示人物状态  
        print(\'\n\r\', \'    状态:\' + self.NAME, end=\'\')
        print(\'\n血量:\' + \'❤\' * int(self.HP), \'\n  魔法值:\' + \'⚓\' * int(self.MP))
        print(\'地点:\' + self.POS_NAME)

        if self.HAS_MAGIC == []:
            print(\'无魔法\')
        else:
            self.display_magic()

    def display_status_fighting(self):

        print(\'\n\r\', \'    状态:\' + self.NAME, end=\'\')
        print(\'\n血量:\' + \'❤\' * int(self.HP), \'  魔法值:\' + \'⚓\' * int(self.MP))

    def display_magic(self):  # 显示魔法  
        print(self.NAME + \'会如下几种魔法:\')

        print(\'魔法名 ,消耗点数\')

        i = 0

        for iMagic in self.HAS_MAGIC:
            print(\'第\', i, \'个魔法:\', MAGIC_BOOKS[iMagic])
            i = i + 1

    def talk_to(self, NPC_, NPC_SCRIPT_, delay=0.3):
        # 按剧本和NPC聊天
        print(\'在\' + self.POS_NAME + \'遇到 \' + NPC_.NAME)

        for i in range(len(NPC_SCRIPT_)):
            if i % 2 == 1:  # 判断当前说话的人
                TURN = self.NAME
            else:
                TURN = NPC_.NAME

            print(TURN + \':\' + NPC_SCRIPT_[i])
            time.sleep(delay)

    def learn_magic_from(self, NPC_):
        # 向NPC学习魔法

        NPC_.display_magic()
        CHOOSE = input(\'是否向\' + NPC_.NAME + \'学魔法?(输入:1/2/3/no)\')

        if CHOOSE == \'1\':

            print(\'恭喜\' + self.NAME + \'学会\' + MAGIC_BOOKS[NPC_.HAS_MAGIC[0]][0] +
                  \',每次使用消耗\' + str(MAGIC_BOOKS[NPC_.HAS_MAGIC[0]][1]) + \'MP.\')
            self.HAS_MAGIC = self.HAS_MAGIC + [NPC_.HAS_MAGIC[0]]
            self.display_magic()
        elif CHOOSE == \'2\':
            print(\'恭喜\' + self.NAME + \'学会\' + MAGIC_BOOKS[NPC_.HAS_MAGIC[1]][0] +
                  \',每次使用消耗\' + str(MAGIC_BOOKS[NPC_.HAS_MAGIC[1]][1]) + \'MP.\')
            self.HAS_MAGIC = self.HAS_MAGIC + [NPC_.HAS_MAGIC[1]]
            self.display_magic()
        elif CHOOSE == \'3\':
            print(\'恭喜\' + self.NAME + \'学会\' + MAGIC_BOOKS[NPC_.HAS_MAGIC[2]][0] +
                  \',每次使用消耗\' + str(MAGIC_BOOKS[NPC_.HAS_MAGIC[2]][1]) + \'MP.\')
            self.HAS_MAGIC = self.HAS_MAGIC + [NPC_.HAS_MAGIC[2]]
            self.display_magic()    
        elif CHOOSE == \'no\':
            print(\'由于你的固执,没有学习新的魔法.\')
        else:
            print(\'不明白你说什么.\')
    def DEFENSE_(self,NPC):
        hit=self.ATTACK*(100-self.DEFENSE)%100
        return hit

    def attack_one_time(self, NPC_, iChoose_magic_=-1):  # 攻击一下NPC
        if iChoose_magic_ == -2:  # 休息,且调出自己的全面状态
            self.display_status()
        elif iChoose_magic_ == -1:  # 普通攻击
            NPC_.HP = NPC_.HP - self.ATTACK
            self.HP = NPC_.HP + self.DEFENSE
            self.EXP=self.EXP+MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]
            print(\'【\', self.NAME + \'击剑攻击\' + NPC_.NAME, \'造成了\' + str(self.ATTACK), \'点攻击】\')
            print(\'***\' + self.NAME + \'增加了\' + str(MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]) + \'点经验值***\')
            print(\'【\', self.NAME + \'消耗了\' + str(MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]) + \'点魔法】\')
            print(\'***\' + self.NAME + \'的经验值为\' + str(self.EXP) + \'***\')
        elif iChoose_magic_ in self.HAS_MAGIC:
            # print(iChoose_magic_)
            hit = self.MAGIC_ATTACK * MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]

            # print(\'hit:\',hit,\',\',self.MAGIC_ATTACK,\',\',self.HAS_MAGIC[iChoose_magic_])
            NPC_.HP = NPC_.HP - hit  # 魔法伤害=魔法消耗*魔法攻击力
            NPC_.MP = NPC_.MP - self.HAS_MAGIC[iChoose_magic_]
            NPC_.MP = NPC_.MP + self.HAS_MAGIC[iChoose_magic_]#实现魔法无消耗
            self.MP=self.MP-MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]
            self.EXP=self.EXP+MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]
            print(\'【\', self.NAME + \'用魔法\' + MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][0] + \',攻击了\' + NPC_.NAME + \',\',
                  \'造成了\' + str(hit) + \'点攻击!】\')
            print(\'***\'+self.NAME+\'增加了\'+str(MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1])+\'点经验值***\')
            print(\'【\',self.NAME+\'消耗了\'+str(MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1])+\'点魔法】\')
            print(\'***\'+self.NAME+\'的经验值为\'+str(self.EXP)+\'***\')
        if self.EXP>=2:   #如果经验值大于等于2  玩家即升一级
            print(\'***\'+self.NAME+\'已升级\')  #显示玩家已升级
            self.LEVEL=self.LEVEL+1
            self.EXP=0     #升级后 经验清零
            print(\'***\'+self.NAME+\'的等级为\'+str(self.LEVEL)+\'***\')
            # 玩家各属性提升

            self.HP=self.HP+1
            self.MP=self.MP+1
            self.MAX_HP=self.MAX_HP+1
            self.MAX_MP=self.MAX_MP+1
            self.DEFENSE=self.DEFENSE+5
            self.ATTACK=self.ATTACK+1
            self.MAGIC_ATTACK=self.MAGIC_ATTACK+0.5
            #输出玩家升级后属性值
            print(\'***\'+self.NAME+\'的HP为\'+str(self.HP)+\'***\')
            print(\'***\'+self.NAME+\'的MP为\'+str(self.MP)+\'***\')
            print(\'***\'+self.NAME+\'的最大生命为\'+str(self.MAX_HP)+\'***\')
            print(\'***\'+self.NAME+\'的最大魔法为\'+str(self.MAX_MP)+\'***\')
            print(\'***\'+self.NAME+\'的普通攻击力为\'+str(self.ATTACK)+\'***\')
            print(\'***\'+self.NAME+\'的魔法攻击为\'+str(self.MAGIC_ATTACK)+\'***\')
            print(\'***\'+self.NAME+\'的防御为\'+str(self.DEFENSE)+\'***\')


        if NPC_.HP <= 0:
            return 1
        else:
            return 0

    def fight_with(self, NPC_):
        # 挑战NPC

        print(\'【\', self.NAME + \'开始和\' + NPC_.NAME + \'战斗! !\', \'】\')

        MAX_ROUND = 100
        IS_DEAD = 0

        for ROUND in range(MAX_ROUND):

            if (ROUND % 2 == 0):
                self.display_status_fighting()
                self.display_magic()
                NPC_.display_status_fighting()

                choose_magic = int(input(\'-----使用魔法/普通攻击(-1普通攻击,0/1/2..魔法攻击,查看状态-2):\'))
                IS_DEAD = self.attack_one_time(NPC_, choose_magic)
                IS_DEAD = IS_DEAD * 2  # 用乘法,让我们不改变0,非0状态的情况下,标记是谁赢了
            else:
                choose_magic = random.choice(NPC_.HAS_MAGIC + [-1])

                IS_DEAD = NPC_.attack_one_time(self, choose_magic)
                IS_DEAD = IS_DEAD * 4  # 用乘法,让我们不改变0,非0状态的情况下,标记是谁赢了

            if IS_DEAD >= 1:
                print(\'【战斗结束】\')
                if IS_DEAD == 2:
                    print(\'【\', self.NAME + \'战胜了\' + NPC_.NAME, \'】\')
                elif IS_DEAD == 4:
                    print(\'【\', NPC_.NAME + \'战胜了\' + self.NAME, \'】\')
                return IS_DEAD

            else:
                if ROUND % 2 == 1:
                    print(\'【第\' + str(1 + int(ROUND / 2)) + \'回合结束!】\n===================================\')


class World:  # 世界类

    # 剧本:遇到学姐

    # 玩家初始化
    PLAYER = Body()

    # NPC初始化(先创造三个NPC,学姐,冰怪,火怪
    NPCs = {
        \'school elder sister\': Body(NAME_=\'school elder sister\', HAS_MAGIC_=[0, 1,2]),
        \'ice monster\': Body(NAME_=\'ice monster\', HAS_MAGIC_=[2]),
        \'fire monster\': Body(NAME_=\'fire monster\', HAS_MAGIC_=[0])
    }

    # 显示一句话:两种方式,直接显示0,以及逐步显示1
    def display_a_line(way, script=\'hello\'):
        for i in range(len(script)):
            time.sleep(0.3)
            print(\'\r\', script[0:i], end=\'\')

    # 初始化世界:            
    def init(self):
        player_name = input(\'请输入玩家名:\')

        self.PLAYER.NAME = player_name

        print(\'....南理文字RPG0.2的世界开始了.....\')

        welcome_script = \'Hi,\' + self.PLAYER.NAME + \',欢迎加入南理文字RPG0.2 \'
        # self.display_a_line(script=welcome_script)
        print(welcome_script)

        self.PLAYER.display_status()

        self.PLAYER.talk_to(self.NPCs[\'school elder sister\'],
                            SCRIPT_NPC_SCHOOL_SISTER)  # 通过NPCs集合,调取\'school elder sister\'NPC

        self.PLAYER.learn_magic_from(self.NPCs[\'school elder sister\'])

    def run(self):
        self.PLAYER.fight_with(self.NPCs[\'fire monster\'])


magic_world = World()

magic_world.init()

magic_world.run()

分类:

技术点:

相关文章: