鱼C论坛

 找回密码
 立即注册
查看: 1499|回复: 3

[作品展示] 新手入门,写了个python名字打架

[复制链接]
发表于 2018-8-19 13:03:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 dhy326598 于 2018-8-19 18:19 编辑

QQ截图20180819122126.png QQ截图20180819122357.png QQ截图20180819122748.png QQ截图20180819122920.png QQ截图20180819123026.png
写了个简单的交互式界面,具体用法不多说
同样的名字生成初始属性是固定的,但是战斗过程,闪避,伤害值浮动,攻击防御方特殊事件的触发是随机的,但是概率又与双方属性有关,欢迎大家试玩指点。
大家也可以修改成各种骚话台词,修改各种属性参数,或者修改攻击闪避的计算方法
去掉了一些没必要的全局变量

  1. #作者:碘化银  343949949  日期:2018.8.19
  2. from random import *
  3. from time import *
  4. from tkinter import *
  5. def pw(name):
  6.     #生成双方各项能力值的函数
  7.     p = 1
  8.     for i in name:
  9.         p*= ord(i)+1  #每一个字符的编码相乘
  10.         while (p%10==0):
  11.             p = int(p/10)  #去掉末尾的0
  12.     while (p<10000000000000): #如果不足14位则重复
  13.         for i in name:
  14.             p*= (ord(i)*2+1)  #改变规则
  15.             while (p%10==0):
  16.                 p = int(p/10) #去掉末尾0
  17.             if (p>10000000000000):
  18.                 break   #p为一14位或更高位数字
  19.     gong = int(str(p)[:2])      #攻击随机值,实际取值在50~150
  20.     fang = int(str(p)[2:4])     #防御随机值,实际取值在50~100
  21.     shan = int(str(p)[4:6])     #闪避随机值,实际取值在20~120
  22.     ming = int(str(p)[6:8])     #命中随机值,实际取值在20~120
  23.     xing = int(str(p)[8:10])    #幸运随机值,实际取值在50~130
  24.     speed = int(str(p)[10:12])  #速度随机值,实际取值在100~200
  25.     xue = 700-gong-fang-shan-ming-xing-speed  #血等于700-其他所有随机值之和
  26.     return gong+50,fang//2+50,shan+20,ming+20,int(xing*0.8)+50,speed+100,xue  #输出每一项实际属性值
  27. def huihe(i):  #i代表行动方,1-i代表对方
  28.     #行动回合判定,由速度高的一方开始,双方依次增加行动值:速度±幸运//5,达到500的一方开始行动
  29.     #闪避率判定:(4+闪避/命中)*0.05
  30.     #伤害值判定:(攻击/防御)*32,浮动值±幸运//5
  31.     #攻击方特殊事件:1、暴击,2、吸血,3、击晕,4、削弱,概率:幸运/500+0.05,命中时才能触发,触发时四种事件任选一种概率相同
  32.     #暴击:暴击时伤害加倍,吸血:伤害转化为攻击方生命值,击晕:跳过对方下次行动回合,削弱:对方各项属性降低10%,本场永久有效
  33.     #防御方特殊事件:1、反击,2、招架,3、觉醒,4、回春,概率:幸运/500+0.05,对方命中时才能触发,触发时四种事件任选一种概率相同
  34.     #反击:反弹100%伤害,招架:此次伤害降低到原来的0.05~0.10,觉醒:此次战斗各项属性增加10%,本场永久有效,回春:回复当前损失血量的1/3~2/3
  35.     global vname,vg,vf,vs,vm,vx,vh,vhm,d12,vsp
  36.     if (d12[i]==1):  #判断是否在眩晕状态,如果是,则该回合不行动
  37.         d12[i]=0
  38.         return choice(['{}顿时感觉天旋地转,不知所措,好不容易缓过神来'.format(vname[i]),'{}眼前一黑,昏迷了许久,终于清醒了过来'.format(vname[i]),'{0}倒在地上,等Ta爬起来的时候发现对方又冲向了Ta'.format(vname[i])])
  39.     rt1 = choice(['{}对{}发起攻击'.format(vname[i],vname[1-i]),'{}怒气冲冲,给了{}一拳'.format(vname[i],vname[1-i]),'{}拿起了{},向{}砸过去'.format(vname[i],choice(['拖把','金工实习磨的小铁锤','一本《高等数学》','十年前买的诺基亚']),vname[1-i])])
  40.     if (random()<(1+vs[1-i]/vm[i])*0.1):#判断闪避
  41.         rt1 +=  choice([',当危险向{}袭来的时候Ta竟然一点也不慌,Ta淡定地使用移形换位,躲过了这次伤害'.format(vname[1-i]),',还好{}动作快,直接躲了过去'.format(vname[1-i]),',被{}闪避'.format(vname[1-i])])
  42.         return rt1  #触发闪避后直接返回调用处
  43.     sh = int((vg[i]/vf[1-i])*32)+16 + randint(-vx[i]//5,vx[i]//5)    #生成伤害值
  44.     t1 = randint(0,3)     #攻击方特殊事件类型生成
  45.     t2 = randint(0,3)     #防御方特殊事件类型生成
  46.     if (random()>vx[1-i]/500+0.05):
  47.         t2=-1  #防御方不发动特殊事件
  48.     if (random()<vx[i]/500+0.05):  
  49.         if (t1==0):
  50.             #暴击
  51.             sh*=2 #暴击伤害加倍
  52.             rt1+= choice(['\n{}爆发出了惊人的力量,{}受到一记重击'.format(vname[i],vname[1-i]),'\n{}发动暴击'.format(vname[i]),'\n{}直接朝{}的要害打了过去'.format(vname[i],vname[1-i])])
  53.             if (t2==1):
  54.                 #招架
  55.                 sh = 1+int(sh*random()*0.05+0.05) #减免90%~95%伤害,下同
  56.                 rt1+=choice(['\n{}发动招架'.format(vname[1-i]),'\n还好{}拼死抵抗,减免了绝大部分的伤害,这次攻击终究对Ta造成不了什么'.format(vname[1-i]),',没想到{}也是块硬骨头,拼命抵抗'.format(vname[1-i])])
  57.             rt1+=',{}受到{}点伤害'.format(vname[1-i],sh)
  58.             vh[1-i]-=sh   #掉血
  59.             if (vh[1-i]<=0):
  60.                 rt1+='\n{}已死亡'.format(vname[1-i])
  61.                 vh[1-i]=0   #血量为负时置零
  62.                 return rt1
  63.         elif (t1==1 and vh[i]<vhm[i]):#只有掉血时才能触发吸血
  64.             #吸血
  65.             if (t2==1):
  66.                 #招架
  67.                 sh = 1+int(sh*random()*0.05+0.05)
  68.                 rt1+=choice(['\n{}发动招架'.format(vname[1-i]),'\n还好{}拼死抵抗,减免了绝大部分的伤害,这次攻击终究对Ta造成不了什么'.format(vname[1-i]),',没想到{}也是块硬骨头,拼命抵抗'.format(vname[1-i])])
  69.             huixue = min(sh,vhm[i]-vh[i])  #使用者回复与伤害值相同的血量,但不能超过血量上限
  70.             rt1+=',{}受到{}点伤害'.format(vname[1-i],sh)
  71.             vh[1-i]-=sh
  72.             if (vh[1-i]<=0):
  73.                 rt1+='\n{}{}'.format(vname[1-i],choice(['已死亡','挂掉了','狗带了','倒地不起,停止了呼吸']))+choice([',这下连春哥也救不了Ta了',''])
  74.                 vh[1-i]=0   #血量为负时置零
  75.                 return rt1  #先死亡后结算回血
  76.             rt1+='\n{}{},回复{}点血量'.format(vname[i],choice(['发动了吸血技能','发动了吸星大法','戴起了黑框眼镜,生命流到了Ta的身上','念了两句诗,生命流到了Ta的身上']),huixue)
  77.             vh[i]+=huixue  #回血
  78.         elif (t1==2):
  79.             #击晕
  80.             rt1+= choice(['\n{}发动狂蛮之力,将{}击晕'.format(vname[i],vname[1-i]),'\n并拿起了一本《材料科学基础》朝对面扔过去,{}看了一眼密密麻麻的内容,立刻晕倒在地'.format(vname[1-i]),'\n{}大叫一声,顿时一道巨雷从天而降,将{}劈得昏迷不醒'.format(vname[i],vname[1-i])])
  81.             d12[1-i]=1  #对方禁止行动一回合
  82.             if (t2==1):
  83.                 #招架
  84.                 sh = 1+int(sh*random()*0.05+0.05)
  85.                 rt1+=choice(['\n{}发动招架'.format(vname[1-i]),'\n还好{}拼死抵抗,减免了绝大部分的伤害,这次攻击终究对Ta造成不了什么'.format(vname[1-i]),',没想到{}也是块硬骨头,拼命抵抗'.format(vname[1-i])])
  86.             rt1+=',{}受到{}点伤害'.format(vname[1-i],sh)
  87.             vh[1-i]-=sh
  88.             if (vh[1-i]<=0):
  89.                 rt1+='\n{}{}'.format(vname[1-i],choice(['已死亡','挂掉了','狗带了','倒地不起,停止了呼吸']))+choice([',这下连春哥也救不了Ta了',''])
  90.                 vh[1-i]=0   #血量为负时置零
  91.                 return rt1
  92.         elif (t1==3):
  93.             #削弱
  94.             if (t2==1):
  95.                 #招架
  96.                 sh = 1+int(sh*random()*0.05+0.05)
  97.                 rt1+=choice(['\n{}发动招架'.format(vname[1-i]),'\n还好{}拼死抵抗,减免了绝大部分的伤害,这次攻击终究对Ta造成不了什么'.format(vname[1-i]),',没想到{}也是块硬骨头,拼命抵抗'.format(vname[1-i])])
  98.             rt1+='{}受到{}点伤害'.format(vname[1-i],sh)
  99.             vh[1-i]-=sh
  100.             if (vh[1-i]<=0):
  101.                 rt1+='\n{}{}'.format(vname[1-i],choice(['已死亡','挂掉了','狗带了','倒地不起,停止了呼吸']))+choice([',这下连春哥也救不了Ta了',''])
  102.                 vh[1-i]=0   #血量为负时置零
  103.                 return rt1  #先死亡后结算削弱
  104.             rt1+= choice(['\n{}发动投毒,{}所有属性降低10%'.format(vname[i],vname[1-i]),'\n{}给{}喂了一包20年前生产的辣条,{}感觉肚子好痛,所有属性降低10%'.format(vname[i],vname[1-i],vname[1-i])])
  105.             vg[1-i],vf[1-i],vm[1-i],vs[1-i],vsp[1-i] = int(vg[1-i]*0.9),int(vf[1-i]*0.9),int(vm[1-i]*0.9),int(vs[1-i]*0.9),int(vsp[1-i]*0.9) #各项属性降低10%
  106.     else:
  107.         #无效果
  108.         if (t2==1):
  109.             sh = 1+int(sh*random()*0.05+0.05)
  110.             rt1+=choice(['\n{}发动招架'.format(vname[1-i]),'\n还好{}拼死抵抗,减免了绝大部分的伤害,这次攻击终究对Ta造成不了什么'.format(vname[1-i]),',没想到{}也是块硬骨头,拼命抵抗'.format(vname[1-i])])
  111.         rt1+=',{}受到{}点伤害'.format(vname[1-i],sh)
  112.         vh[1-i]-=sh
  113.         if (vh[1-i]<=0):
  114.             rt1+='\n{}{}'.format(vname[1-i],choice(['已死亡','挂掉了','狗带了','倒地不起,停止了呼吸']))+choice([',这下连春哥也救不了Ta了',''])
  115.             vh[1-i]=0   #血量为负时置零
  116.             return rt1
  117.     if (t2==0):
  118.         #反击
  119.         rt1+=choice(['\n{}发动反击,{}受到{}点伤害'.format(vname[1-i],vname[i],sh),'\n{}也不是好欺负的,趁{}不注意,对Ta反戈一击,{}受到{}点伤害'.format(vname[1-i],vname[i],vname[i],sh),'\n{}气不过,反手就是一拳,{}受到{}点伤害'.format(vname[1-i],vname[i],sh)])
  120.         vh[i]-=sh
  121.         if (vh[i]<=0):#判定攻击方(被反击方)是否死亡
  122.             rt1+='\n{}{}'.format(vname[i],choice(['已死亡','挂掉了','狗带了','倒地不起,停止了呼吸']))+choice([',这下连春哥也救不了Ta了',''])
  123.             vh[i]=0   #血量为负时置零
  124.             return rt1
  125.     elif (t2==2):
  126.         #觉醒
  127.         rt1+=choice(['\n{}发动觉醒,{}所有属性增加10%'.format(vname[1-i],vname[1-i]),'\n{}信春哥,所有属性增加10%'.format(vname[1-i]),'\n没想到{}从兜里拿出一颗不知道什么的药丸,顿时功力增加了不少,所有属性增加10%'.format(vname[1-i]),'\n{}备受打击,但是在这关键时刻,Ta打通了任督二脉,所有属性增加10%'.format(vname[1-i])])
  128.         vg[1-i],vf[1-i],vm[1-i],vs[1-i],vsp[1-i] = int(vg[1-i]*1.1),int(vf[1-i]*1.1),int(vm[1-i]*1.1),int(vs[1-i]*1.1),int(vsp[1-i]*1.1)#属性强化
  129.     elif (t2==3):
  130.         #回春
  131.         hui = min(int((vhm[1-i]-vh[1-i])*(random()+1)/3),int(vhm[1-i]//2))
  132.         rt1+='\n{}{},{}回复{}点血量'.format(vname[1-i],choice(['不紧不慢地掏出黑框眼镜,生命增加了','当时只念了两句诗,引来了许多两栖动物','原来是春哥教信徒,关键的时刻信春哥,Ta得到了春哥的庇佑,生命增加','喝了一杯82年的白开水']),vname[1-i],hui)
  133.         vh[1-i]+=hui
  134.     return rt1
  135. def show():
  136.     #用于更新控件内容
  137.     global  text,root,vg,vf,vs,vm,vx,vh,vhm,vsp,la1,la2
  138.     la1.set('{}\t{}\t{}\t{}\t{}\t{}\t{}/{}'.format(vg[0],vf[0],vs[0],vm[0],vx[0],vsp[0],vh[0],vhm[0]))
  139.     la2.set('{}\t{}\t{}\t{}\t{}\t{}\t{}/{}'.format(vg[1],vf[1],vs[1],vm[1],vx[1],vsp[1],vh[1],vhm[1]))
  140.     root.update()  #刷新控件内容
  141.     return 1
  142. def main():
  143.     #主程序
  144.     global  text,root,d12,vname,vg,vf,vs,vm,vx,vh,vhm,vsp
  145.     namea = name1.get()  #获取双方名字
  146.     nameb = name2.get()
  147.     #以上是获得双方名字
  148.     if (namea == '' or nameb == ''):
  149.         text.delete('1.0','end')    #清空Text控件原有内容
  150.         text.insert(END,'名字不能为空,请重新输入') #任意一方名字为空时提示
  151.     else:
  152.         text.delete('1.0','end')    #清空Text控件原有内容
  153.         g1,f1,s1,m1,x1,sp1,h1 = pw(namea)
  154.         g2,f2,s2,m2,x2,sp2,h2 = pw(nameb)   #pw()函数获取双方各项能力值
  155.         text.insert(END,'='*60)
  156.         text.insert(END,'\n{}:\n攻击:{},防御:{},闪避:{},命中:{},幸运:{},速度:{},血量:{}'.format(namea,g1,f1,s1,m1,x1,sp1,h1))   
  157.         text.insert(END,'\n{}:\n攻击:{},防御:{},闪避:{},命中:{},幸运:{},速度:{},血量:{}'.format(nameb,g2,f2,s2,m2,x2,sp2,h2))
  158.         text.insert(END,'\n'+'='*60)  #向text写入初始内容,即双方属性值
  159.         vname,vg,vf,vs,vm,vx,vh,vhm,vsp=[namea,nameb],[g1,g2],[f1,f2],[s1,s2],[m1,m2],[x1,x2],[h1,h2],[h1,h2],[sp1,sp2]  #保存为列表形式
  160.         act=[0,0]   #行动值,置0
  161.         d12=[0,0]   #眩晕状态变量,为1时眩晕状态
  162.         show()
  163.         #以上获得并输出双方各项属性
  164.         sleep(1)
  165.         fr=0 if (sp1>sp2) else 1 #判定先手,谁速度大谁先手
  166.         while (h1>0 and h2>0):
  167.             #行动回合,判断行动值,谁先到达500谁动手
  168.             if (act[fr]<500):
  169.                 act[fr] += vsp[fr]+randint(-vx[fr]//5,vx[fr]//5)  #行动值每次增加等于速度,浮动值为±幸运//5
  170.             else:
  171.                 neirong = '\n'+huihe(fr)  #写入内容
  172.                 text.insert(END,neirong)  #text控件写入
  173.                 show()  #更新控件显示
  174.                 act[fr]-=500  #行动一回合后行动值减少500
  175.                 if (vh[0]<=0 or vh[1]<=0):
  176.                     break  #任意一方死亡即退出循环
  177.                 show()  #更新控件显示
  178.                 sleep(1)  #延时1s
  179.             if (act[1-fr]<500):
  180.                 act[1-fr]+= vsp[1 -fr]+randint(-vx[1-fr]//5,vx[1-fr]//5)
  181.                
  182.             else:
  183.                 neirong = '\n'+huihe(1-fr) #写入内容
  184.                 text.insert(END,neirong)   #向text控件写入
  185.                 show()  #更新控件显示
  186.                 act[1-fr]-=500  #行动一回合后行动值减少500
  187.                 if (vh[0]<=0 or vh[1]<=0):
  188.                     break  #任意一方死亡退出循环
  189.                 show()
  190.                 sleep(1)
  191. root = Tk()
  192. root.title('名字打架')
  193. name1 = StringVar()
  194. name2 = StringVar()
  195. shown = StringVar()
  196. la1 = StringVar()
  197. la2 = StringVar()
  198. Label(root,text='输入A方名字:').grid(row=0,column=0)
  199. Entry(root,textvariable = name1).grid(row=1,column=0)
  200. Label(root,text='输入B方名字:').grid(row=2,column=0)
  201. Entry(root,textvariable = name2).grid(row=3,column=0)
  202. Label(root,text='攻击\t防御\t闪避\t命中\t幸运\t速度\t血量').grid(row=0,column=1)
  203. label1 = Label(root,textvariable=la1)
  204. label1.grid(row=1,column=1)
  205. Label(root,text='攻击\t防御\t闪避\t命中\t幸运\t速度\t血量').grid(row=2,column=1)
  206. label2 = Label(root,textvariable=la2)
  207. label2.grid(row=3,column=1)
  208. Button(root,text='  开 始  ',command=main).grid(row=4,column=0)
  209. text = Text(root,width=80,height=42)
  210. text.grid(row=4,column=1)
  211. root.mainloop()  #显示
复制代码

评分

参与人数 1荣誉 +1 鱼币 +5 收起 理由
叼辣条闯世界 + 1 + 5 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-19 15:22:36 | 显示全部楼层
楼主厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-19 16:59:08 | 显示全部楼层
这么多global变量,我的电脑运行不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-25 23:46:54 | 显示全部楼层
厉害厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 14:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表