python_test3(类与对象)
命中注定我克你
项目简述:设置三个不同的角色,角色之间存在相互克制的三角关系,
第一阶段:写出运行游戏的类(打包项目二的函数为类)
第二阶段:写出三个角色的类(类的继承与实例化)
第三阶段:为三个角色的类添加类方法(创建角色之间相互克制的类方法)
第一阶段
打包类,在所有的类方法加上self为第一个参数,调用类时就变成【self.变量】
把生成初始角色的信息列表和执行游戏的相关函数,作为初始化函数,到时候直接实例化对象game=Game()
import time,random # 将变量放在类里面,作为类属性 class Game(): player_list = ['【德玛西亚皇子】','【德玛西亚之力】','【无双剑姬】','【光辉女郎】','【暗夜猎手】','【龙血武姬】'] enemy_list = ['【诺克萨斯统领】','【诡术妖姬】','【荣耀行刑官】','【刀锋之影】','【亡灵勇士】','【嗜血猎手】'] player_info = {} enemy_info = {} # 初始化函数 def __init__(self): # 随机抽取3个角色名形成玩家角色列表和敌人角色列表 self.players = random.sample(self.player_list,3) self.enemies = random.sample(self.enemy_list,3) # 然后执行游戏流程的相关函数 self.show_role() self.order_role() self.pk_role() # 角色排序,选择出场顺序。 def order_role(self): # 在类方法中加入self作为参数 order_dict = {} for i in range(3): order = int(input('你想将 %s 放在第几个上场?(输入数字1~3)'% self.players[i])) order_dict[order] = self.players[i] self.players = [] # 变量前加上self.其余几处同理 for i in range(1,4): self.players.append(order_dict[i]) print('\n我方角色的出场顺序是:%s、%s、%s' %(self.players[0],self.players[1],self.players[2])) print('敌方角色的出场顺序是:%s、%s、%s' %(self.enemies[0],self.enemies[1],self.enemies[2]))
第二阶段
因为我们规定的是三个角色之间存在互相克制的关系,所以我们就需要将他们的攻击力和生命值都做出相应的调整,先把一定范围内的攻击力与生命值作为初始值,然后【骑士】的生命值是初始值的5倍,攻击力是3倍,【刺客】的生命值是初始值的3倍,攻击力是5倍,【射手】的生命值是初始值的4倍,攻击力是4倍,
import random import time # 创建一个类,可实例化成具体的游戏角色 class Role(): def __init__(self, name='【角色】'): # 把角色名作为默认参数 self.name = name self.life = random.randint(100,150) self.attack = random.randint(30,50) # 创建三个子类,可实例化为3个不同类型的角色 class Knight(Role): def __init__(self, name='【圣光骑士】'): # 把子类角色名作为默认参数 Role.__init__(self,name) # 利用了父类的初始化函数 self.life = self.life*5 # 骑士有5份血量 self.attack = self.attack*3 # 骑士有3份攻击力 class Assassin(Role): def __init__(self, name='【暗影刺客】'): Role.__init__(self,name) self.life = self.life*3 self.attack = self.attack*5 class Bowman(Role): def __init__(self, name='【精灵弩手】'): Role.__init__(self,name) self.life = self.life*4 self.attack = self.attack*4 # 创建一个类,可生成3V3并展示:可分为:欢迎语→随机生成→展示角色 class Game: def __init__(self): # 初始化各种变量 self.players = [] self.enemies = [] self.score = 0 # 执行各种游戏函数 self.game_start() self.born_role() self.show_role() # 欢迎语 def game_start(self): print('------------ 欢迎来到“PK小游戏” ------------') print('将自动生成【玩家角色】和【电脑人物】') input('请按回车键继续。') # 随机生成6个角色 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 show_role(self): print('----------------- 角色信息 -----------------') print('你的队伍:') for i in range(3): print( '『我方』%s 血量:%s 攻击:%s'% (self.players[i].name,self.players[i].life,self.players[i].attack)) print('--------------------------------------------') print('敌人队伍:') for i in range(3): print('『敌方』%s 血量:%s 攻击:%s'% (self.enemies[i].name,self.enemies[i].life,self.enemies[i].attack)) print('--------------------------------------------') gp = Game() # 运行游戏
效果图
第三阶段
我们要把属性相克给解决一下,【射手】碰到【骑士】,攻击力大增50%,【刺客】碰到【射手】攻击力大增50%,【骑士】碰到【刺客】攻击力大增50%
主要是定义一个buff的类方法,然后在游戏开始前进行匹配是否为属性相克角色就是下方的这个代码
self.players[i].fight_buff(self.enemies[i])
self.enemies[i].fight_buff(self.players[i])
再加入pk的类方法
最后进行实例化
import random import time # 创建一个类,可实例化成具体的游戏角色 class Role: def __init__(self, name='【角色】'): # 把角色名作为默认参数 self.name = name self.life = random.randint(100,150) self.attack = random.randint(30,50) # 创建3个子类,可实例化为3个不同的职业 class Knight(Role): def __init__(self, name='【圣光骑士】'): # 把子类角色名作为默认参数 Role.__init__(self,name) # 利用了父类的初始化函数 self.life = self.life*5 # 骑士有5份血量 self.attack = self.attack*3 # 骑士有3份攻击力 # 职业克制关系 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 = self.life*3 self.attack = self.attack*5 # 职业克制关系 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 = self.life*4 self.attack = self.attack*4 # 职业克制关系 def fight_buff(self, opponent,str1,str2): if opponent.name == '【圣光骑士】': self.attack = int(self.attack * 1.5) print('『%s』【精灵弩手】对 『%s』【圣光骑士】说:“骑着倔驴又如何?你都碰不到我衣服。”'%(str1, str2)) # 创建一个类,可生成3V3并展示:可分为:欢迎语→随机生成→展示角色 class Game(): def __init__(self): self.players = [] # 存玩家顺序 self.enemies = [] # 存敌人顺序 self.score = 0 # 比赛积分 self.i = 0 # 记轮次 # 依次执行以下函数 self.game_start() # 欢迎语 self.born_role() # 随机生成6个角色 self.show_role() # 展示角色 self.order_role() # 排序并展示 self.pk_role() # 让双方 Pk 并展示结果 self.show_result() # 展示最终结局 # 欢迎语 def game_start(self): print('------------ 欢迎来到“炼狱角斗场” ------------') print('在昔日的黄昏山脉,奥卢帝国的北境边界上,有传说中的“炼狱角斗场”。') print('鲜血与战斗是角斗士的归宿,金钱与荣耀是角斗士的信仰!') print('今日,只要你【你的队伍】能取得胜利,你将获得一笔够花500年的财富。') time.sleep(2) print('将随机生成【你的队伍】和【敌人队伍】!') input('\n狭路相逢勇者胜,请按任意键继续。\n') # 随机生成6个角色 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 show_role(self): print('----------------- 角色信息 -----------------') print('你的队伍:') for i in range(3): print( '『我方』%s 血量:%s 攻击:%s'% (self.players[i].name,self.players[i].life,self.players[i].attack)) print('--------------------------------------------') print('敌人队伍:') for i in range(3): print('『敌方』%s 血量:%s 攻击:%s'% (self.enemies[i].name,self.enemies[i].life,self.enemies[i].attack)) print('--------------------------------------------') input('请按回车键继续。\n') # 排序并展示 def order_role(self): 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('敌人队伍出场顺序是:%s、%s、%s' %(self.enemies[0].name,self.enemies[1].name,self.enemies[2].name)) # 让双方 Pk 并展示结果 def pk_role(self): for i in range(3): print('\n----------------- 【第%s轮】 -----------------' % (i+1)) # 每一局开战前加buff self.players[i].fight_buff(self.enemies[i],'我方','敌方') self.enemies[i].fight_buff(self.players[i],'敌方','我方') input('\n战斗双方准备完毕,请按回车键继续。') print('--------------------------------------------') 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 剩余血量 %s'% (self.players[i].name,self.enemies[i].name,self.enemies[i].life)) print('敌方%s 发起了攻击,我方%s 剩余血量 %s'% (self.enemies[i].name,self.players[i].name,self.players[i].life)) print('--------------------------------------------') time.sleep(1) 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我的天,他们俩都死了啊!') # 展示最终结局 def show_result(self): input('\n请按回车查看最终结果。\n') if self.score >0: print('【最终结果】\n你赢了,最终的财宝都归你了!') elif self.score == 0: print('【最终结果】\n你没有胜利,但也没有失败,在夜色中灰溜溜离开了奥卢帝国。') else: print('【最终结果】\n你输了。炼狱角斗场又多了几具枯骨。') game = Game()
效果动图: