From ed00715458f1e6eb3a628f5ecedcbfe742c827e5 Mon Sep 17 00:00:00 2001 From: Bidgecfah <112526130+Bidgecfah@users.noreply.github.com> Date: Thu, 18 Apr 2024 00:32:35 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=BD=93=E6=9C=9F=E6=B4=BB=E5=8A=A8=E5=95=86=E5=BA=97=E6=80=A7?= =?UTF-8?q?=E4=BB=B7=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...67\345\261\200\350\256\241\347\256\227.py" | 77 ++++++++++++++++++- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git "a/\347\211\251\344\273\267\345\261\200\350\256\241\347\256\227.py" "b/\347\211\251\344\273\267\345\261\200\350\256\241\347\256\227.py" index f02286b..8114b4f 100644 --- "a/\347\211\251\344\273\267\345\261\200\350\256\241\347\256\227.py" +++ "b/\347\211\251\344\273\267\345\261\200\350\256\241\347\256\227.py" @@ -1,7 +1,10 @@ # -*- mode: python ; coding: utf-8 -*- import json import numpy +import re +import requests import time +from bs4 import BeautifulSoup def 材料定价计算(输入, 精英材料编号列表, 精英材料名列表, 精英材料图片列表, 其他物品信息列表): @@ -31,6 +34,22 @@ def 材料定价计算(输入, 精英材料编号列表, 精英材料名列表, 游戏关卡数据 = json.load(open('游戏关卡数据.json')) 采购价格数据 = json.load(open('采购价格.json', encoding="utf-8")) 企鹅物流自动掉落数据 = json.load(open('企鹅物流自动掉落数据.json')) + PRTS首页 = "https://prts.wiki/w/首页" + B = BeautifulSoup(requests.get(PRTS首页).text, "html.parser").find_all("b") + 活动名称 = "当前无活动" + for b in B: + if "「" in b.text: + 活动名称 = re.findall(r'\「(.*?)\」', b.text)[0] + break + PRTS活动网址 = "https://prts.wiki/w/" + 活动名称 + + # 找到含有指定字符串的表格 + 商店表格 = None + 全部表格 = BeautifulSoup(requests.get(PRTS活动网址).text, "html.parser").find_all("table") + for 表格 in 全部表格: + if "可兑换道具" in 表格.text: + 商店表格 = 表格 + break # 按照配方构筑加工矩阵 # 加工T5获得T5精英材料矩阵 = numpy.eye(len(精英材料编号列表[4])) @@ -140,11 +159,17 @@ def 材料定价计算(输入, 精英材料编号列表, 精英材料名列表, and not 游戏关卡数据['stages'][关卡]['apCost'] == 0): 主线关卡信息列表[0].append(关卡) 主线关卡信息列表[1].append(游戏关卡数据['stages'][关卡]['apCost']) - 主线关卡信息列表[2].append(游戏关卡数据['stages'][关卡]['goldGain'] * 1.2) + # 主线关卡信息列表[2].append(游戏关卡数据['stages'][关卡]['goldGain'] * 1.2) + 折算产出龙门币 = 游戏关卡数据['stages'][关卡]['goldGain'] * 1.2 + if 换算活动代币: 折算产出龙门币 += 游戏关卡数据['stages'][关卡]['apCost'] * 10 + 主线关卡信息列表[2].append(折算产出龙门币) if 游戏关卡数据['stages'][关卡]['zoneId'] == 'weekly_6': 技巧概要关卡信息列表[0].append(关卡) 技巧概要关卡信息列表[1].append(游戏关卡数据['stages'][关卡]['apCost']) - 技巧概要关卡信息列表[2].append(游戏关卡数据['stages'][关卡]['goldGain'] * 1.2) + # 技巧概要关卡信息列表[2].append(游戏关卡数据['stages'][关卡]['goldGain'] * 1.2) + 折算产出龙门币 = 游戏关卡数据['stages'][关卡]['goldGain'] * 1.2 + if 换算活动代币: 折算产出龙门币 += 游戏关卡数据['stages'][关卡]['apCost'] * 10 + 技巧概要关卡信息列表[2].append(折算产出龙门币) 技巧概要关卡信息列表[3].append(0) 技巧概要关卡信息列表[4].append(0) 技巧概要关卡信息列表[5].append(0) @@ -506,4 +531,50 @@ def 材料定价计算(输入, 精英材料编号列表, 精英材料名列表, 情报凭证性价比表[3].append(numpy.hstack((T4精英材料价值向量, 其他物品信息列表[3]))[序号] / eval(采购价格数据["情报凭证"][材料名]) + 序号 * 1e-8) # 性价比 情报凭证性价比表[4] = [{序号: i+1 for i, 序号 in enumerate(sorted(情报凭证性价比表[3], reverse=True))}[序号] for 序号 in 情报凭证性价比表[3]] # 性价比排名 - return 定价关卡列表, 精英材料价值排序表, 精英材料价值向量, 信用性价比表, 资质凭证性价比表, 高级凭证性价比表, 寻访参数模型性价比表, 情报凭证性价比表 + # 如果找到目标表格 + 活动商店 = {} + if 商店表格: + # 提取表头 + 表头 = [header.text.strip() for header in 商店表格.find_all("th")] + 阶段 = "" + # 提取表格数据 + for 行 in 商店表格.find_all("tr"): + 行数据 = {} + 格数据 = 行.find_all(["th", "td"]) + for i in range(len(表头)): + 行数据[表头[i]] = 格数据[i].text.strip() if i < len(格数据) else "" + if 行数据: + if 行数据[""] == "金色阶段": + 阶段 = "金色阶段" + 活动商店[阶段] = {} + elif 行数据[""] == "紫色阶段": + 阶段 = "紫色阶段" + 活动商店[阶段] = {} + elif 行数据[""] == "灰色阶段": + 阶段 = "灰色阶段" + 活动商店[阶段] = {} + 可兑换道具分割 = 行数据["可兑换道具"].split("×") + if 可兑换道具分割[0] in 精英材料名列表[1]+精英材料名列表[2]+精英材料名列表[3]+精英材料名列表[4]+其他物品信息列表[1]: + if len(可兑换道具分割) == 1: + 活动商店[阶段][行数据["可兑换道具"]] = str(行数据["单价"]) + elif len(可兑换道具分割) == 2: + 活动商店[阶段][可兑换道具分割[0]] = str(行数据["单价"]) + "/" + 可兑换道具分割[1] + with open("活动商店数据.json", "w", encoding="utf-8") as jsonfile: + json.dump(活动商店, jsonfile, ensure_ascii=False, indent=4) + + 活动代币性价比表 = [] + for 阶段序号, 活动商店阶段 in enumerate(活动商店.keys()): + 活动代币性价比表.append([[], [], [], [], []]) + for 材料序号, 材料名 in enumerate(精英材料名列表[1]+精英材料名列表[2]+精英材料名列表[3]+精英材料名列表[4]+其他物品信息列表[1]): + if 材料名 in 活动商店[活动商店阶段].keys(): + 活动代币性价比表[阶段序号][0].append((精英材料图片列表[1]+精英材料图片列表[2]+精英材料图片列表[3]+精英材料图片列表[4]+其他物品信息列表[0])[材料序号]) # 图片 + 活动代币性价比表[阶段序号][1].append(材料名) # 材料名 + if 材料名 in 精英材料名列表[1]: 活动代币性价比表[阶段序号][2].append(1) # 材料等级 + elif 材料名 in 精英材料名列表[2]: 活动代币性价比表[阶段序号][2].append(2) + elif 材料名 in 精英材料名列表[3]: 活动代币性价比表[阶段序号][2].append(3) + elif 材料名 in 精英材料名列表[4]: 活动代币性价比表[阶段序号][2].append(4) + else: 活动代币性价比表[阶段序号][2].append(其他物品信息列表[2][材料序号-len(精英材料图片列表[1]+精英材料图片列表[2]+精英材料图片列表[3]+精英材料图片列表[4])]) + 活动代币性价比表[阶段序号][3].append(numpy.hstack((T2精英材料价值向量, T3精英材料价值向量, T4精英材料价值向量, T5精英材料价值向量, 其他物品信息列表[3]))[材料序号] / eval(活动商店[活动商店阶段][材料名]) + 材料序号 * 1e-8) # 性价比 + 活动代币性价比表[阶段序号][4] = [{序号: i+1 for i, 序号 in enumerate(sorted(活动代币性价比表[阶段序号][3], reverse=True))}[序号] for 序号 in 活动代币性价比表[阶段序号][3]] # 性价比排名 + + return 定价关卡列表, 精英材料价值排序表, 精英材料价值向量, 信用性价比表, 资质凭证性价比表, 高级凭证性价比表, 寻访参数模型性价比表, 情报凭证性价比表, 活动代币性价比表 From 45bbf50285ca05e1c64c4d4b937154f40709494b Mon Sep 17 00:00:00 2001 From: Bidgecfah <112526130+Bidgecfah@users.noreply.github.com> Date: Thu, 18 Apr 2024 00:33:22 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Update=20=E7=BD=97=E5=BE=B7=E5=B2=9B?= =?UTF-8?q?=E7=89=A9=E4=BB=B7=E5=B1=80.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\347\211\251\344\273\267\345\261\200.py" | 59 ++++++++++++++----- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git "a/\347\275\227\345\276\267\345\262\233\347\211\251\344\273\267\345\261\200.py" "b/\347\275\227\345\276\267\345\262\233\347\211\251\344\273\267\345\261\200.py" index 1008496..1bf43ab 100644 --- "a/\347\275\227\345\276\267\345\262\233\347\211\251\344\273\267\345\261\200.py" +++ "b/\347\275\227\345\276\267\345\262\233\347\211\251\344\273\267\345\261\200.py" @@ -3,8 +3,10 @@ import json import numpy from PIL import Image, ImageTk +import re import requests import ttkbootstrap as 界面 +from bs4 import BeautifulSoup from ttkbootstrap.constants import * from ttkbootstrap.scrolled import ScrolledFrame from 物价局计算 import 材料定价计算 @@ -210,8 +212,8 @@ def 计算工序(): 基备选集合 = 关卡范围.get() 换算活动代币 = 活动代币.get() - 固源岩单独定价 = 以固源岩为原料.get() - 装置单独定价 = 以装置为原料.get() + 固源岩单独定价 = 不加工固源岩.get() + 装置单独定价 = 不加工装置.get() 瑕光加工T5精英材料 = 瑕光[0].get() 瑕光加工T4精英材料 = 瑕光[1].get() 瑕光加工T3精英材料 = 瑕光[2].get() @@ -229,7 +231,7 @@ def 计算工序(): ] # try: - 定价关卡列表, 精英材料价值排序表, 精英材料价值向量, 信用性价比表, 资质凭证性价比表, 高级凭证性价比表, 寻访参数模型性价比表, 情报凭证性价比表 = 材料定价计算(输入, 精英材料编号列表, 精英材料名列表, 精英材料图片列表, 其他物品信息列表) + 定价关卡列表, 精英材料价值排序表, 精英材料价值向量, 信用性价比表, 资质凭证性价比表, 高级凭证性价比表, 寻访参数模型性价比表, 情报凭证性价比表, 活动代币性价比表 = 材料定价计算(输入, 精英材料编号列表, 精英材料名列表, 精英材料图片列表, 其他物品信息列表) # except: # 提示.configure(text='计算失败,请检查输入内容的合理性!', foreground='red') # return @@ -243,6 +245,7 @@ def 计算工序(): for 子控件 in 高级凭证性价比域.winfo_children(): 子控件.destroy() for 子控件 in 寻访参数模型性价比域.winfo_children(): 子控件.destroy() for 子控件 in 情报凭证性价比域.winfo_children(): 子控件.destroy() + for 子控件 in 活动代币性价比域.winfo_children(): 子控件.destroy() for 子控件 in 定价关卡域.winfo_children(): 子控件.destroy() 界面.Label(定价关卡域, image=理智图标).grid(row=0, column=0, padx=10, pady=3) 界面.Label(定价关卡域, text="材料名称").grid(row=0, column=1, padx=10, pady=3) @@ -333,12 +336,37 @@ def 计算工序(): 界面.Label(情报凭证性价比域, text=情报凭证性价比表[1][情报凭证性价比表[4].index(序号+1)], foreground=名称颜色[情报凭证性价比表[2][情报凭证性价比表[4].index(序号+1)]]).grid(row=序号+1, column=1, padx=10, pady=2) 界面.Label(情报凭证性价比域, text=format(100 * [num / max(情报凭证性价比表[3]) for num in 情报凭证性价比表[3]][情报凭证性价比表[4].index(序号+1)], '.2f')).grid(row=序号+1, column=2, padx=10, pady=2) + PRTS首页 = "https://prts.wiki/w/首页" + B = BeautifulSoup(requests.get(PRTS首页).text, "html.parser").find_all("b") + 活动名称 = "当前无活动" + for b in B: + if "「" in b.text: + 活动名称 = "「" + re.findall(r'\「(.*?)\」', b.text)[0] + "」" + break + if 活动名称 != "当前无活动": + 活动商店价格数据 = json.load(open('活动商店数据.json', encoding="utf-8")) + 活动代币性价比域.grid(row=0, column=0, sticky=界面.W+E+N+S, pady=10, padx=10) + 行 = 0 + 界面.Label(活动代币性价比域, text=活动名称).grid(row=行, column=0, padx=10, pady=3) + 界面.Label(活动代币性价比域, text="材料名称").grid(row=行, column=1, padx=10, pady=3) + 界面.Label(活动代币性价比域, text="性价比").grid(row=行, column=2, padx=10, pady=3) + for 阶段序号, 阶段 in enumerate(活动商店价格数据.keys()): + 行 += 1 + for 序号 in range(len(活动代币性价比表[阶段序号][4])): + 界面.Label(活动代币性价比域, image=活动代币性价比表[阶段序号][0][活动代币性价比表[阶段序号][4].index(序号+1)]).grid(row=行, column=0, padx=10, pady=2) + 界面.Label(活动代币性价比域, text=活动代币性价比表[阶段序号][1][活动代币性价比表[阶段序号][4].index(序号+1)], foreground=名称颜色[活动代币性价比表[阶段序号][2][活动代币性价比表[阶段序号][4].index(序号+1)]]).grid(row=行, column=1, padx=10, pady=2) + 界面.Label(活动代币性价比域, text=format(100 * [num / max(活动代币性价比表[0][3] + 活动代币性价比表[1][3] + 活动代币性价比表[2][3]) for num in 活动代币性价比表[阶段序号][3]][活动代币性价比表[阶段序号][4].index(序号+1)], '.2f')).grid(row=行, column=2, padx=10, pady=2) + 行 += 1 + if 阶段序号 < len(活动商店价格数据.keys())-1: + 界面.Separator(活动代币性价比域, bootstyle="success").grid(row=行, column=0, columnspan=3, pady=15, sticky=界面.W + E) + 行 += 1 + 提示.configure(text='计算完成!', foreground='#78c2ad') 名称颜色 = ["black", "YellowGreen", "DodgerBlue", "LightSlateBlue", "GoldenRod"] 框架颜色 = ["dark", "success", "info", "secondary", "warning"] -窗口 = 界面.Window(title="罗德岛物价局", themename="minty", iconphoto="图片/标题栏图标.png", size=(1750, 1000), minsize=(0, 0)) +窗口 = 界面.Window(title="罗德岛物价局", themename="minty", iconphoto="图片/标题栏图标.png", size=(1750, 1100), minsize=(0, 0)) 窗口.style.configure('primary.TNotebook', tabposition='wn', tabmargins=0, background='#78c2ad') 窗口.style.configure('primary.TNotebook.Tab', font=('微软雅黑', 11)) 标签页集 = 界面.Notebook(窗口, style='primary.TNotebook') @@ -410,13 +438,13 @@ def 计算工序(): 界面.Separator(价值观域, bootstyle="light").grid(row=8, column=0, columnspan=3, pady=5, sticky=界面.W+E) 源石碎片图标 = ImageTk.PhotoImage(Image.open(f'图片/源石碎片.png').resize((40, 40))) 界面.Label(价值观域, image=源石碎片图标).grid(row=15, pady=1, column=0, sticky=界面.E) -界面.Label(价值观域, text="制造源石材料").grid(row=15, column=1, columnspan=2, ipadx=103, pady=5, sticky=界面.W) -以固源岩为原料 = 界面.BooleanVar(value=TRUE) -界面.Checkbutton(价值观域, text="以固源岩为原料", variable=以固源岩为原料, onvalue=TRUE, offvalue=FALSE).grid(row=15, pady=5, column=2, padx=5, sticky=界面.W) +界面.Label(价值观域, text="制造源石材料相关").grid(row=15, column=1, columnspan=2, ipadx=103, pady=5, sticky=界面.W) +不加工固源岩 = 界面.BooleanVar(value=FALSE) +界面.Checkbutton(价值观域, text="不加工固源岩", variable=不加工固源岩, onvalue=TRUE, offvalue=FALSE).grid(row=15, pady=5, column=2, padx=5, sticky=界面.W) 固源岩图标 = ImageTk.PhotoImage(Image.open(f'图片/MTL_SL_G2.png').resize((40, 40))) 界面.Label(价值观域, image=固源岩图标).grid(row=15, pady=5, column=2, padx=40, sticky=界面.E) -以装置为原料 = 界面.BooleanVar(value=TRUE) -界面.Checkbutton(价值观域, text="以装置为原料", variable=以装置为原料, onvalue=TRUE, offvalue=FALSE).grid(row=16, pady=5, column=2, padx=5, sticky=界面.W) +不加工装置 = 界面.BooleanVar(value=FALSE) +界面.Checkbutton(价值观域, text="不加工装置", variable=不加工装置, onvalue=TRUE, offvalue=FALSE).grid(row=16, pady=5, column=2, padx=5, sticky=界面.W) 装置图标 = ImageTk.PhotoImage(Image.open(f'图片/MTL_SL_BOSS2.png').resize((40, 40))) 界面.Label(价值观域, image=装置图标).grid(row=16, pady=5, column=2, padx=40, sticky=界面.E) @@ -503,21 +531,24 @@ def 计算工序(): 精英材料定价域[0].grid(row=1, column=3, sticky=界面.W+E+N+S, pady=10, padx=10) # 采购性价比标签页 +# 活动代币性价比域 +活动代币性价比域 = 界面.LabelFrame(滚动区域[2], text="活动代币", relief=界面.RIDGE, bootstyle="info", borderwidth=10) # 信用性价比域 信用性价比域 = 界面.LabelFrame(滚动区域[2], text=" 信用", relief=界面.RIDGE, bootstyle="danger", borderwidth=10) -信用性价比域.grid(row=0, column=0, sticky=界面.W+E+N+S, pady=10, padx=10) +信用性价比域.grid(row=0, column=10, sticky=界面.W+E+N+S, pady=10, padx=10) # 资质凭证性价比域 资质凭证性价比域 = 界面.LabelFrame(滚动区域[2], text="资质凭证", relief=界面.RIDGE, bootstyle="success", borderwidth=10) -资质凭证性价比域.grid(row=0, column=1, sticky=界面.W+E+N+S, pady=10, padx=10) +资质凭证性价比域.grid(row=0, column=11, sticky=界面.W+E+N+S, pady=10, padx=10) # 高级凭证性价比域 高级凭证性价比域 = 界面.LabelFrame(滚动区域[2], text="高级凭证", relief=界面.RIDGE, bootstyle="warning", borderwidth=10) -高级凭证性价比域.grid(row=0, column=2, sticky=界面.W+E+N+S, pady=10, padx=10) +高级凭证性价比域.grid(row=0, column=12, sticky=界面.W+E+N+S, pady=10, padx=10) # 寻访参数模型价比域 寻访参数模型性价比域 = 界面.LabelFrame(滚动区域[2], text="寻访参数模型", relief=界面.RIDGE, bootstyle="danger", borderwidth=10) -寻访参数模型性价比域.grid(row=0, column=3, sticky=界面.W+E+N+S, pady=10, padx=10) +寻访参数模型性价比域.grid(row=0, column=13, sticky=界面.W+E+N+S, pady=10, padx=10) # 情报凭证性价比域 情报凭证性价比域 = 界面.LabelFrame(滚动区域[2], text="情报凭证", relief=界面.RIDGE, bootstyle="info", borderwidth=10) -情报凭证性价比域.grid(row=0, column=4, sticky=界面.W+E+N+S, pady=10, padx=10) +情报凭证性价比域.grid(row=0, column=14, sticky=界面.W+E+N+S, pady=10, padx=10) +# 更新文件() 计算工序() 窗口.mainloop()