概要

手游上二次元、卡牌、战旗游戏均有涉猎;包括AFK、明日方舟、少女前线等等;

PC端上,除魂系游戏和大型ARPG外,星际战甲体验较为深入,其他各类别的热门独立游戏多有涉猎

pc+xbox平台

  • ARPG游戏
    • 黑暗之魂二、黑暗之魂三(XBOX平台,通关)
    • 艾尔登法环 + DLC(XBOX平台,接近全成就,少收集一把传说武器)
    • 巫师3(通关)
    • 黑神话悟空(全成就)
    • 只狼(XBOX平台,通关)
    • 刺客信条·黑旗(通关)
    • 上古卷轴5(通关+大型关卡内容mod,100小时+)
    • 空洞骑士(xbox平台,通关)
  • 其他类别
    • 星际战甲(steam显示2000+小时,实际1000+小时,氪金2000+,30段)
    • 辐射4(通关)
    • XCOM一代、二代(通关,200小时+)
    • 逃离鸭科夫(全成就 + mod二周目通关)
    • 33号远征队(xbox平台,通关)
    • 神界·原罪2(通关)
    • 女生异闻录5皇家版(xbox平台,少攻略1角色全成就)
    • 戴森球计划、异星工厂
    • 饥荒、缺氧、泰拉瑞亚等(100+小时)
    • 各类独立游戏,包括吸血鬼幸存者、哈迪斯、limbo、冰汽时代等等

3ds、switch平台

  • 第一方游戏
    • 火焰纹章·风花雪月(通关)、火焰纹章·if(3ds平台,通关)
    • 口袋妖怪部分世代
    • 塞尔达传说荒野之息、王国之泪

手游

  • 明日方舟(塔防)
    • 时间:断断续续3年多
    • 账号:113级,拥有2025.8月之前大部分干员,界园肉鸽N15;主要月卡消费
  • 天涯明月刀(MMO)
    • 时间:赛季制版本,完整的第一赛季
    • 账号:月卡党,第一赛季中流梯队
  • 战舰少女R(舰娘like)
    • 时间:一年左右
    • 账号:充值1000+,拥有毕业装备舰娘,受同人小说《寻找走丢的舰娘》影响较深
  • 少女前线(也算是舰娘like)
    • 时间:一年左右
    • 账号:月卡党,主流队伍G11等多编队战力成型
  • 天地劫:幽城再临(战旗)
    • 时间:3个月左右
    • 账号:月卡+限定党,拥有主流T0角色,购买了其中的一个T0限定角色
  • 剑与远征(卡牌)
    • 时间:一年左右
    • 账号:微氪,40章节左右,主力3编队均15阶
  • 剑与远征2(开放世界+卡牌)
    • 时间:3个月左右
    • 账号:一个赛季,队伍以幽灵系为主,种田阶段浅尝辄止
  • 胜利女神:妮姬
    • 时间:断断续续一年多
    • 账号:2025年前主力编队
  • 原神、鸣潮、崩坏·星穹铁道、绝区零
    • 浅尝辄止

设计目的

  1. 部分模块需同时维护多张表,配置繁琐
  2. 配置可读性比较差,容易遗漏
  3. 配置存在规律配置,工具实现方便

为什么选择python

  1. VBA维护起来比较麻烦,可拓展性没那么好
  2. python可拓展性强,AI解决方案较为齐全

设计思路

  1. 读取Excel,能够读取其字段名、值
  2. 写入Excel,能够保留格式、做到增删改查
  3. 具体模块的高定制配置,符合直觉的自动补充配置
    • 比如显示时装的多个属性、多语言自动生成且可修改
    • 可配置的报错提示
    • 不考虑批量修改
  4. 最好可以便于拓展到其他模块

具体的设计步骤

步骤一:通用的读写模块

步骤二:模块化分析和设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import os
import sys
import threading
import webbrowser
from pathlib import Path
from flask import Flask, send_from_directory, jsonify, request

# 允许被打包为单 exe 后,静态目录定位
BASE_DIR = Path(getattr(sys, "_MEIPASS", Path(__file__).parent))
WEB_DIR = BASE_DIR / "web"

from backend.api_impl import API

api = API()

app = Flask(__name__, static_folder=str(WEB_DIR), static_url_path="")

@app.route("/")
def index():
return send_from_directory(str(WEB_DIR), "index.html")

@app.get("/api/ping")
def ping():
return jsonify({"ok": True})

@app.post("/api/set_root")
def set_root():
data = request.get_json(force=True)
root = data.get("root", "")
ok, msg = api.set_root(root)
return jsonify({"ok": ok, "msg": msg, "root": api.root})

@app.get("/api/scan")
def scan():
files = api.scan_excels()
return jsonify({"ok": True, "files": files, "root": api.root})

@app.post("/api/open_in_excel")
def open_in_excel():
data = request.get_json(force=True)
path = data.get("path", "")
ok, msg = api.open_in_excel(path)
return jsonify({"ok": ok, "msg": msg})

@app.post("/api/get_sheets")
def get_sheets():
data = request.get_json(force=True)
path = data.get("path", "")
ok, sheets, msg = api.get_sheets(path)
return jsonify({"ok": ok, "sheets": sheets, "msg": msg})

@app.post("/api/read_used_range")
def read_used_range():
data = request.get_json(force=True)
path = data.get("path", "")
sheet = data.get("sheet", "")
ok, payload, msg = api.read_used_range(path, sheet)
return jsonify({"ok": ok, "data": payload, "msg": msg})

@app.post("/api/update_cell")
def update_cell():
data = request.get_json(force=True)
path = data.get("path", "")
sheet = data.get("sheet", "")
row = int(data.get("row"))
col = int(data.get("col"))
value = data.get("value", None)
ok, msg = api.update_cell(path, sheet, row, col, value)
return jsonify({"ok": ok, "msg": msg})

@app.post("/api/insert_row_copy")
def insert_row_copy():
data = request.get_json(force=True)
path = data.get("path", "")
sheet = data.get("sheet", "")
row = int(data.get("row"))
where = data.get("where", "above") # "above" or "below"
ok, msg = api.insert_row_copy(path, sheet, row, where)
return jsonify({"ok": ok, "msg": msg})

@app.post("/api/delete_row")
def delete_row():
data = request.get_json(force=True)
path = data.get("path", "")
sheet = data.get("sheet", "")
row = int(data.get("row"))
ok, msg = api.delete_row(path, sheet, row)
return jsonify({"ok": ok, "msg": msg})

@app.post("/api/save_workbook")
def save_workbook():
data = request.get_json(force=True)
path = data.get("path", "")
ok, msg = api.save_workbook(path)
return jsonify({"ok": ok, "msg": msg})

@app.post("/api/search_all")
def search_all():
data = request.get_json(force=True)
keyword = data.get("keyword", "").strip()
deep = bool(data.get("deep", False))
results = api.search_all(keyword, deep=deep)
return jsonify({"ok": True, "results": results})

def open_browser():
url = "http://127.0.0.1:5173"
try:
webbrowser.open(url)
except Exception:
pass

if __name__ == "__main__":
threading.Timer(1.0, open_browser).start()
app.run(host="127.0.0.1", port=5173, debug=False)

hello
1

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

0%