人机大战(类和对象)

python的第一个实战项目--人机大战

import time
import random

class Role():
    def __init__(self,name = '【角色】'):
        self.name = name
        self.life = random.randint(100,150)
        self.attack = random.randint(30,50)

class Knight(Role):
    def __init__(self,name = '【圣光骑士】'):
        Role.__init__(self,name)  #体现封装
        self.life = 5*self.life
        self.attack = 3*self.attack
    
    def fight_buff(self,opponent,str1,str2):
        if opponent.name == '【暗影刺客】':
            self.attack = int(self.attack * 1.5)
            print('%s【圣光骑士】对%s【暗影刺客】说:让无尽光芒制裁你的堕落!”'%(str1, str2))
    
class Assassin(Role):
    def __init__(self,name = '【暗影刺客】'):
        Role.__init__(self,name)
        self.life = 0.8*self.life
        self.attack =1.5 * self.attack
    def fight_buff(self,opponent,str1,str2):
        if opponent.name  == '【精灵弩手】':
            self.attack = int(self.attack * 1.5)
            print('『%s』【暗影刺客】对 『%s』【精灵弩手】说:“主动找死,就别怪我心狠手辣。”'%(str1, str2)) 

class Bowman(Role):
    def __init__(self,name = '【精灵弩手】'):
        Role.__init__(self,name)
        self.life = 1.2 * self.life
        self.attack = 1.2 *self.attack
    def fight_buff(self,opponent,str1,str2):
        if opponent.name  == '【圣光骑士】':
            self.attack = int(self.attack * 1.5)
            print('『%s』【精灵弩手】对 『%s』【圣光骑士】说:“骑着倔驴又如何?你都碰不到我衣服。”'%(str1, str2))

class Game():
    def __init__(self):
        self.players = []
        self.enemies = []
        self.score = 0

        self.game_start()
        self.born_role()
        self.born_role()
        self.show_role()
        self.order_role()
        self.pk_role()
        self.show_result()
    
    def game_start(self):
        print('-----欢迎来到PK小游戏--------')
        print('将自动生成【玩家角色】和【电脑 】')
        input('请按回车继续')

    # 随机生成6个角色(6个实例对象,包括name life attack 需要学习)
    def born_role(self):
        for i in range(3):
            self.players.append(random.choice([Knight(),Assassin(),Bowman()]))
            self.enemies.append(random.choice([Knight(),Assassin(),Bowman()]))

    def cooperat_role(self):
        players_list = [self.players[0].name,self.players[1].name,self.players[2].name]
        enemies_list = [self.enemies[0].name,self.enemies[1].name,self.enemies[2].name]
        players_set = set(players_list)  #set是求交集
        enemies_set = set(enemies_list)
        
        if len(players_set) == 1:
            print('我触发了“角色类型一致”的条件,每个角色的血量增加25%')
            for i in range(3):
                self.players[i].life = int(self.players[i].life * 1.25)
        if len(players_set) == 3:
            print('我方触犯了“角色类型兼备”的条件,每个角色的攻击增加25%')
            for i in range(3):
                self.players[i].attack = int(self.players[i].attack * 1.25)
        if len(enemies_set) == 1:
            print('敌方触发了"角色类型一致”的条件,每个角色的血量增加25%')
            for i in range(3):
                self.enemies[i].life = int(self.enemies[i].life * 1.25)
        if len(players_set) == 3:
            print('敌方触犯了“角色类型兼备”的条件,每个角色的攻击增加25%')
            for i in range(3):
                self.enemies[i].attack = int(self.enemies[i].attack * 1.25)
        input('请按任意键,查看【你的队伍】和【敌人队伍】的角色信息:') 
    # 生成和展示角色信息
    def show_role(self):
        # 展示我方的3个角色
        print('----------------- 角色信息 -----------------')
        print('你的人物:')
        for i in range(3):
            #(需要学习,players是一个存放三个实例对象的列表)
            print('[我方]%s  血量:%d  攻击:%d'%(self.players[i].name,self.players[i].life,self.players[i].attack))
        print('--------------------------------------------')
        print('电脑敌人:')
        
        # 展示敌方的3个角色
        for i in range(3):
            print('[敌方]%s  血量:%d  攻击:%d'%(self.enemies[i].name,self.enemies[i].life,self.enemies[i].attack))
        print('--------------------------------------------')
        input('\n请按回车键继续。\n')  # 为了让玩家更有控制感,可以插入类似的代码来切分游戏进程。

    # 角色排序,选择出场顺序。
    def order_role(self): 
        # global players  #设置全局变量,后续可以用
        order_dict = {}
        for i in range(3):
            order = int(input('你想将 %s 放在第几个上场?(输入数字1~3)'% self.players[i].name))
            order_dict[order] = self.players[i]  

        self.players = []
        for i in range(1,4):
            self.players.append(order_dict[i]) 
        
        print('\n我方角色的出场顺序是:%s、%s、%s' %(self.players[0].name,self.players[1].name,self.players[2].name))
        print('\n敌方角色的出场顺序是:%s、%s、%s' %(self.enemies[0].name,self.enemies[1].name,self.enemies[2].name))

    # 角色PK
    def pk_role(self): 
        round = 1  
        for i in range(3):  # 一共要打三局
            # 每一局开战前展示战斗信息
            print('\n----------------- 【第%d局】 -----------------' %round)
            self.players[i].fight_buff(self.enemies[i],'我方','敌方')
            self.enemies[i].fight_buff(self.players[i],'敌方','我方')

            # 开始判断血量是否都大于零,然后互扣血量。
            while self.players[i].life > 0 and self.enemies[i].life > 0:
                self.enemies[i].life -= self.players[i].attack
                self.players[i].life -= self.enemies[i].attack

                print('%s发起了攻击,%s剩余血量%d'%(self.players[i].name,self.enemies[i].name,self.players[i].life))
                print('%s发起了攻击,%s剩余血量%d'%(self.enemies[i].name,self.players[i].name,self.enemies[i].life))
                print('--------------------------')
                time.sleep(1)
            else:    
                if self.players[i].life <= 0 and self.enemies[i].life > 0:
                    print('\n 很遗憾,我方%s 挂掉了'%(self.players[i].name))
                    self.score -= 1
                elif self.players[i].life >0 and self.enemies[i].life<= 0: 
                    print('\n恭喜,我方%s 活下来了。'% (self.players[i].name))
                    self.score += 1
                else:
                    print('\n我的天,他们俩都死了啊!')

                round += 1

    # 返回单局战果和计分法所加分数。
    def show_result(self):  # 注意:该函数要设定参数,才能判断单局战果。
        input('\n按回车键 查看最后结果\n')
        if self.score >0:
            print('【最终结果】\n 你赢了,最终的财宝归你了')
        elif self.score == 0:
            print('【最终结果】\n 你没有胜利有没有失败')
        else:
            print('【最终结果】\n 你失败了')


game = Game()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值