minblack3 发表于 2022-4-12 23:45

【python】Python小白自己写的一个文字勇者冒险游戏

本帖最后由 minblack3 于 2022-4-13 08:51 编辑

刚学完Python的tkinker包,就试着写了一下一个纯文字的冒险游戏(没有插入任何的图片{:1_907:} ),用到的库都是Python自带的标准库。可能写的时候代码逻辑有点乱,有点复杂,还希望大佬多指正{:1_893:} {:1_893:}
游戏里的取名有点中二,武器防具名字参考自传奇类游戏,怪物名称参考自其他RPG类游戏,技能名字参考自传奇类游戏、洛克王国{:1_907:}
以下是代码,也可以直接下载代码源文件,附阿里云盘链接:「我的py文件」https://www.aliyundrive.com/s/tiPBvwXLAbL
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

成品图在代码下边





import random as rd
import re
# import threading
import tkinter.ttk
from tkinter import *
import tkinter.messagebox
from tkinter.simpledialog import askstring

root = Tk()
root.title("文字勇者冒险闯关小游戏v1.0")
root.geometry("1000x600+300+100")

# 画辅助线
def line():
    w = Canvas(root,width=1000,height=600)
    w.place(x=0,y=0)
    #左边竖线
    line01 = w.create_line(250,0,250,600,fill='blue',width=2)
    #底边横线
    line02 = w.create_line(0,400,1000,400,fill='blue',width=2)
    #右边竖线
    line03 = w.create_line(750,0,750,600,fill='blue',width=2)
line()

class Warrior: #定义一个勇者的类
    #传入的参数((名称,等级,金钱,剩余血,剩余蓝,当前经验,穿戴武器序号,穿戴防具序号,当前层,当前关),背包物品{[武器编号,数量],[防具编号,数量],[药剂编号,数量]})
    def __init__(self,params=('汤姆',1,0,100,10,0,0,0,1,1),baggage = {'我的武器':,'我的防具':,'我的药剂':}):
      self.Name = params
      self.Lv = params
      self.Money = params
      self.My_Hp = params
      self.My_Mp = params
      self.My_Exp = params
      self.My_Weapon = (Items.weapons],params)   #((武器数据),武器编号)
      self.My_Aromr = (Items.armors],params)
      self.floor = params
      self.level = params
      self.MExp = 50+(self.Lv-1)*10       #升级所需经验值每升一级在50基础上加10
      self.MHp = 100+(self.Lv-1)*10       #基础最大生命值是100,每升一级加10上限
      self.MMp = 10+(self.Lv-1)*10      #最大魔法值计算同上
      self.Atk = 20+(self.Lv-1)*2+(self.My_Weapon)   #总攻击力为基础攻击力20加每升一级增加的2加武器攻击力
      self.Def = (self.Lv-1)*2+ self.My_Aromr      # 默认为无基础防御力,每升一级加2点防御加防具的防御力
      self.Baggage = baggage

    #更新玩家数据
    def renew_data(self):
      self.MExp = 50+(self.Lv-1)*10
      self.MHp = 100+(self.Lv-1)*10
      self.MMp = 10+(self.Lv-1)*10
      self.Atk = 20+(self.Lv-1)*2+(self.My_Weapon)
      self.Def = (self.Lv-1)*2+ self.My_Aromr

    # 血量、蓝变化(p为0时hm_value是血量变化量,p为其他时hm_value是蓝变化量)
    def hp_mp(self,p,hm_value):
      if p==0 :
            if player.My_Hp+hm_value >= player.MHp:
                player.My_Hp = player.MHp
            elif player.My_Hp+hm_value <= 0:
                player.My_Hp = 0
                print('您已阵亡')
            else:
                player.My_Hp +=hm_value
            cl.lb_hp1.config(text=f'{player.My_Hp}/{player.MHp}')
      else:
            if player.My_Mp+hm_value >= player.MMp:
                player.My_Mp = player.MMp
            else:
                player.My_Mp += hm_value
            cl.lb_mp1.config(text=f'{player.My_Mp}/{player.MMp}')

    # 金钱、经验值变化
    def gold_exp(self,add_gold,add_exp):
      player.Money += add_gold
      if add_gold > 0 :
            cl.txt_infor.insert(0.0, "获得金币%d!\n" % add_gold)
      else:
            cl.txt_infor.insert(0.0, "花费金币%d\n" % add_gold)
      cl.lb_money1.config(text=player.Money)
      if add_exp+player.My_Exp >= player.MExp:
            if player.Lv==100:
                cl.txt_infor.insert(0.0, "您已满级!无法再升级\n")
            else:
                over_exp = add_exp + player.My_Exp - player.MExp
                player.Lv += 1
                player.renew_data()
                while True:
                  if over_exp >= player.MExp:
                        over_exp -= player.MExp
                        player.Lv += 1
                        player.renew_data()
                        continue
                  else:
                        player.My_Exp = over_exp
                        break

                else:
                  player.My_Exp = over_exp
                player.My_Hp = player.MHp
                player.My_Mp = player.MMp
                cl.lb_lv1.config(text=player.Lv)
                cl.lb_hp1.config(text=f'{player.My_Hp}/{player.MHp}')
                cl.lb_mp1.config(text=f'{player.My_Mp}/{player.MMp}')
                cl.txt_infor.insert(0.0, "升级啦,当前等级为:%d级\n"%player.Lv)
      else:
            if add_exp == 0:
                return
            else:
                player.My_Exp += add_exp
                cl.txt_infor.insert(0.0, "获得经验值%d\n"%add_exp)
      cl.lb_money1.config(text=player.Money)
      cl.lb_exp1.config(text=f'{player.My_Exp}/{player.MExp}')

    # 背包物品变化(变化类型:武器\防具\药剂,编号,变化量)
    def bag_chg(self,typ,number,value):
      item = player.Baggage
      for i in range(0,len(item),2):
            if item == number:   #判断背包中是否已有该编号的物品
                if player.Baggage+value <=0:#如果该物品变化后数目为0
                  player.Baggage = 0
                  cl.renew_bag(p=1)
                  cl.renew_wear(p=1)
                  return
                else:
                  player.Baggage += value   #已有的该物品数量+value
                  cl.renew_bag(w=1,a=1,p=1)
                  cl.renew_wear(w=1,a=1,p=1)
                  return
      player.Baggage.append(number)
      player.Baggage.append(value)
      if typ =='我的武器':    #更新装备栏和背包栏信息
            cl.renew_bag(w=1)
            cl.renew_wear(w=1)
      elif typ =='我的防具':
            cl.renew_bag(a=1)
            cl.renew_wear(a=1)
      else:
            cl.renew_bag(p=1)
            cl.renew_wear(p=1)

class Items:
    #weapons 武器一览表,武器编号:(武器名称,攻击力,稀有度颜色,售价)
    weapons = {
      0:('无',0,"#fffef9",0),
      1:('生锈的短剑',60,"#f2eada",50),2:('铁剑',70,"#f2eada",50),
      3:('青铜剑',80,"#90d7ec",60),4:('玄铁剑',90,"#90d7ec",60),
      5:('黄金剑',100,"#00ae9d",80),6:('青虹镰刀',110,"#00ae9d",80),
      7:('赤炎剑',120,"#1d953f",100),8:('青影剑',130,"#1d953f",100),
      9:('血月长刃',145,"#afb4db",120),10:('冥王剑',155,"#afb4db",120),
      11:('雷霆·鸳鸯钺',170,"#694d9f",140),12:('雷霆·虎慑',180,"#694d9f",140),
      13:('虚空·炎龙',195,"#f8aba6",200),14:('虚空·裂空斩',215,"#f8aba6",200),
      15:('龙域·龙渊之狱',230,"#de773f",250),16:('上古·鲲',270,"#de773f",250),
      17:('流光·祝融之怒',310,"#694d9f",310),18:('流光·天师法杖',310,"#694d9f",310),
      99:('创世·诛仙',99999,"#fcf16e",99999,"外挂神器,无法正常获得")
    }
    #armors 装备一览表,装备编号:(装备名称,防御力,稀有度颜色,售价)
    armors = {
      0:('无',0,"#fffef9",0),
      1:('破旧的布衣',40,"#f2eada",50),2:('铁锁甲',50,"#f2eada",50),
      3:('青铜锁甲',60,"#90d7ec",60),4:('玄铁盔甲',70,"#90d7ec",60),
      5:('黄金盔甲',90,"#00ae9d",80),6:('青光项甲',100,"#00ae9d",80),
      7:('赤炎项甲',120,"#1d953f",100),8:('彩虹长袍',130,"#1d953f",100),
      9:('长者斗篷',150,"#afb4db",120),10:('冥王守护',160,"#afb4db",120),
      11:('雷霆·鸳鸯斗篷',180,"#694d9f",140),12:('雷霆·虎啸刺甲',190,"#694d9f",140),
      13:('虚空·龙吟战袍',220,"#f8aba6",200),14:('虚空·虚无斗篷',230,"#f8aba6",200),
      15:('龙域·黑龙鳞甲',250,"#de773f",250),16:('上古·泰坦',260,"#de773f",250),
      17:('流光·蛮王守护',280,"#694d9f",310),18:('流光·天师长袍',290,"#694d9f",310),
      99:('创世·圣言',99999,"#fcf16e",99999,"外挂神器,无法正常获得")
    }
    #药剂一览表,药剂编号:(药剂名称,回复血量,回复蓝量,售价)
    potions = {
      0:('无',0,0,0),
      1:("小瓶Hp药剂",100,0,30),2:('中瓶Hp药剂',200,0,70),3:('大瓶Hp药剂',400,0,110),
      4:('特制Hp药剂',600,0,150),5:('生命之源',900,0,300),
      6:("小瓶Mp药剂",0,60,30),7:('中瓶Mp药剂',0,100,70),8:('大瓶Mp药剂',0,150,110),
      9:('特制Mp药剂',0,200,150),10:('魔力之源',0,600,300)
    }
    #技能一览表_玩家,技能编号:(技能名称,伤害值(攻击力),所需蓝)
    skills_player = {
      0:('普通攻击',40,0),1:('蓄力斩击',80,0),2:('威慑',0,0),3:('逃跑',0,0),
      4:('暗影突刺',80,6),5:('破甲强袭',100,9),6:('十字斩',140,12),7:('生命回复',0,20),8:('恶灵诅咒',170,30),
      9:('乱舞',220,40),10:('尘虚剑意',340,60),11:('银月狼爪',450,80),12:('治愈之心',550,90),13:('神罚',610,150)
    }
    # 技能一览表_怪物,技能编号:(技能名称,伤害值(攻击力))
    skills_monster = {
      0:('泥浆弹',30),1:('冲撞',30),2:('撕咬',30),
      3:('生命虹吸',30),4:('高速冲击',30),5:('寒影蛇息',30),
      6:('贯穿长矛',30),7:('砍击',30),8:('冲撞',30),
      9:('獠牙击',30),10:('死亡冲撞',30),11:('狂乱',30),
      12:('岩浆弹',30),13:('炽热灯火',30),14:('七月流火',30),
      15:('食梦',30),16:('幽灵诅咒',30),17:('冲击死光',30),
      18:('电磁风暴',30),19:('电弧',30),20:('雷霆之怒',30),
      21:('不灭之炎',30),22:('威慑咆哮',30),23:('湮灭',30),
      24:('冰咆哮',30),25:('虚无打击',30),26:('扫尾',30),
      27:('摄魂夺取',30),28:('骑士之拳',30),29:('堕落深渊',30),
      30:('圣光十字',30),31:('破魔圣光',30),32:('传说力量',30)
    }
    #monster怪物一览表,怪物编号:(怪物名称,攻击力,防御力,血量,基础掉落经验值,基础掉落金币,'(可能使用的技能)')
    monster = {
      0:('史莱姆',10,0,80,28,10,'(0,1)'),1:('食人虫',15,0,90,30,10,'(0,1)'),2:('巨型食人花',40,15,400,200,50,'(0,1,2)'),
      3:('吸血蝙蝠',25,7,100,40,14,'(3,4)'),4:('蜘蛛怪',30,8,110,45,16,"(3,4)"),5:('独眼蛇怪',50,25,500,300,60,'(3,4,5)'),
      6:('哥布林投手',40,15,150,70,20,"(6,7)"),7:('哥布林战士',42,18,165,75,22,"(6,7)"),8:('哥布林首领',60,30,600,400,65,"(6,7,8)"),
      9:('荒漠狼',47,20,200,90,23,"(9,10)"),10:('披毛犀',50,22,210,93,25,"(9,10)"),11:('魔化剑齿虎',70,35,700,500,70,"(9,10,11)"),
      12:('岩浆虫',55,25,225,110,30,"(12,13)"),13:('火蜥蜴',58,27,230,113,35,"(12,13)"),14:('熔岩领主',80,40,800,600,90,"(12,13,14)"),
      15:('梦魇',65,40,400,115,40,'(15,16)'),16:('无主幽灵',68,45,410,117,45,'(15,16)'),17:('幽冥之主',90,45,900,700,110,'(15,16,17)'),
      18:('雷鸟',75,50,500,130,50,'(18,19)'),19:('闪电豹',77,55,510,135,52,'(18,19)'),20:('雷霆虎王',120,55,1000,750,130,'(18,19,20)'),
      21:('火凤',90,70,610,155,57,'(21,22)'),22:('浴火麒麟',95,75,620,160,59,'(21,22)'),23:('虚空领主',150,70,1100,810,150,'(21,22,23)'),
      24:('冰祝龙',100,90,700,180,65,'(24,25)'),25:('裂空玄鸟',110,100,720,185,67,'(24,25)'),26:('硬甲黑龙',180,90,1200,920,160,'(24,25,26)'),
      27:('堕天使',120,100,800,208,70,'(27,28)'),28:('暗黑骑士',130,110,820,210,74,'(27,28)'),29:('暗黑阿努比斯',270,150,1500,1100,170,'(27,28,29)'),
      30:('六翼天使',250,200,1100,400,100,'(30,31)'),31:('流光独角兽',280,250,1300,400,110,'(30,31)'),32:('远古利维坦',350,350,2000,1000,500,'(30,31,32)')
    }

class Action(Warrior):
    def __init__(self):
      self.war_peace = False#True为战斗中 False为战斗外
      self.boss = False   #True为boss, False为普通小怪
      self.welfare = False #True战胜boss时的奖励关闭,False为奖励关闭,用于第10层和11层
      self.rounds = False#True为怪物回合 False玩家回合
      self.monster = Items.monster #怪物的数据
      self.monster_name = self.monster
      self.monster_atk = self.monster
      self.monster_def = self.monster
      self.monster_hp = self.monster
      self.monster_skill = self.monster #怪物可使用的技能

    #怪物回合
    def monster_round(self):
      num = rd.choice(eval(self.monster_skill))   # 随机一个技能
      skill = Items.skills_monster#随机到的技能信息
      hp_value = self.monster_atk + skill - player.Def# 造成的伤害=怪物攻击力+怪物技能伤害-玩家防御力
      if hp_value < 0 :   #如果计算出来的的伤害值为负,则伤害值变成1
            hp_value = 1
      player.hp_mp(0, -hp_value)
      cl.lb_hp1.config(text=f'{player.My_Hp}/{player.MHp}')
      cl.txt_infor.insert(0.0, f'{self.monster_name} 使用了: {skill} ,造成了 {hp_value} 点伤害\n')
      self.rounds = False# 怪物回合结束
      #判断玩家是否阵亡
      if player.My_Hp <= 0:
            cl.txt_infor.insert(0.0, '很遗憾,您已阵亡!\n游戏结束!\n')
            ac.war_peace = False# 战斗结束
            self.welfare = False
            Y_N = tkinter.messagebox.askyesno('游戏结束', '您已阵亡,是否复活?(不限次数)')# 是/否,返回值true/false
            if Y_N:
                cl.txt_infor.insert(0.0, '===========您已复活!==========\n===========战斗终止==========\n')
                player.My_Hp = player.MHp
                player.My_Mp = player.MMp
                cl.lb_hp1.config(text=f'{player.My_Hp}/{player.MHp}')
                cl.lb_mp1.config(text=f'{player.My_Mp}/{player.MMp}')
                return
            else:
                cl.txt_infor.delete(0.0, END)
                cl.txt_infor.insert(0.0, '===========您已开始新游戏==========\n')
                player.Lv = 1
                player.Money = 0
                player.My_Hp = 100
                player.My_Mp = 10
                player.My_Exp = 0
                player.My_Weapon = (Items.weapons, 0)# ((武器数据),武器编号)
                player.My_Aromr = (Items.armors, 0)
                player.floor = 1
                player.level = 1
                player.Baggage = {'我的武器': , '我的防具': , '我的药剂': }
                player.renew_data()
                cl.renew_infor()
                cl.renew_wear(w=1,a=1,p=1)
                cl.renew_bag(w=1,a=1,p=1)
                return

    # 战斗函数(怪物序号)
    def war(self, num):
      ac.war_peace = True   #切换战斗状态为 战斗中
      self.monster_num = num#怪物编号
      self.monster = Items.monster   #对应的怪物信息
      self.monster_name = self.monster
      self.monster_atk = self.monster
      self.monster_def = self.monster
      self.monster_hp = self.monster
      self.monster_skill = self.monster #怪物可使用的技能
      cl.txt_infor.insert(0.0, f'{"战斗开始!":=^20}\n')
      if (num+1)%3 == 0:
            self.boss = True    #确定为boss
            if player.floor < 10:
                self.welfare = True#战胜boss时的奖励激活
                cl.txt_infor.insert(0.0,'/////遭遇本层领主!击败可获得专属奖励!/////\n')
            else:
                cl.txt_infor.insert(0.0, '/////////boss较强,谨慎行动////////\n')
            cl.txt_infor.insert(0.0, f'boss信息:\nboss名称:{self.monster_name}, 血量:{self.monster_hp}, '
                                     f'攻击力:{self.monster_atk}, 防御力:{self.monster_def}\n')
      else:
            cl.txt_infor.insert(0.0, f'怪物信息:\n怪物名称:{self.monster_name}, 血量:{self.monster_hp}, '
                                     f'攻击力:{self.monster_atk}, 防御力:{self.monster_def}\n')

    # 读档函数
    def read_data(self):
      try:
            f = open('文字冒险小游戏玩家数据.txt', 'r+', encoding='UTF-8')
            file1 = f.readline()# 读取文件第一行的内容
            file2 = f.readline()# 读取文件第二行的内容
            print('读档开始')
            data1 = re.findall("(\(.*?\))", file1)
            data2 = re.findall("(\{.*?\})", file2)
            params = eval(data1)
            baggage = eval(data2)
            player.__init__(params,baggage)
            player.renew_data()
            cl.renew_infor()
            if player.level != 1:   #判断是否在每层的第一关,不是则关闭窗口
                cl.btn_shop.place(x=0, y=0, width=0, height=0)
            else:
                cl.btn_shop.place(x=650, y=300, width=60, height=50)
            cl.txt_infor.insert(0.0,'存档读取成功!游戏继续!\n')
            print('读档结束')
      except FileNotFoundError:
            cl.txt_infor.insert(0.0,'没有存档或存档出错,将开始新游戏\n')
            cl.txt_infor.insert(0.0,'==========开始新游戏=========\n')
            print('没有存档或存档出错')

    # 存档函数,每5分钟自动存档
    def save_data(self):
      w_items = []
      a_items = []
      p_items = []
      params = (player.Name,player.Lv,player.Money,player.My_Hp,\
               player.My_Mp,player.My_Exp,player.My_Weapon,player.My_Aromr,
                  player.floor,player.level)
      for i in range(0,len(player.Baggage['我的武器']),2):
            if player.Baggage['我的武器'] != 0 :
                w_items.append(i)   #武器编号
                w_items.append(player.Baggage['我的武器']) #武器数量
      for j in range(0,len(player.Baggage['我的防具']),2):
            if player.Baggage['我的防具'] != 0 :
                a_items.append(j)
                a_items.append(player.Baggage['我的防具'])
      for k in range(0,len(player.Baggage['我的药剂']),2):
            if player.Baggage['我的药剂'] != 0 :
                p_items.append(k)
                p_items.append(player.Baggage['我的药剂'])
      f = open('文字冒险小游戏玩家数据.txt', 'w+', encoding='UTF-8')
      f.write(f'人物基本数据:{params}\n')
      f.write("背包数据:{'我的武器':%s,'我的防具':%s,'我的药剂':%s}" %(w_items,a_items,p_items))
      f.close()
      cl.txt_infor.insert(0.0,'保存成功\n')
      print('保存成功')

    #金手指添加物品函数,可选择添加其中一项(等级,金钱,药剂,武器,防具,数量,编号)
    def vip_add(self,lv=0,moy=0,p=0,w=0,a=0,num=0,item=0):
      if item == -1:
            print('未选中')
            return
      elif num == '':
            print('未输入数值')
            return
      try:
            num = int(num)
            if lv:
                lv_num = num
                if player.Lv+lv_num < 1:
                  player.Lv =1
                  cl.txt_infor.insert(0.0,f'等级降低{-lv_num},当前等级Lv=1\n')
                elif player.Lv+lv_num >100:
                  player.Lv = 100
                  cl.txt_infor.insert(0.0, f'等级增加{lv_num},当前等级Lv=100\n')
                else:
                  player.Lv += lv_num
                  cl.txt_infor.insert(0.0, f'等级增加{lv_num},当前等级Lv={player.Lv}\n')
                player.renew_data()
                cl.lb_lv1.config(text=player.Lv)
                cl.lb_exp1.config(text=f'{player.My_Exp}/{player.MExp}')
                cl.lb_hp1.config(text=f'{player.My_Hp}/{player.MHp}')
                cl.lb_mp1.config(text=f'{player.My_Mp}/{player.MMp}')
            if moy:
                moy_num = num
                if player.Money+moy_num <= 0:
                  player.gold_exp(-player.Money,0)
                else:
                  player.gold_exp(moy_num,0)
            if p:
                potion_num = num
                if potion_num < 0:#输入的数量如果小于0,则默认+1
                  potion_num = 1
                player.bag_chg('我的药剂',item,potion_num)
                cl.txt_infor.insert(0.0,f'---获得药剂“{Items.potions}”×{potion_num}\n')
            if w:
                if item == 19:
                  player.bag_chg('我的武器',99,1)
                  cl.txt_infor.insert(0.0,'>>>获得神器:“创世·诛仙”×1\n')
                else:
                  player.bag_chg("我的武器",item,1)
                  cl.txt_infor.insert(0.0, f'---获得武器:“{Items.weapons}”×1\n')
            if a:
                if item == 19:
                  player.bag_chg('我的防具',99,1)
                  cl.txt_infor.insert(0.0,'>>>获得神器:“创世·圣言”×1\n')
                else:
                  player.bag_chg("我的防具",item,1)
                  cl.txt_infor.insert(0.0, f'---获得防具:“{Items.armors}”×1\n')
      except :
            print("获取出错")

    # 打开金手指窗口
    def vip(self):
      win1 = Toplevel(root)# 金手指窗体
      win1.geometry('260x170+30+100')
      win1.title('金手指')
      cv = Canvas(win1, width="260", height="200", bg="pink")# 制作画布,在窗口中设置
      cv.place(x=0, y=0)

      inp_lv = Entry(win1)
      inp_lv.place(x=100, y=10, width=40, height=20)
      btn_addlv = Button(win1, text='等级增加', bg='#afb4db', font=('黑体', 12),
                           command=(lambda :ac.vip_add(lv=1,num=inp_lv.get())))
      btn_addlv.place(x=15, y=10, width=80, height=20)# 等级增加按钮

      inp_gold = Entry(win1)
      inp_gold.place(x=100, y=40, width=40, height=20)
      btn_addgold = Button(win1, text='金钱增加', bg='#afb4db', font=('黑体', 12),
                           command=(lambda :ac.vip_add(moy=1,num=inp_gold.get())))# 金钱增加按钮
      btn_addgold.place(x=15, y=40, width=80, height=20)

      inp_p = Entry(win1)
      inp_p.place(x=100, y=70, width=40, height=20)
      var1 = StringVar()
      items_p = []
      for i in range(0, 11):
            items_p.append(Items.potions)
      comb1 = tkinter.ttk.Combobox(win1, textvariable=var1, value=items_p)# 药剂的组合选择框
      comb1.place(x=150, y=70, width=90, height=20)
      btn_getp = Button(win1, text='获得药剂', bg='#afb4db', font=('黑体', 12),
                           command=(lambda :ac.vip_add(p=1,num=inp_p.get(),item=comb1.current())))# 药剂获得按钮
      btn_getp.place(x=15, y=70, width=80, height=20)

      var2 = StringVar()
      items_w = []
      for j in range(0, 19):
            items_w.append(Items.weapons)
      items_w.append(Items.weapons)
      comb2 = tkinter.ttk.Combobox(win1, textvariable=var2, value=items_w)# 武器的组合选择框
      comb2.place(x=100, y=100, width=110, height=20)
      btn_getw = Button(win1, text='获得武器', bg='#afb4db', font=('黑体', 12),
                           command=(lambda :ac.vip_add(w=1,item=comb2.current())))# 获得武器按钮
      btn_getw.place(x=15, y=100, width=80, height=20)

      var3 = StringVar()
      items_a = []
      for k in range(0, 19):
            items_a.append(Items.armors)
      items_a.append(Items.armors)
      comb3 = tkinter.ttk.Combobox(win1, textvariable=var3, value=items_a)# 防具的组合选择框
      comb3.place(x=100, y=130, width=110, height=20)
      btn_geta = Button(win1, text='获得防具', bg='#afb4db', font=('黑体', 12),
                           command=(lambda :ac.vip_add(a=1,item=comb3.current())))# 获得防具按钮
      btn_geta.place(x=15, y=130, width=80, height=20)

    #修改昵称
    def id_edit(self):
      new_id = askstring('改名','请输入玩家名字')
      player.Name = new_id
      cl.lb_name1.config(text=new_id)

    #探索函数
    def explore(self):
      if ac.war_peace: # True为战斗内,False在战斗外
            cl.txt_infor.insert(0.0, '战斗中,无法探索!\n')
      elif player.floor == 11:
            monster = rd.choice()
            cl.txt_infor.insert(0.0,'///遭遇最后一层守卫 "%s"///\n'%Items.monster)
            ac.war(monster)
      else:
            event = rd.choice(['无事发生','遇到怪物!','发现了一个宝箱!'])
            if event == '遇到怪物!':
                monster = rd.choice()
                ac.war(monster)
                cl.txt_infor.insert(0.0, "!!遇到怪物!!\n")
            elif event == '发现了一个宝箱!':
                cl.txt_infor.insert(0.0, ">>>发现了一个宝箱<<<\n")
                if player.floor == 10:
                  item= rd.choices(['我的药剂','金钱'],weights=)
                else:
                  item = rd.choices(['我的武器','我的防具','我的药剂','金钱'],weights=)
                if item =='金钱':
                  gold = player.floor*6
                  player.gold_exp(gold,0)
                elif item =='我的药剂':
                  number = rd.choice()
                  player.bag_chg(item,number,1)
                  cl.txt_infor.insert(0.0,'获得药剂“%s”×1\n'%(Items.potions))
                elif item =='我的武器':
                  number = player.floor * 2 - 1
                  player.bag_chg(item,number,1)
                  cl.txt_infor.insert(0.0,'获得武器“%s”×1\n'%(Items.weapons))
                else:
                  number = player.floor * 2 - 1
                  player.bag_chg(item, number, 1)
                  cl.txt_infor.insert(0.0, '获得防具“%s”×1\n' % (Items.armors))
                walfale = 0
            else:
                cl.txt_infor.insert(0.0, "无事发生\n")

    #上一关
    def backlevel(self):
      if ac.war_peace:# True为战斗内,False在战斗外
            cl.txt_infor.insert(0.0, '战斗中,无法前往上一关!\n')
            return
      else:
            if player.level == 1:
                if player.floor == 1:
                  cl.txt_infor.insert(0.0,'当前在第一关,无法再后退\n')
                  return
                else:
                  player.floor -= 1
                  player.level = 5
            else:
                player.level -= 1
      if player.level != 1:
            cl.btn_shop.place(x=0, y=0, width=0, height=0)
      else:
            cl.btn_shop.place(x=650, y=300, width=60, height=50)
      cl.txt_infor.insert(0.0, '成功前往上一关,当前在%d-%d\n' % (player.floor, player.level))
      cl.lb_level1.config(text=f'{player.floor}-{player.level}')

    #下一关
    def nextlevel(self):
      if ac.war_peace:# 判断是否在战斗中,True为战斗内,False在战斗外
            cl.txt_infor.insert(0.0, '战斗中,无法前往下一关!\n')
            return
      elif player.floor == 11:    #判断是否在最后一层
            if player.level == 5:
                boss_war = tkinter.messagebox.askyesno(
                  '最终boss', '即将挑战本游戏最终boss\n是否继续?')# 是/否,返回值true/false
                if boss_war :
                  num = player.floor*3-1
                  ac.war(num)
                  return
            else:
                player.level += 1
      else:
            if player.level == 5:
                boss_war = tkinter.messagebox.askyesno(
                  '遭遇强敌', '继续前往下一关需要先挑战本层boss\n是否继续?')# 是/否,返回值true/false
                if boss_war :
                  num = player.floor*3-1
                  ac.war(num)
                  return
                else:
                  pass
            else:
                player.level += 1
      if player.level != 1:
            cl.btn_shop.place(x=0, y=0, width=0, height=0)
      else:
            cl.btn_shop.place(x=650, y=300, width=60, height=50)
      cl.txt_infor.insert(0.0, '成功前往下一关,当前在%d-%d\n' % (player.floor, player.level))
      cl.lb_level1.config(text=f'{player.floor}-{player.level}')

    #购买商品(购买武器,防具,药剂,是否购买)
    def shop_buy(self,w_num=0,a_num=0,p_num=0):
      if w_num:
            price = Items.weapons
            if player.Money < price:
                cl.txt_infor.insert(0.0,'金钱不足\n')
            else:
                player.gold_exp(-price,0)
                player.bag_chg('我的武器',w_num,1)
                cl.txt_infor.insert(0.0,'购买成功!\n')
      elif a_num:
            price = Items.armors
            if player.Money < price:
                cl.txt_infor.insert(0.0,'金钱不足\n')
            else:
                player.gold_exp(-price,0)
                player.bag_chg('我的防具',a_num,1)
                cl.txt_infor.insert(0.0,'购买成功!\n')
      elif p_num:
            price = Items.potions
            if player.Money < price:
                cl.txt_infor.insert(0.0,'金钱不足\n')
            else:
                player.gold_exp(-price,0)
                player.bag_chg('我的药剂',p_num,1)
                cl.txt_infor.insert(0.0,'购买成功!\n')
      else:
            pass

    # 打开商店窗口
    def shop_win(self,price=0):
      win = Toplevel(root)
      win.title("商店")
      win.geometry('310x150+600+200')
      cv = Canvas(win, width="310", height="150", bg="#d3d7d4")# 制作画布,在窗口中放置
      cv.place(x=0, y=0)

      lb_price1 = Label(win, text='售价', bg='#afb4db', font=('黑体', 12))
      lb_price1.place(x=210, y=10, width=80, height=20)
      var1 = StringVar()
      items_w = []
      i = 0
      for i in range(0,19):
            items_w.append(Items.weapons)
      comb1 = tkinter.ttk.Combobox(win, textvariable=var1, value=items_w)
      comb1.place(x=100, y=10, width=100, height=20)
      comb1.bind('<<ComboboxSelected>>',
                   lambda event:lb_price1.config(text=f"售价:{Items.weapons}"))
      btn_buy_w = Button(win, text='购买武器', bg='#fab27b', font=('黑体', 12),
                           command=lambda :ac.shop_buy(w_num=comb1.current()))
      btn_buy_w.place(x=15, y=10, width=80, height=20)# 购买武器按钮


      lb_price2 = Label(win, text='售价', bg='#afb4db', font=('黑体', 12))
      lb_price2.place(x=210, y=50, width=80, height=20)
      var2 = StringVar()
      items_a = []
      i = 0
      for i in range(0,19):
            items_a.append(Items.armors)
      comb2 = tkinter.ttk.Combobox(win, textvariable=var2, value=items_a)
      comb2.place(x=100, y=50, width=100, height=20)
      comb2.bind('<<ComboboxSelected>>',
                   lambda event:lb_price2.config(text=f"售价:{Items.armors}"))
      btn_buy_a = Button(win, text='购买防具', bg='#fab27b', font=('黑体', 12),
                           command=lambda :ac.shop_buy(a_num=comb2.current()))
      btn_buy_a.place(x=15, y=50, width=80, height=20)# 购买防具按钮


      lb_price3 = Label(win, text='售价', bg='#afb4db', font=('黑体', 12))
      lb_price3.place(x=210, y=90, width=80, height=20)
      var3 = StringVar()
      items_p = []
      i = 0
      for i in range(0,11):
            items_p.append(Items.potions)
      comb3 = tkinter.ttk.Combobox(win, textvariable=var3, value=items_p)
      comb3.place(x=100, y=90, width=100, height=20)
      comb3.bind('<<ComboboxSelected>>',
                   lambda event:lb_price3.config(text=f"售价:{Items.potions}"))
      btn_buy_p = Button(win, text='购买药剂', bg='#fab27b', font=('黑体', 12),
                           command=lambda :ac.shop_buy(p_num=comb3.current()))
      btn_buy_p.place(x=15, y=90, width=80, height=20)# 购买药剂按钮

    #穿戴装备/防具/使用药剂(武器,防具,药剂,装备在背包内的位置)
    def wear_w_a_p(self,w=0,a=0,p=0,num=0):
      try:
            if num < 0:
                print('未选中任何武器/防具/药剂')
                return
            else:
                num = num*2
            if w:
                if ac.war_peace:
                  cl.txt_infor.insert(0.0,'战斗中不能更换装备\n')
                  return
                else:
                  item = player.Baggage['我的武器']#此时item为武器所在Item库中的的序号
                  player.My_Weapon = (Items.weapons,item)
                  cl.lb_weapon1.config(text=Items.weapons,bg=player.My_Weapon)
                  cl.txt_infor.insert(0.0,f'成功装备武器“{Items.weapons}”\n')
            if a:
                if ac.war_peace:
                  cl.txt_infor.insert(0.0,'战斗中不能更换装备\n')
                  return
                else:
                  item = player.Baggage['我的防具']# 此时item为防具所在Item库中的的序号
                  player.My_Aromr = (Items.armors, item)
                  cl.lb_armor1.config(text=Items.armors,bg=player.My_Aromr)
                  cl.txt_infor.insert(0.0, f'成功装备防具“{Items.armors}”\n')
            if p:
                if num == 0 :
                  return
                if player.Baggage['我的药剂'] < 1:
                  cl.txt_infor.insert(0.0,'药剂数量不足,无法使用\n')
                else:
                  item = player.Baggage['我的药剂']#此时item为药剂所在Item库中的的序号
                  if item < 6:    #序号1-5是血瓶
                        player.Baggage['我的药剂'] -= 1
                        player.hp_mp(0,Items.potions)
                        cl.txt_infor.insert(0.0,f'使用了{Items.potions},血量增加{Items.potions}\n')
                  else:
                        player.Baggage['我的药剂'] -= 1
                        player.hp_mp(1, Items.potions)
                        cl.txt_infor.insert(0.0,f'使用了{Items.potions},魔法值增加{Items.potions}\n')
                  cl.renew_bag(p=1)
            player.renew_data()
      except :
            print('出错')

    #背包栏选中的装备信息
    def infor_w_a_p(self,w=0,a=0,p=0):
      if w:
            num = cl.w_list.curselection()
            item = player.Baggage['我的武器']#此时item是Item中武器对应的编号
            cl.w_infor.config(text=f'攻击力:\n{Items.weapons}')
      if a:
            num = cl.a_list.curselection()
            item = player.Baggage['我的防具']# 此时item是Item中防具对应的编号
            cl.a_infor.config(text=f'防御力:\n{Items.armors}')
      if p:
            num = cl.p_list.curselection()
            item = player.Baggage['我的药剂']# 此时item是Item中药剂对应的编号
            cl.p_infor.config(text=f'回血量:{Items.potions}\n回蓝量:{Items.potions}')

    #玩家使用技能(技能编号,技能使用所需等级)
    def use_skill(self,num,able):
      if ac.war_peace:
            if self.rounds:
                cl.txt_infor.insert(0.0,'当前是怪物回合,无法使用技能\n')
                return
            else:
                need_mp = Items.skills_player
                if player.Lv < able:
                  cl.txt_infor.insert(0.0,'等级不足,%d级才能使用\n'%able)
                  return
                elif player.My_Mp < need_mp:
                  cl.txt_infor.insert(0.0,'当前魔法值不足,使用失败,所需魔法值:%d\n'%need_mp)
                  return
                else:
                  if num < 3 :
                        skill_name = Items.skills_player
                        hp_lavue = Items.skills_player + player.Atk
                        self.monster_hp -= hp_lavue
                        cl.txt_infor.insert(0.0,f'{player.Name}使用了 {skill_name} 造成了 {hp_lavue} 点伤害\n')
                        self.rounds = True
                  elif num == 3:
                        ac.war_peace = False
                        self.rounds = False
                        cl.txt_infor.insert(0.0,'=====逃跑成功,战斗结束=====\n')
                        return
                  elif num == 7:
                        skill_name = Items.skills_player
                        hp_lavue = int(player.MHp * 0.1)    #'生命回复'技能增加最大生命值的10%
                        player.hp_mp(1,-need_mp)
                        player.hp_mp(0,hp_lavue)
                        cl.txt_infor.insert(0.0,f'{player.Name}使用了 {skill_name},生命值增加{hp_lavue}\n')
                  elif num == 12:
                        skill_name = Items.skills_player
                        hp_lavue = int(player.MHp * 0.3)    #'治愈之心'技能增加最大生命值的30%'
                        player.hp_mp(1,-need_mp)
                        player.hp_mp(0,hp_lavue)
                        cl.txt_infor.insert(0.0,f'{player.Name}使用了 {skill_name},生命值增加{hp_lavue}\n')
                  else:
                        skill_name = Items.skills_player
                        hp_lavue = Items.skills_player + int(player.Atk * 0.6)#技能造成的伤害值等于武器攻击力加60%玩家攻击力
                        player.hp_mp(1,-need_mp)
                        self.monster_hp -= hp_lavue
                        cl.txt_infor.insert(0.0,f'{player.Name}使用了 {skill_name} 造成了 {hp_lavue} 点伤害\n')
                        self.rounds = True
                  if self.monster_hp <= 0:
                        cl.txt_infor.insert(0.0, "怪物已阵亡,战斗胜利!\n")
                        add_gold = int(self.monster * rd.uniform(1.0, 1.3))# 掉落金币在基础值上增加0到0.3倍
                        add_exp = int(self.monster * rd.uniform(1.0, 1.3))
                        player.gold_exp(add_gold, add_exp)
                        if self.boss:
                            self.boss = False
                            if self.welfare:
                              num = int((self.monster_num + 1) / 3 * 2)   #获取武器的编号
                              typ = rd.choice(["我的武器", "我的防具"])
                              self.welfare = False
                              if typ == "我的武器":
                                    player.bag_chg(typ, num, 1)
                                    cl.txt_infor.insert(0.0, f'获得boss专属武器{Items.weapons}×1\n')
                              else:
                                    player.bag_chg(typ, num, 1)
                                    cl.txt_infor.insert(0.0, f'获得boss专属防具{Items.armors}×1\n')
                              player.floor += 1
                              player.level = 1
                              cl.btn_shop.place(x=650, y=300, width=60, height=50)
                              cl.lb_level1.config(text=f'{player.floor}-{player.level}')
                            elif player.floor == 10:
                              player.floor += 1
                              player.level = 1
                              cl.btn_shop.place(x=650, y=300, width=60, height=50)
                              cl.txt_infor.insert(0.0, "本层boss没有专属奖励\n")
                              cl.lb_level1.config(text=f'{player.floor}-{player.level}')
                            else:
                              player.floor = 11
                              player.level = 5
                              cl.txt_infor.insert(0.0,'>>>您已战胜最后一关boss,恭喜通关!<<<')
                              cl.txt_infor.insert(0.0,'===========♬♪✪✪✪✪✪♪♬==========')
                              print('您已战胜最后一关boss,恭喜通关!')
                        cl.txt_infor.insert(0.0, f"{'战斗结束':=^20}\n")
                        self.war_peace = False
                        self.rounds = False
                        return
                  else:
                        ac.monster_round()
      else:
            cl.txt_infor.insert(0.0,'当前不在战斗内,无法使用技能\n')

#初始化玩家信息
player = Warrior()
ac = Action()

#按钮类
class Control:

    # 菜单栏
    mainmenu = Menu(root)
    menuFile = Menu(mainmenu)

    mainmenu.add_cascade(label='文件',menu=menuFile)
    menuFile.add_command(label='保存存档',command=ac.save_data)
    menuFile.add_command(label='读取存档',command=ac.read_data)

    menuEdit = Menu(mainmenu)
    mainmenu.add_cascade(label='工具',menu=menuEdit)
    menuEdit.add_command(label='金手指',command=ac.vip)
    root.config(menu=mainmenu)
    #菜单栏结束

    #个人信息栏
    lb_infor = Label(root,text='个人信息',bg='#f391a9',bd=2,font=('黑体',20))
    lb_infor.place(x=50,y=40,width=150,height=50)

    lb_name0 = Label(root,text='昵称:',bg='pink',font=('黑体',10))
    lb_name0.place(x=15,y=100,width=50,height=20)
    lb_name1 = Label(root,text=player.Name,bg='#f391a9',font=('黑体',15))#名字变量
    lb_name1.place(x=80,y=100,width=150,height=20)
    btn_id_edit = Button(root, text='✎',bg='#cde6c7',font=('黑体',20) ,command=ac.id_edit)
    btn_id_edit.place(x=225, y=100, width=20, height=20)

    lb_lv0 = Label(root,text='当前等级:',bg='pink',font=('黑体',10))
    lb_lv0.place(x=15,y=135,width=80,height=20)
    lb_lv1 = Label(root,text=player.Lv,font=('黑体',15))#等级变量
    lb_lv1.place(x=100,y=135,width=145,height=20)

    lb_exp0 = Label(root,text='当前经验:',bg='pink',font=('黑体',10))
    lb_exp0.place(x=15,y=170,width=80,height=20)
    lb_exp1 = Label(root,text=f'{player.My_Exp}/{player.MExp}',font=('黑体',13))#当前经验变量
    lb_exp1.place(x=100,y=170,width=145,height=20)

    lb_hp0 = Label(root,text='剩余生命:',bg='pink',font=('黑体',10))
    lb_hp0.place(x=15,y=205,width=80,height=20)
    lb_hp1 = Label(root,text=f"{player.My_Hp}/{player.MHp}",font=('黑体',13))#当前生命变量
    lb_hp1.place(x=100,y=205,width=145,height=20)

    lb_mp0 = Label(root,text='剩余魔法:',bg='pink',font=('黑体',10))
    lb_mp0.place(x=15,y=240,width=80,height=20)
    lb_mp1 = Label(root,text=f'{player.My_Mp}/{player.MMp}',font=('黑体',13))#当前魔法变量
    lb_mp1.place(x=100,y=240,width=145,height=20)

    lb_money0 = Label(root,text='持有金钱:',bg='pink',font=('黑体',10))
    lb_money0.place(x=15,y=275,width=80,height=20)
    lb_money1 = Label(root,text=player.Money,font=('黑体',15))#金钱变量
    lb_money1.place(x=100,y=275,width=145,height=20)

    lb_weapon0 = Label(root,text='当前武器:',bg='pink',font=('黑体',10))
    lb_weapon0.place(x=15,y=305,width=80,height=20)
    lb_weapon1 = Label(root,text=player.My_Weapon,bg=player.My_Weapon,font=('黑体',13))#当前武器变量
    lb_weapon1.place(x=100,y=305,width=145,height=20)

    lb_armor0 = Label(root,text='当前防具:',bg='pink',font=('黑体',10))
    lb_armor0.place(x=15,y=340,width=80,height=20)
    lb_armor1 = Label(root,text=player.My_Aromr,bg=player.My_Aromr,font=('黑体',13))#当前防具变量
    lb_armor1.place(x=100,y=340,width=145,height=20)

    lb_level0 = Label(root,text='当前关卡:',bg='pink',font=('黑体',10))
    lb_level0.place(x=15,y=375,width=80,height=20)
    lb_level1 = Label(root,text=f'{player.floor}-{player.level}',bg='#f2eada',font=('黑体',13))#当前关卡变量
    lb_level1.place(x=100,y=375,width=145,height=20)
    #个人信息栏结束

    #操作栏
    btn_explore = Button(root, text='探索本层', bg='#d3d7d4', font=('黑体', 15), command=ac.explore)
    btn_explore.place(x=50, y=420, width=150, height=40)

    btn_backlevel = Button(root, text='上一关', bg='#d3d7d4', font=('黑体', 15), command=ac.backlevel)
    btn_backlevel.place(x=50, y=480, width=150, height=40)

    btn_nextlevel = Button(root, text='下一关', bg='#d3d7d4', font=('黑体', 15), command=ac.nextlevel)
    btn_nextlevel.place(x=50, y=540, width=150, height=40)

    lb_fight = Label(root,text='战斗行动',fg='#006c54',font=('黑体',12))
    lb_fight.place(x=260,y=405,width=80,height=20)

    lb_basic_action = Label(root,text='基本技能:',fg='#006c54',font=('黑体',15))
    lb_basic_action.place(x=260,y=430,width=100,height=40)

    lb_special_action = Label(root,text='特殊技能:',fg='#006c54',font=('黑体',15))
    lb_special_action.place(x=260,y=480,width=100,height=40)

    btn_basic_skill0 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                              font=('黑体',12), command=lambda :ac.use_skill(0,0))    #传入的参数:(技能编号,使用等级),下同
    btn_basic_skill0.place(x=370,y=430,width=70,height=30)

    btn_basic_skill1 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                              font=('黑体',12), command=lambda :ac.use_skill(1,0))
    btn_basic_skill1.place(x=460,y=430,width=70,height=30)

    btn_basic_skill2 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                              font=('黑体',12), command=lambda :ac.use_skill(2,0))
    btn_basic_skill2.place(x=550,y=430,width=70,height=30)

    btn_basic_skill3 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                              font=('黑体',12), command=lambda :ac.use_skill(3,0))
    btn_basic_skill3.place(x=640,y=430,width=70,height=30)

    btn_special_skill4 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                              font=('黑体',12), command=lambda :ac.use_skill(4,5))
    btn_special_skill4.place(x=370,y=480,width=70,height=30)

    btn_special_skill5 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                              font=('黑体',12), command=lambda :ac.use_skill(5,10))
    btn_special_skill5.place(x=460,y=480,width=70,height=30)

    btn_special_skill6 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                              font=('黑体',12), command=lambda :ac.use_skill(6,15))
    btn_special_skill6.place(x=550,y=480,width=70,height=30)

    btn_special_skill7 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                              font=('黑体',12), command=lambda :ac.use_skill(7,25))
    btn_special_skill7.place(x=640,y=480,width=70,height=30)

    btn_special_skill8 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                              font=('黑体',12), command=lambda :ac.use_skill(8,35))
    btn_special_skill8.place(x=370,y=520,width=70,height=30)

    btn_special_skill9 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                              font=('黑体',12), command=lambda :ac.use_skill(9,45))
    btn_special_skill9.place(x=460,y=520,width=70,height=30)

    btn_special_skill10 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                                 font=('黑体',12), command=lambda :ac.use_skill(10,55))
    btn_special_skill10.place(x=550,y=520,width=70,height=30)

    btn_special_skill11 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                                 font=('黑体',12), command=lambda :ac.use_skill(11,65))
    btn_special_skill11.place(x=640,y=520,width=70,height=30)

    btn_special_skill12 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                                 font=('黑体',12), command=lambda :ac.use_skill(12,75))
    btn_special_skill12.place(x=370,y=560,width=70,height=30)

    btn_special_skill13 = Button(root,text=Items.skills_player, bg='#d3d7d4',
                                 font=('黑体',12), command=lambda :ac.use_skill(13,85))
    btn_special_skill13.place(x=460,y=560,width=70,height=30)

    items_w = []
    i=0
    for i in range(0,len(player.Baggage['我的武器']),2):
      items_w.append(Items.weapons])
    var0 = StringVar()
    comb_w = tkinter.ttk.Combobox(root, textvariable=var0, value=items_w)
    comb_w.place(x=850, y=430, width=100, height=30)
    btn_wear_w = Button(root, text='装备武器', bg='#d3d7d4', font=('黑体', 12),
                           command=(lambda :ac.wear_w_a_p(w=1,num=cl.comb_w.current())))
    btn_wear_w.place(x=760, y=430, width=80, height=30)# 装备武器按钮

    items_a = []
    for j in range(0,len(player.Baggage['我的防具']),2):
      items_a.append(Items.armors])
    var1 = StringVar()
    comb_a = tkinter.ttk.Combobox(root, textvariable=var1, value=items_a)
    comb_a.place(x=850, y=480, width=100, height=30)
    btn_wear_a = Button(root, text='装备防具', bg='#d3d7d4', font=('黑体', 12),
                           command=(lambda :ac.wear_w_a_p(a=1,num=cl.comb_a.current())))
    btn_wear_a.place(x=760, y=480, width=80, height=30)# 装备防具按钮

    items_p = []
    for k in range(0,len(player.Baggage['我的药剂']),2):
      # if player.Baggage['我的药剂'] != 0:
      items_p.append(Items.potions])
    var2 = StringVar()
    comb_p = tkinter.ttk.Combobox(root, textvariable=var2, value=items_p)
    comb_p.place(x=850, y=530, width=100, height=30)
    btn_drink_p = Button(root, text='饮用药剂', bg='#d3d7d4', font=('黑体', 12),
                           command=(lambda :ac.wear_w_a_p(p=1,num=cl.comb_p.current())))
    btn_drink_p.place(x=760, y=530, width=80, height=30)# 使用药剂按钮
    #操作栏结束

    #背包栏
    lb_bag = Label(root,text='背包',bg='#f391a9',bd=2,font=('黑体',20))
    lb_bag.place(x=830,y=20,width=100,height=30)

    lb_my_wearpon = Label(root,text='我的武器',bg='pink',bd=2,font=('黑体',12))
    lb_my_wearpon.place(x=760,y=60,width=80,height=20)
    list_var0 = StringVar()
    w_list = Listbox(root,listvariable=list_var0,font=('黑体',12))
    for l in range(0, len(player.Baggage['我的武器']), 2):
      w_list.insert(END, f'{Items.weapons]}×{player.Baggage["我的武器"]}')
    w_list.place(x=840,y=80,width=150,height=100)
    w_list.bind('<ButtonRelease-1>', (lambda event:ac.infor_w_a_p(w=1)))# 当鼠标点击背包内的物品时,调用函数
    w_infor = Label(root,text='攻击力:\n',bg='#f2eada',font=('黑体',12))
    w_infor.place(x=760,y=110,width=80,height=40)

    lb_my_aromr = Label(root,text='我的防具',bg='pink',bd=2,font=('黑体',12))
    lb_my_aromr.place(x=760,y=180,width=80,height=20)
    list_var1 = StringVar()
    a_list = Listbox(root,listvariable=list_var1,font=('黑体',12))
    j=0
    for j in range(0, len(player.Baggage['我的防具']), 2) :
      a_list.insert(END, f'{Items.armors]}×{player.Baggage["我的防具"]}')
    a_list.place(x=840,y=200,width=150,height=100)
    a_list.bind('<ButtonRelease-1>', lambda event:ac.infor_w_a_p(a=1))# 当鼠标点击背包内的物品时,调用函数
    a_infor = Label(root,text='防御力:\n',bg='#f2eada',font=('黑体',12))
    a_infor.place(x=760,y=230,width=80,height=40)

    list_var2 = StringVar()
    lb_my_potions = Label(root,text='我的药剂',bg='pink',bd=2,font=('黑体',12))
    lb_my_potions.place(x=760,y=300,width=80,height=20)
    p_list = Listbox(root,listvariable=list_var2,font=('黑体',12))
    k=0
    for k in range(0, len(player.Baggage['我的药剂']), 2) :
      # if player.Baggage['我的药剂'] != 0:
      p_list.insert(END, f'{Items.potions]}×{player.Baggage["我的药剂"]}')
    p_list.place(x=840,y=320,width=150,height=70)
    p_list.bind('<ButtonRelease-1>', lambda event:ac.infor_w_a_p(p=1))# 当鼠标点击背包内的物品时,调用函数
    p_infor = Label(root,text='回血量:\n回蓝量:',bg='#f2eada',font=('黑体',12))
    p_infor.place(x=760,y=340,width=80,height=40)
    #背包栏结束

    #消息栏
    txt_infor = Text(root,bg='#f2eada',font=('黑体',12))
    txt_infor.place(x=255,y=10,width=490,height=380)
    l=0

    # 商店按钮
    btn_shop = Button(root, text='商店', bg='#d3d7d4', command=ac.shop_win)
    btn_shop.place(x=650, y=300, width=60, height=50)

    #更新信息栏所有信息(昵称,等级,经验,生命,魔法,金钱,武器,防具,关卡)
    def renew_infor(self):
      cl.lb_name1.config(text=player.Name)
      cl.lb_lv1.config(text=player.Lv)
      cl.lb_exp1.config(text=f'{player.My_Exp}/{player.MExp}')
      cl.lb_hp1.config(text=f'{player.My_Hp}/{player.MHp}')
      cl.lb_mp1.config(text=f'{player.My_Mp}/{player.MMp}')
      cl.lb_money1.config(text=player.Money)
      cl.lb_weapon1.config(text=player.My_Weapon,bg=player.My_Weapon)
      cl.lb_armor1.config(text=player.My_Aromr,bg=player.My_Aromr)
      cl.lb_level1.config(text=f'{player.floor}-{player.level}')

    #更新操作栏穿戴部分装备选择信息,可选择更新武器、防具、药剂(w=1,a=1,p=1)
    def renew_wear(self,w=0,a=0,p=0):
      if w:
            items_w = []
            for i in range(0, len(player.Baggage['我的武器']), 2):
                items_w.append(Items.weapons])
            cl.comb_w.config(value=items_w)
      if a:
            items_a = []
            for i in range(0, len(player.Baggage['我的防具']), 2):
                items_a.append(Items.armors])
            cl.comb_a.config(value=items_a)
      if p:
            items_p = []
            for i in range(0, len(player.Baggage['我的药剂']), 2):
                name = Items.potions]
                items_p.append(f"{name}")
            cl.comb_p.config(value=items_p)

    #更新背包栏信息,可选择更新武器、防具、药剂(w=1,a=1,p=1)
    def renew_bag(self,w=0,a=0,p=0):
      if w:
            cl.w_list.delete(0,END)
            i=0
            for i in range(0, len(player.Baggage['我的武器']), 2):
                cl.w_list.insert(END,f'{Items.weapons]}×{player.Baggage["我的武器"]}')
      if a:
            cl.a_list.delete(0,END)
            i=0
            for i in range(0, len(player.Baggage['我的防具']), 2):
                cl.a_list.insert(END,f'{Items.armors]}×{player.Baggage["我的防具"]}')
      if p:
            cl.p_list.delete(0,END)
            i=0
            for i in range(0, len(player.Baggage['我的药剂']), 2):
                # if player.Baggage['我的药剂'] != 0:
                cl.p_list.insert(END,f'{Items.potions]} × {player.Baggage["我的药剂"]}')

cl = Control()

#判断是否读档
Y_N = tkinter.messagebox.askyesno('开始游戏', '是否读取存档')#是/否,返回值true/false
if Y_N:
    ac.read_data()
else:
    cl.txt_infor.insert(0.0, '==========开始新游戏=========\n')

root.mainloop()

minblack3 发表于 2022-5-14 16:51

aiyamaya 发表于 2022-5-14 11:02
为什么路径上明明有包,但运行时却提示没有呢?python3.10.4
C:\Users\CU\Desktop\报错.png

试一下在终端这里输入pip install tkinter 能不能行。
可能是因为setting里的环境是确实存在,但是项目运行时寻找的包环境路径和setting里的不同

话痨司机啊 发表于 2022-5-14 23:22

可以把静态数据单独存储(要是多的话用数据库更好一点),动态函数单独放一个文件,类单独存放一个文件,函数用的常量单独处方并命名为可读变量名,后期维护和代码可读性我觉得更方便一点,游戏还有个库pygame我也没用过,不知道能不能加点动画~

若雪 发表于 2022-4-13 07:09

有机会试一下。

水鸟 发表于 2022-4-13 07:22

成品效果图上一幢看看啊

guoweiv587 发表于 2022-4-13 07:33

不错啊,

ganjuelianghao 发表于 2022-4-13 07:56

有成品图吗,放出了来个看看

lospring 发表于 2022-4-13 08:03

能搞个成品图就好了,谢谢分享

d199212 发表于 2022-4-13 08:05

楼主厉害啊,不知道有没有成品可以玩

Wapj_Wolf 发表于 2022-4-13 08:25

1K多行的代码,谢谢楼主分享PY源码干货。

empirehwm 发表于 2022-4-13 08:27

谢谢楼主分享,下来学习学习

minblack3 发表于 2022-4-13 12:13

水鸟 发表于 2022-4-13 07:22
成品效果图上一幢看看啊

好的,已经发在代码下面了
页: [1] 2 3 4
查看完整版本: 【python】Python小白自己写的一个文字勇者冒险游戏