dhy326598 发表于 2018-8-19 13:03:24

新手入门,写了个python名字打架

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


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

#作者:碘化银343949949日期:2018.8.19
from random import *
from time import *
from tkinter import *
def pw(name):
    #生成双方各项能力值的函数
    p = 1
    for i in name:
      p*= ord(i)+1#每一个字符的编码相乘
      while (p%10==0):
            p = int(p/10)#去掉末尾的0
    while (p<10000000000000): #如果不足14位则重复
      for i in name:
            p*= (ord(i)*2+1)#改变规则
            while (p%10==0):
                p = int(p/10) #去掉末尾0
            if (p>10000000000000):
                break   #p为一14位或更高位数字
    gong = int(str(p)[:2])      #攻击随机值,实际取值在50~150
    fang = int(str(p))   #防御随机值,实际取值在50~100
    shan = int(str(p))   #闪避随机值,实际取值在20~120
    ming = int(str(p))   #命中随机值,实际取值在20~120
    xing = int(str(p))    #幸运随机值,实际取值在50~130
    speed = int(str(p))#速度随机值,实际取值在100~200
    xue = 700-gong-fang-shan-ming-xing-speed#血等于700-其他所有随机值之和
    return gong+50,fang//2+50,shan+20,ming+20,int(xing*0.8)+50,speed+100,xue#输出每一项实际属性值
def huihe(i):#i代表行动方,1-i代表对方
    #行动回合判定,由速度高的一方开始,双方依次增加行动值:速度±幸运//5,达到500的一方开始行动
    #闪避率判定:(4+闪避/命中)*0.05
    #伤害值判定:(攻击/防御)*32,浮动值±幸运//5
    #攻击方特殊事件:1、暴击,2、吸血,3、击晕,4、削弱,概率:幸运/500+0.05,命中时才能触发,触发时四种事件任选一种概率相同
    #暴击:暴击时伤害加倍,吸血:伤害转化为攻击方生命值,击晕:跳过对方下次行动回合,削弱:对方各项属性降低10%,本场永久有效
    #防御方特殊事件:1、反击,2、招架,3、觉醒,4、回春,概率:幸运/500+0.05,对方命中时才能触发,触发时四种事件任选一种概率相同
    #反击:反弹100%伤害,招架:此次伤害降低到原来的0.05~0.10,觉醒:此次战斗各项属性增加10%,本场永久有效,回春:回复当前损失血量的1/3~2/3
    global vname,vg,vf,vs,vm,vx,vh,vhm,d12,vsp
    if (d12==1):#判断是否在眩晕状态,如果是,则该回合不行动
      d12=0
      return choice(['{}顿时感觉天旋地转,不知所措,好不容易缓过神来'.format(vname),'{}眼前一黑,昏迷了许久,终于清醒了过来'.format(vname),'{0}倒在地上,等Ta爬起来的时候发现对方又冲向了Ta'.format(vname)])
    rt1 = choice(['{}对{}发起攻击'.format(vname,vname),'{}怒气冲冲,给了{}一拳'.format(vname,vname),'{}拿起了{},向{}砸过去'.format(vname,choice(['拖把','金工实习磨的小铁锤','一本《高等数学》','十年前买的诺基亚']),vname)])
    if (random()<(1+vs/vm)*0.1):#判断闪避
      rt1 +=choice([',当危险向{}袭来的时候Ta竟然一点也不慌,Ta淡定地使用移形换位,躲过了这次伤害'.format(vname),',还好{}动作快,直接躲了过去'.format(vname),',被{}闪避'.format(vname)])
      return rt1#触发闪避后直接返回调用处
    sh = int((vg/vf)*32)+16 + randint(-vx//5,vx//5)    #生成伤害值
    t1 = randint(0,3)   #攻击方特殊事件类型生成
    t2 = randint(0,3)   #防御方特殊事件类型生成
    if (random()>vx/500+0.05):
      t2=-1#防御方不发动特殊事件
    if (random()<vx/500+0.05):
      if (t1==0):
            #暴击
            sh*=2 #暴击伤害加倍
            rt1+= choice(['\n{}爆发出了惊人的力量,{}受到一记重击'.format(vname,vname),'\n{}发动暴击'.format(vname),'\n{}直接朝{}的要害打了过去'.format(vname,vname)])
            if (t2==1):
                #招架
                sh = 1+int(sh*random()*0.05+0.05) #减免90%~95%伤害,下同
                rt1+=choice(['\n{}发动招架'.format(vname),'\n还好{}拼死抵抗,减免了绝大部分的伤害,这次攻击终究对Ta造成不了什么'.format(vname),',没想到{}也是块硬骨头,拼命抵抗'.format(vname)])
            rt1+=',{}受到{}点伤害'.format(vname,sh)
            vh-=sh   #掉血
            if (vh<=0):
                rt1+='\n{}已死亡'.format(vname)
                vh=0   #血量为负时置零
                return rt1
      elif (t1==1 and vh<vhm):#只有掉血时才能触发吸血
            #吸血
            if (t2==1):
                #招架
                sh = 1+int(sh*random()*0.05+0.05)
                rt1+=choice(['\n{}发动招架'.format(vname),'\n还好{}拼死抵抗,减免了绝大部分的伤害,这次攻击终究对Ta造成不了什么'.format(vname),',没想到{}也是块硬骨头,拼命抵抗'.format(vname)])
            huixue = min(sh,vhm-vh)#使用者回复与伤害值相同的血量,但不能超过血量上限
            rt1+=',{}受到{}点伤害'.format(vname,sh)
            vh-=sh
            if (vh<=0):
                rt1+='\n{}{}'.format(vname,choice(['已死亡','挂掉了','狗带了','倒地不起,停止了呼吸']))+choice([',这下连春哥也救不了Ta了',''])
                vh=0   #血量为负时置零
                return rt1#先死亡后结算回血
            rt1+='\n{}{},回复{}点血量'.format(vname,choice(['发动了吸血技能','发动了吸星大法','戴起了黑框眼镜,生命流到了Ta的身上','念了两句诗,生命流到了Ta的身上']),huixue)
            vh+=huixue#回血
      elif (t1==2):
            #击晕
            rt1+= choice(['\n{}发动狂蛮之力,将{}击晕'.format(vname,vname),'\n并拿起了一本《材料科学基础》朝对面扔过去,{}看了一眼密密麻麻的内容,立刻晕倒在地'.format(vname),'\n{}大叫一声,顿时一道巨雷从天而降,将{}劈得昏迷不醒'.format(vname,vname)])
            d12=1#对方禁止行动一回合
            if (t2==1):
                #招架
                sh = 1+int(sh*random()*0.05+0.05)
                rt1+=choice(['\n{}发动招架'.format(vname),'\n还好{}拼死抵抗,减免了绝大部分的伤害,这次攻击终究对Ta造成不了什么'.format(vname),',没想到{}也是块硬骨头,拼命抵抗'.format(vname)])
            rt1+=',{}受到{}点伤害'.format(vname,sh)
            vh-=sh
            if (vh<=0):
                rt1+='\n{}{}'.format(vname,choice(['已死亡','挂掉了','狗带了','倒地不起,停止了呼吸']))+choice([',这下连春哥也救不了Ta了',''])
                vh=0   #血量为负时置零
                return rt1
      elif (t1==3):
            #削弱
            if (t2==1):
                #招架
                sh = 1+int(sh*random()*0.05+0.05)
                rt1+=choice(['\n{}发动招架'.format(vname),'\n还好{}拼死抵抗,减免了绝大部分的伤害,这次攻击终究对Ta造成不了什么'.format(vname),',没想到{}也是块硬骨头,拼命抵抗'.format(vname)])
            rt1+='{}受到{}点伤害'.format(vname,sh)
            vh-=sh
            if (vh<=0):
                rt1+='\n{}{}'.format(vname,choice(['已死亡','挂掉了','狗带了','倒地不起,停止了呼吸']))+choice([',这下连春哥也救不了Ta了',''])
                vh=0   #血量为负时置零
                return rt1#先死亡后结算削弱
            rt1+= choice(['\n{}发动投毒,{}所有属性降低10%'.format(vname,vname),'\n{}给{}喂了一包20年前生产的辣条,{}感觉肚子好痛,所有属性降低10%'.format(vname,vname,vname)])
            vg,vf,vm,vs,vsp = int(vg*0.9),int(vf*0.9),int(vm*0.9),int(vs*0.9),int(vsp*0.9) #各项属性降低10%
    else:
      #无效果
      if (t2==1):
            sh = 1+int(sh*random()*0.05+0.05)
            rt1+=choice(['\n{}发动招架'.format(vname),'\n还好{}拼死抵抗,减免了绝大部分的伤害,这次攻击终究对Ta造成不了什么'.format(vname),',没想到{}也是块硬骨头,拼命抵抗'.format(vname)])
      rt1+=',{}受到{}点伤害'.format(vname,sh)
      vh-=sh
      if (vh<=0):
            rt1+='\n{}{}'.format(vname,choice(['已死亡','挂掉了','狗带了','倒地不起,停止了呼吸']))+choice([',这下连春哥也救不了Ta了',''])
            vh=0   #血量为负时置零
            return rt1
    if (t2==0):
      #反击
      rt1+=choice(['\n{}发动反击,{}受到{}点伤害'.format(vname,vname,sh),'\n{}也不是好欺负的,趁{}不注意,对Ta反戈一击,{}受到{}点伤害'.format(vname,vname,vname,sh),'\n{}气不过,反手就是一拳,{}受到{}点伤害'.format(vname,vname,sh)])
      vh-=sh
      if (vh<=0):#判定攻击方(被反击方)是否死亡
            rt1+='\n{}{}'.format(vname,choice(['已死亡','挂掉了','狗带了','倒地不起,停止了呼吸']))+choice([',这下连春哥也救不了Ta了',''])
            vh=0   #血量为负时置零
            return rt1
    elif (t2==2):
      #觉醒
      rt1+=choice(['\n{}发动觉醒,{}所有属性增加10%'.format(vname,vname),'\n{}信春哥,所有属性增加10%'.format(vname),'\n没想到{}从兜里拿出一颗不知道什么的药丸,顿时功力增加了不少,所有属性增加10%'.format(vname),'\n{}备受打击,但是在这关键时刻,Ta打通了任督二脉,所有属性增加10%'.format(vname)])
      vg,vf,vm,vs,vsp = int(vg*1.1),int(vf*1.1),int(vm*1.1),int(vs*1.1),int(vsp*1.1)#属性强化
    elif (t2==3):
      #回春
      hui = min(int((vhm-vh)*(random()+1)/3),int(vhm//2))
      rt1+='\n{}{},{}回复{}点血量'.format(vname,choice(['不紧不慢地掏出黑框眼镜,生命增加了','当时只念了两句诗,引来了许多两栖动物','原来是春哥教信徒,关键的时刻信春哥,Ta得到了春哥的庇佑,生命增加','喝了一杯82年的白开水']),vname,hui)
      vh+=hui
    return rt1
def show():
    #用于更新控件内容
    globaltext,root,vg,vf,vs,vm,vx,vh,vhm,vsp,la1,la2
    la1.set('{}\t{}\t{}\t{}\t{}\t{}\t{}/{}'.format(vg,vf,vs,vm,vx,vsp,vh,vhm))
    la2.set('{}\t{}\t{}\t{}\t{}\t{}\t{}/{}'.format(vg,vf,vs,vm,vx,vsp,vh,vhm))
    root.update()#刷新控件内容
    return 1
def main():
    #主程序
    globaltext,root,d12,vname,vg,vf,vs,vm,vx,vh,vhm,vsp
    namea = name1.get()#获取双方名字
    nameb = name2.get()
    #以上是获得双方名字
    if (namea == '' or nameb == ''):
      text.delete('1.0','end')    #清空Text控件原有内容
      text.insert(END,'名字不能为空,请重新输入') #任意一方名字为空时提示
    else:
      text.delete('1.0','end')    #清空Text控件原有内容
      g1,f1,s1,m1,x1,sp1,h1 = pw(namea)
      g2,f2,s2,m2,x2,sp2,h2 = pw(nameb)   #pw()函数获取双方各项能力值
      text.insert(END,'='*60)
      text.insert(END,'\n{}:\n攻击:{},防御:{},闪避:{},命中:{},幸运:{},速度:{},血量:{}'.format(namea,g1,f1,s1,m1,x1,sp1,h1))   
      text.insert(END,'\n{}:\n攻击:{},防御:{},闪避:{},命中:{},幸运:{},速度:{},血量:{}'.format(nameb,g2,f2,s2,m2,x2,sp2,h2))
      text.insert(END,'\n'+'='*60)#向text写入初始内容,即双方属性值
      vname,vg,vf,vs,vm,vx,vh,vhm,vsp=,,,,,,,,#保存为列表形式
      act=   #行动值,置0
      d12=   #眩晕状态变量,为1时眩晕状态
      show()
      #以上获得并输出双方各项属性
      sleep(1)
      fr=0 if (sp1>sp2) else 1 #判定先手,谁速度大谁先手
      while (h1>0 and h2>0):
            #行动回合,判断行动值,谁先到达500谁动手
            if (act<500):
                act += vsp+randint(-vx//5,vx//5)#行动值每次增加等于速度,浮动值为±幸运//5
            else:
                neirong = '\n'+huihe(fr)#写入内容
                text.insert(END,neirong)#text控件写入
                show()#更新控件显示
                act-=500#行动一回合后行动值减少500
                if (vh<=0 or vh<=0):
                  break#任意一方死亡即退出循环
                show()#更新控件显示
                sleep(1)#延时1s
            if (act<500):
                act+= vsp+randint(-vx//5,vx//5)
               
            else:
                neirong = '\n'+huihe(1-fr) #写入内容
                text.insert(END,neirong)   #向text控件写入
                show()#更新控件显示
                act-=500#行动一回合后行动值减少500
                if (vh<=0 or vh<=0):
                  break#任意一方死亡退出循环
                show()
                sleep(1)
root = Tk()
root.title('名字打架')
name1 = StringVar()
name2 = StringVar()
shown = StringVar()
la1 = StringVar()
la2 = StringVar()
Label(root,text='输入A方名字:').grid(row=0,column=0)
Entry(root,textvariable = name1).grid(row=1,column=0)
Label(root,text='输入B方名字:').grid(row=2,column=0)
Entry(root,textvariable = name2).grid(row=3,column=0)
Label(root,text='攻击\t防御\t闪避\t命中\t幸运\t速度\t血量').grid(row=0,column=1)
label1 = Label(root,textvariable=la1)
label1.grid(row=1,column=1)
Label(root,text='攻击\t防御\t闪避\t命中\t幸运\t速度\t血量').grid(row=2,column=1)
label2 = Label(root,textvariable=la2)
label2.grid(row=3,column=1)
Button(root,text='  开 始  ',command=main).grid(row=4,column=0)
text = Text(root,width=80,height=42)
text.grid(row=4,column=1)
root.mainloop()#显示

czhh 发表于 2018-8-19 15:22:36

楼主厉害

waitforlove 发表于 2018-8-19 16:59:08

这么多global变量,我的电脑运行不了{:10_266:}

hellohero 发表于 2018-10-25 23:46:54

厉害厉害
页: [1]
查看完整版本: 新手入门,写了个python名字打架