Python实训 姓名大作战
文档介绍:
原创人:蒲成伟
发表目的:保存代码,作为以后的借鉴模型,以防数据丢失。
提示:网友可以借鉴,可以提意见,有更好的修改方案本人一定改正
实训要求
三、实验内容
姓名大作战小游戏设计和开发要求:
(1)输入两个人的姓和名。
(2)分别根据两个人的姓和名计算他们的攻击力、防御力、生命值。
提示:姓的编码为攻击力、名的编码为防御力、姓名的编码为生命值
思考:复姓、两个字的名,攻击力和防御力如何设定?
(3)开始游戏,记录两人的战斗过程和战斗结果,直到某一方的生命值为0或负数。
提示:
·战斗过程:轮流攻防
·每次攻防之后计算并显示攻击结果,攻击效果要结合双方的攻击力和防御力来设计(思考:攻击效果如何判定?)
进阶要求:
1、战斗前可以随机给双方提供武器或防具
2、战斗前可以随机给双方赋予特殊技能
3、可以在战斗时设计暴击,设计随机事件
4、战斗过程不是由计算机控制,每次攻击由游戏者来操纵
其他特别要求:
变量名、类名都要以“姓的全拼和名字的声母作为前缀”,例如学生张三的类名叫Player,那么张三实际的类名叫“ZhangsPlayer”
代码截图
main.py:
from NameAttack import Pusplayers
from NameAttack import Pusjudge
import random
import time
def readey_player1(): #系统做玩家一做战斗前的准备工作(询问需要使用哪个技能)
print("请" + player1.quanming + "选择你要使用的技能")
print("你可以选择的技能是:" + player1_skill_choosed[0], player1_skill_choosed[1], player1_skill_choosed[2])
result=islegal_choice(input("技能:"), player1_skill_choosed)
return result # 返回玩家选择的技能编号,给打斗函数告知需使用哪个技能的数据
def readey_player2(): #系统做玩家一做战斗前的准备工作(询问需要使用哪个技能)
print("请" + player2.quanming + "选择你要使用的技能")
time.sleep(0.5)
print("你可以选择的技能是:" + player2_skill_choosed[0], player2_skill_choosed[1], player2_skill_choosed[2])
time.sleep(0.5)
result=islegal_choice(input("技能:"), player2_skill_choosed)
return result
#玩家的攻击前系统做的准备#玩家的攻击前系统做的准备
def islegal_choice(num,option):
flg="技能指令有误,输入的技能不存在,你将失去本次攻击机会"
flg2="技能指令有误,输入的技能不属于你,你将失去本次攻击机会"
while(0<int(num)<7):
for i in range(len(option)):
if num == option[i]:
time.sleep(0.5)
print("你选择了技能:"+num+" :"+str(Judger.skill[int(num)-1][1]))
flg=num
return flg #判断技能是否合法,符合哪个技能,如不属于任何一个技能就告知玩家数据有误,并对战斗数值不做变更
print(flg2)
return 6
print(flg)
return 6
#判断输入的是否合法
def numerical_variation(index, attacker, Defenser):#已经确认了技能了,无需再判断是否合法,开始攻击
print("接收到的技能数值:" + str(index))
time.sleep(0.5)
index=int(index)-1
print("为保障游戏公平,玩家每局攻击力减:2000点")
time.sleep(0.5)
attacker.Exocet -=2000 #由于攻击力可以叠加,每局给玩家削减一部分攻击力
attacker.Exocet = attacker.Exocet + (Judger.skill[index])[2] #技能可以对玩家有增益的效果,先加上增益的数值再参与战斗
attacker.blood = attacker.blood + (Judger.skill[index])[6]
attacker.Defense = attacker.Defense + (Judger.skill[index])[4]
attacker.baoji = attacker.baoji + (Judger.skill[index])[3]
attacker.shanbi =(Judger.skill[index])[5]
print(attacker.quanming +
"生命值:" + str(attacker.blood) +"增加(" + str((Judger.skill[index])[6]) + ") " +
"攻击力:" + str(attacker.Exocet) + "增加(" + str((Judger.skill[index])[2]) + ") " +
"暴击率:" + str(attacker.baoji) + "增加(" + str((Judger.skill[index])[3]) + ") " +
"闪避几率:" + str(attacker.shanbi) + "增加(" + str((Judger.skill[index])[5]) + ") " +
"防御力:" + str(attacker.Defense) +"增加(" + str((Judger.skill[index])[4]) + ")") # 玩家选择技能后对各属性进行加成
time.sleep(0.5)
suijishu = random.randint(0, 100) #生成随机数,如果随机数<玩家的闪避概率,判定本次攻击无效
if suijishu <= Defenser.shanbi:#加成成功后开始攻击对手,先判断对方是否可以闪避攻击
print(Defenser.quanming + "闪避了来自" + attacker.quanming + "的攻击")
time.sleep(0.5)
return 0
else:
if Defenser.Defense > attacker.Exocet * attacker.baoji: #如果护甲可以完全抵挡本次攻击。那么血量等其他参数不变,在护甲数值上减去本次攻击数值即可(护甲值-=攻击者攻击值)
Defenser.Defense -= attacker.Exocet * attacker.baoji
print(Defenser.quanming +
"生命值:" + str(Defenser.blood) + "(受到 0 " "点伤害)" +
"攻击力:" + str(Defenser.Exocet) +
"暴击率:" + str(Defenser.baoji) +
"闪避几率:" + str(Defenser.shanbi) +
"防御力:" + str(Defenser.Defense) + "(损失" + str(attacker.Exocet * attacker.baoji) + "点护甲)")
time.sleep(0.5)
else:
Defenser.blood -= attacker.Exocet * attacker.baoji #如果护甲值不足以抵挡本次攻击, Blood-=攻击者攻击值,然后 blood+=护甲残值,最后把护甲值赋值为0;
Defenser.blood += Defenser.Defense
Defenser.Defense = 0
print(Defenser.quanming +
"生命值:" + str(Defenser.blood) + "(受到" + str(attacker.Exocet * attacker.baoji) + "点伤害)" +
"攻击力:" + str(Defenser.Exocet) +
"暴击率:" + str(Defenser.baoji) +
"闪避几率:" + str(Defenser.shanbi) +
"防御力:" + str(Defenser.Defense) + "(损失 0 点护甲)")
time.sleep(2)
if __name__ == '__main__':
print("-----------------------------------------------------------------------------")
print("-----------------------------欢迎来到姓名大作战-------------------------------")
print("-----------------------------------------------------------------------------")
player1 = Pusplayers.player()
player2 = Pusplayers.player() #实例化两个对象
Judger=Pusjudge.caipan() #创建裁判对象
player1_skill_choosed = Judger.choose_Skill(player1.quanming)
player2_skill_choosed = Judger.choose_Skill(player2.quanming) #玩家开始选择技能
Rounds=1 #定义回合数
while player1.blood>=0 and player2.blood>=0: #当满足两个玩家的Blood都>=0时,执行战斗,否则结束战斗
print(" ")
print(" ")
print(" ")
print(" ")
print(" ")
print("---------------------------第 "+str(Rounds)+" 回合开始---------------------------")
if Rounds==1: #第一回合需判定谁先开始
Attacker = Judger.which_first(player1.quanming, player2.quanming) #传入两个玩家的名字,开始随机选择并返回攻击者的姓名
if Attacker==player1.quanming:
numerical_variation(readey_player1(), player1, player2) #开始战斗,使用函数 readey_player1 执行玩家1的战斗准备工作,再讲执行结果(选择的技能编号)作为参数传递给 numerical_variation 进行战斗数据变更
Rounds+=1 #回合数加一
xianshouwanjia =1 #记录是谁先动手的
else:
numerical_variation(readey_player2(), player2, player1) #开始战斗,使用函数 readey_player2 执行玩家1的战斗准备工作,再讲执行结果(选择的技能编号)作为参数传递给 numerical_variation 进行战斗数据变更
Rounds += 1 # 回合数加一
xianshouwanjia = 2 # 记录是谁先动手的
else:
if xianshouwanjia == 2: #如果不是第一局,判断谁先动的手
if Rounds%2==0:#如果是玩家2先动手,则偶数局都为玩家二攻击,反之玩家一攻击
numerical_variation(readey_player2(), player2, player1)
Rounds += 1
else :
numerical_variation(readey_player1(), player1, player2)
Rounds += 1
else :
if Rounds%2==0:
numerical_variation(readey_player1(), player1, player2)
Rounds += 1
else :
numerical_variation(readey_player2(), player2, player1)
Rounds += 1
if player1.blood<=0:
print(player2.quanming+"终于战胜了"+player1.quanming)
else:
print(player1.quanming + "终于战胜了" + player2.quanming) #判定谁的血量<=0
print("--------游戏结束,将会在5秒后退出--------")
print("制作人:蒲成伟")
time.sleep(5)
Pusplayer:
class player:
xing = None
ming = None
quanming=None
blood=None
Exocet=None
Defense=None
baoji=0
shanbi=0
def __init__(self):
self.xing = input("请输入你的姓:")
self.ming = input("请输入你的名:")
for i in range(len(self.xing)):
self.Exocet = ord(self.xing[i])
for j in range(len(self.ming)):
self.Defense = ord(self.ming[j])
self.blood = self.Exocet + self.Defense
self.quanming=self.xing+self.ming
self.Exocet/=7
self.Exocet=round(self.Exocet,2)
print('{} 的血量为:{} 攻击力:{} 防御力: {}'.format(self.xing + self.ming, self.blood, self.Exocet, self.Defense))
Pusjudge.py
from NameAttack import Pusplayers
from NameAttack import main
import random
import time
class caipan(Pusplayers.player):
Skill_1=None
Skill_2=None
Skill_3 = None
Skill_4 = None
Skill_5 = None
Skill_6 = None
skill_1_message = [1, "雷霆半月斩", 3000, 1.2, 1300, 10, 1000] #将技能的参数都储存在数组中,方便程序调用
skill_2_message = [2,"九天雷霆山脚蹬",1500,1.1,900,40,2000]
skill_3_message = [3, "万象重生", 700, 1.1, 2300, 20, 6000]
skill_4_message = [4, "反伤刺甲", 2000, 1.15, 300, 32, 3000]
skill_5_message = [5, "火烧赤壁", 3500, 1, 0, 20, -1000]
skill_6_message = [6, "铁索连环", 200, 1, 200, 10, 500]
ERRor_message=[7,1,1,1,1,1,1]
skill=[skill_1_message,skill_2_message,skill_3_message,skill_4_message,skill_5_message,skill_6_message,ERRor_message]
def __init__(self):
print("游戏载入中...")
time.sleep(2)
self.Skill_1 = " | 技能代号: 1 ,技能: 雷霆月斩, 伤害: 3000, 暴击率: 1.2, 防御增益: 1300, 闪避增益: 10, 血量回复:1000, 技能简介:大刀之下,寸草不生 |"
self.Skill_2 = " | 技能代号: 2 ,技能: 九天雷霆, 伤害: 1500, 暴击率: 1.13, 防御增益: 900, 闪避增益: 40, 血量回复:2000, 技能简介:三十六计走为上策 |"
self.Skill_3 = " | 技能代号: 3 ,技能: 万象重生, 伤害: 700, 暴击率: 1.05, 防御增益: 2300, 闪避增益: 20, 血量回复:6000, 技能简介:稳住,待我回口血 |"
self.Skill_4 = " | 技能代号: 4 ,技能: 反伤刺甲, 伤害: 2000, 暴击率: 1.5, 防御增益: 300, 闪避增益: 32, 血量回复:3000, 技能简介:伤害转移。 |"
self.Skill_5 = " | 技能代号: 5 ,技能: 火烧赤壁, 伤害: 5000, 暴击率: 1, 防御增益: 0 闪避增益: 0, 血量回复:-1000, 技能简介:火焰攻击,真实伤害 |"
self.Skill_6 = " | 技能代号: 6 ,技能: 铁索连环, 伤害: 200, 暴击率: 1, 防御增益: 200, 闪避增益: 10, 血量回复:500, 技能简介:杀敌一千,自损八百 |"
self.Skill_7 = " | 技能代号: 7 ,技能: 错误代码, 伤害: 0, 暴击率: 1, 防御增益: 0, 闪避增益: 0, 血量回复: 0, 技能简介:后备代码,输入不符时调用 |"
print("——————————————————————————————————————————————————————————————————————————————————————")
print(str(self.Skill_1))
print(str(self.Skill_2))
print(str(self.Skill_3))
print(str(self.Skill_4))
print(str(self.Skill_5))
print(str(self.Skill_6))
print("——————————————————————————————————————————————————————————————————————————————————————")
def choose_Skill(self,name): #让玩家选择技能
player_skill1 = input(name + "请选择你的第一个技能(技能代号):")
player_skill2 = input(name + "请选择你的第二个技能:")
player_skill3 = input(name + "请选择你的第三个技能:")
player_skill_choosed=[player_skill1,player_skill2,player_skill3]
print("你选择的技能:"+str(player_skill_choosed))
return player_skill_choosed
def which_first(self,player1_quanming,player2_quanming): #随机选择哪个玩家先手
a = random.randint(0, 1)
if a == 0:
print("经系统随机选择" + player1_quanming + "先出手")
return player1_quanming
else:
print("经系统随机选择" + player2_quanming + "先出手")
return player2_quanming
程序运行截图: