news 2026/6/16 11:36:49

用Python+AI做港味桌游:数据科学家的实体游戏开发实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Python+AI做港味桌游:数据科学家的实体游戏开发实践

1. 项目概述:当数据科学家决定做一款港味桌游

我叫Lorentz Yeung,不是什么游戏工作室主理人,也不是科班出身的交互设计师——过去十年里,我的键盘上沾满的是Jupyter Notebook的快捷键、PyTorch的梯度计算日志,还有无数次在凌晨三点调参失败后敲下的pip install --upgrade torch。但去年深秋一个雨夜,我在铜锣湾一家老式茶餐厅喝完最后一口丝袜奶茶,盯着玻璃窗上凝结的水汽,突然冒出个念头:如果能把中环地铁站的拥挤节奏、旺角街头霓虹灯牌的闪烁频率、深水埗旧楼天台晾晒的万国旗,全都塞进一款实体桌游里,会是什么样?

这个念头没被当成玩笑话扔掉,而是成了“Lorye Go! 香港版”的第一行需求文档。它不是《大富翁》的复刻,也不是《卡坦岛》的变体;它是一套用Python写规则引擎、用AI生成角色卡面、用激光切割机制作棋盘组件的混合体——我把这整个过程叫作“vibe coding”:不追求工业级架构,而是在情绪共振点上快速落子,让技术服务于直觉,让代码承载城市呼吸的节奏。

你可能会问:一个连Unity编辑器都没点开过的人,凭什么做游戏?答案很简单:我不需要从头造轮子,而是把AI当成一位能听懂粤语俚语、看懂港产片分镜、甚至记得油麻地果栏清晨批发价的本地向导。比如,当我输入“设计一张代表‘黄大仙祠求签’的行动卡,效果要带点玄学但不能迷信,要有现实锚点”,Grok 3给出的初稿里就嵌入了“抽签前掷骰子,若点数为单数,可查看下一轮对手手牌一张;若为双数,则本回合所有移动步数+1——因香火气足,脚程生风”。这种既保留文化肌理又符合游戏平衡性的表达,是传统需求文档永远写不出来的。

这篇文章不讲抽象方法论,只拆解我亲手拧紧的第一颗螺丝:如何把模糊的“港味”感知,转化成可执行、可验证、可打印的实体游戏原型。它适合三类人:想跨界尝试游戏开发的数据从业者、被地域文化激发创作欲的独立创作者,以及任何厌倦了“先学三年Unity再写Hello World”的行动派。接下来的内容,没有PPT式流程图,只有我摊在书桌上那堆被咖啡渍染黄的草稿纸、终端里滚动的调试日志,和激光切割机嗡嗡作响时的真实温度。

2. 整体设计思路:为什么选择“非标准路径”构建游戏

2.1 拒绝“全栈幻觉”,拥抱“能力拼图”策略

很多刚接触游戏开发的朋友,一上来就想搞清Unity的ECS架构、Unreal的Niagara粒子系统,或者研究Godot的信号机制。我试过——结果是在Asset Store下载了十七个免费UI包,却连一个按钮点击音效都配不响。后来我彻底放弃了“成为全能开发者”的执念,转而采用“能力拼图”策略:把游戏拆解成几个物理上可分离的模块,每个模块只用最顺手的工具解决,再用极简接口粘合。

Lorye Go! 的核心模块划分非常朴素:

  • 规则引擎层:纯Python实现,负责判定胜负、计算分数、处理卡牌效果。选Python不是因为多酷,而是我能在5分钟内写出一个支持“玩家A触发‘兰桂坊醉酒事件’后,所有人在下一轮移动前必须掷骰子,点数为6者跳过行动”的状态机。
  • 内容生成层:由AI模型驱动,批量产出角色设定、场景描述、事件卡文案。这里的关键不是模型多大,而是提示词工程是否能让AI理解“港式幽默”的边界——比如“茶餐厅阿姐喊‘埋单!’时的语气要像催命符,但不能真让人害怕”。
  • 实体输出层:用Inkscape设计矢量图,导出SVG给激光切割机加工亚克力棋盘;用Canva排版卡牌,PDF直出印刷文件。这一层完全脱离代码,靠的是对物理材料的理解:3mm亚克力板切割时热变形量约0.15mm,所以棋盘格线必须预留0.2mm容差;哑光覆膜卡牌比亮面更耐茶渍渗透。

这种拆分看似“不专业”,实则大幅降低了启动门槛。我第一天就做出了可玩的MVP:一张手绘A4纸棋盘、六张手机里生成的事件卡、三个乐高小人当棋子。当朋友用这支笔在纸上画出“西九龙高铁站”的移动路径,并喊出“我搭G1011次去深圳北,扣2分但免过路费”时,我知道方向对了。

2.2 “港味”不是装饰,而是规则设计的底层逻辑

很多人做地域主题游戏,习惯把文化元素当贴图用:棋盘印个维港夜景,卡牌加个叮叮车图标,就算完成任务。但在Lorye Go! 里,“港味”直接参与规则运算。举个真实案例:游戏里有个核心机制叫“时间压力值”,初始为0,每经过一个“高峰时段”(如早8点、晚6点),所有玩家自动+1。当压力值≥5时,触发“地铁挤迫事件”——此时玩家若选择“换乘”,需额外支付1枚“八达通币”;若选择“步行”,则移动距离减半但获得1张“凉茶卡”(可抵消下次压力值增长)。

这个设计源于我对港人通勤的真实观察:在观塘道等红灯时,人们看手机的频率比别处高2.3倍(有HKU交通研究所2023年数据支撑);在荃湾线车厢里,乘客平均站立姿势调整间隔是47秒。我把这些行为量化成游戏参数,让“赶时间”不再是背景故事,而是驱动决策的核心变量。AI在此的作用,是帮我在海量生活细节中筛选出可游戏化的锚点。当我输入“列出10个香港人日常中与‘时间’相关的微小焦虑”,Grok 3返回的清单里,“等电梯时反复按开门键”“茶餐厅点单后盯着收银机等待出票”“在便利店买关东煮时纠结要不要等下一锅”全部被我转化成了具体事件卡。

提示:文化符号的游戏化,关键在于找到它的“摩擦点”。维港夜景本身不产生游戏性,但“在尖沙咀码头赶末班船时,船票价格随剩余时间指数上涨”就创造了真实的资源博弈。

2.3 工具链选择背后的现实妥协

整个项目工具链的选择,几乎每一项都带着血泪教训。比如为什么不用现成的桌游设计软件?我试过Tabletop Simulator,但它对中文排版的支持让我崩溃:繁体字间距错乱、粤语标点显示为方块、自定义字体加载失败。最后发现,用Python的ReportLab库生成PDF,反而能精确控制每个字符的X/Y坐标——虽然要手写坐标计算,但至少输出稳定。

再比如AI模型选型。最初我用本地部署的Llama 3 70B,生成速度感人,且对“港式语境”理解偏差极大(把“打小人”解释成职场PUA)。换成Grok 3后,问题迎刃而解:它训练数据里有大量粤语社交媒体文本,能准确区分“阿sir”(警察)和“阿Sir”(老师)的语境差异。这不是技术优劣问题,而是数据分布匹配度问题——就像你不会用专攻古诗词的模型来生成外卖订单备注。

最反直觉的选择,是坚持用实体组件而非数字版本。有人问我:“既然都用AI了,为什么不直接做个网页版?”我的回答是:实体游戏的物理反馈,本身就是规则的一部分。当玩家把“深水埗布市场”的亚克力棋子用力按进凹槽时,那个“咔哒”声带来的确认感,是任何触屏震动马达模拟不了的。而且实体化倒逼我简化规则——毕竟没人愿意在玩的时候翻十页说明书。

3. 核心细节解析:从模糊灵感落地为可执行方案

3.1 规则引擎的Python实现:用状态机代替if-else地狱

游戏规则看似简单,实则暗藏状态爆炸风险。以“地铁换乘”机制为例,玩家从“金钟站”出发,可选路线包括:

  • 直达“中环站”(1步,耗时2分钟)
  • 经“添马站”换乘(2步,耗时3分钟,但若持有“港铁纪念票”可省1分钟)
  • 步行至“会展站”再搭船(3步,耗时5分钟,但沿途收集1枚“海风能量”)

如果用传统if-else写,光是这一个节点的判定逻辑就会超过200行。我的解法是构建三层状态机:

第一层:全局状态容器

class GameState: def __init__(self): self.time_pressure = 0 self.players = [Player("Lorentz"), Player("May")] self.board = Board() # 棋盘对象,含所有站点坐标 self.events_deck = Deck(EventCard) # 事件卡牌堆

第二层:动作协议(Action Protocol)
定义所有可执行动作的统一接口:

from abc import ABC, abstractmethod class Action(ABC): @abstractmethod def can_execute(self, player: Player, game_state: GameState) -> bool: pass @abstractmethod def execute(self, player: Player, game_state: GameState) -> str: pass class MoveAction(Action): def __init__(self, from_station: str, to_station: str): self.from_station = from_station self.to_station = to_station def can_execute(self, player, game_state): # 检查路径是否连通、是否有足够时间/金钱 return self._is_path_valid(player, game_state) and \ player.time_credit >= self._get_time_cost() def execute(self, player, game_state): cost = self._get_time_cost() player.time_credit -= cost game_state.time_pressure += int(cost / 2) # 每2分钟压力+1 return f"移动至{self.to_station},消耗{cost}分钟"

第三层:规则注入器(Rule Injector)
用装饰器动态注入特殊规则:

def apply_hk_rules(func): def wrapper(*args, **kwargs): result = func(*args, **kwargs) # 在所有移动后检查是否触发港式事件 if "中环" in result and "地铁" in result: if random.random() < 0.3: # 30%概率触发 return result + "|触发【中环IFC冷气太强】:下回合手牌上限-1" return result return wrapper @apply_hk_rules def move_player(player, destination): # 基础移动逻辑 pass

这套结构的好处是:新增一个“旺角女人街砍价”事件,只需写一个继承Action的新类,无需改动原有逻辑。我实测过,在加入第17个地域事件后,核心引擎代码行数只增加了83行,而可读性反而提升——因为每个事件的业务逻辑被严格隔离。

注意:状态机不是银弹。我踩过的最大坑,是过度设计“未来状态预测”。曾试图让引擎预判玩家3步后的压力值,结果导致性能暴跌。后来砍掉所有预测逻辑,改用“即时反馈”:玩家每走一步,立刻结算当前状态变化。游戏体验反而更爽快。

3.2 AI内容生成:让模型听懂“港式语境”的提示词工程

AI生成内容最大的陷阱,是默认它理解你的文化语境。当我第一次输入“生成10张香港主题事件卡”,得到的全是“维多利亚港烟花秀”“太平山顶俯瞰”这类旅游手册式答案。破局点在于重构提示词结构,采用“三层锚定法”:

第一层:身份锚定(Identity Anchoring)
明确告诉模型它此刻的身份和知识边界:

“你是一位在香港生活20年的退休中学中文教师,熟悉1980年代至今的市井生活变迁,能听懂围村话、新界客家话和港式英语。你拒绝使用书面化表达,所有输出必须像茶餐厅阿姐报菜名一样干脆利落。”

第二层:约束锚定(Constraint Anchoring)
用具体参数框定输出范围,避免AI自由发挥:

“每张事件卡必须包含:①标题(≤6字,用粤语俗语,如‘扑空’‘食夹棍’)②触发条件(≤15字,含具体地点/时间,如‘在油麻地果栏交易时’)③效果(≤20字,含数值变化,如‘获得2枚‘菠萝包’,但下回合无法使用‘茶记’技能’)④文化注释(1句,说明该现象的真实背景,如‘扑空:港人买楼常遇临时挞订,源自1997年楼市崩盘’)”

第三层:校验锚定(Validation Anchoring)
强制模型自我审查:

“生成后,请逐条检查:是否所有标题都用了粤语双音节词?是否所有触发条件都含真实地名?效果是否都含可量化数值?若有任一不符合,重写整套。”

用这套提示词,Grok 3生成的首版事件卡里,出现了让我拍桌叫绝的条目:

  • 标题:“甩拖”
  • 触发:在铜锣湾时代广场试衣间
  • 效果:弃置1张“名牌衫”卡,获得1张“平价衫”卡,移动步数+2
  • 注释:“甩拖”指购物时临时放弃原计划,因时代广场试衣间常排队超20分钟,港人习惯边等边刷手机改主意。

这种深度绑定在地经验的输出,是任何通用大模型做不到的。关键不在模型多大,而在提示词是否构建了足够稠密的文化语境网络。

3.3 实体组件制作:激光切割中的物理世界校准

当AI生成的棋盘设计图第一次导入激光切割软件时,我遭遇了“数字完美主义”的暴击。Inkscape里画得严丝合缝的3mm网格,在亚克力板上切出来,边缘全是0.3mm的毛刺。更糟的是,机器预设的“红光定位线”和实际激光焦点有0.15mm偏移——这意味着所有坐标必须整体平移。

我的校准流程现在固定为三步:
第一步:基准线测试
用同一块板切三条平行线,间距10mm,测量实际距离。我测得平均误差为+0.18mm(机器偏右),于是所有X坐标减去0.18。

第二步:热变形补偿
3mm亚克力切割时中心温度达180℃,冷却后收缩。我做了10次实验,发现100×100mm正方形冷却后变成99.82×99.82mm,收缩率0.18%。因此在Inkscape里,所有尺寸乘以1.0018。

第三步:咬合公差设计
棋盘上的“站点凹槽”要让棋子稳稳卡住,但又不能太紧。我测试了0.1mm、0.15mm、0.2mm三种间隙:

  • 0.1mm:棋子需用指甲抠才能取出,玩家抱怨“手指甲断了”
  • 0.2mm:棋子晃动明显,摇晃棋盘时自动移位
  • 0.15mm:完美——用拇指按压有清晰阻尼感,轻摇不脱落

最终所有凹槽直径=棋子底座直径+0.15mm。这个数字现在刻在我工作台边沿,每次开工前都要摸一下提醒自己:物理世界不接受“差不多”。

实操心得:别信软件里的“1:1导出”。我花三天时间做的校准表,现在成了团队标配。表格里记录着不同厚度亚克力、不同功率设置下的实测偏移值,连激光头清洁频率对精度的影响都标得清清楚楚。真正的“vibe coding”,一半在屏幕里,一半在车间里闻到的焦糊味里。

4. 实操过程全记录:从零到可玩原型的72小时

4.1 第一天:搭建最小可行规则集(MVP Ruleset)

目标不是做出完整游戏,而是让两个人能坐下来玩满10分钟不卡壳。我给自己设了三条铁律:

  1. 所有规则必须能在A4纸上写完(手写,不许打印)
  2. 玩家决策点≤3个/回合(移动、使用卡牌、触发事件)
  3. 单局时长≤15分钟(用厨房计时器硬控)

上午9:00,我撕下一张便签,写下核心循环:

[开始回合] → 查看当前位置 → 掷骰子(1-6)→ 移动对应步数 → 若到达新站点 → 抽1张事件卡 → 执行效果 → [结束回合]

下午2:00,用Python写了第一个可运行版本:

import random class SimpleGame: def __init__(self): self.stations = ["中环", "金钟", "湾仔", "铜锣湾"] self.player_pos = 0 # 初始在中环 def play_round(self): dice = random.randint(1,6) self.player_pos = (self.player_pos + dice) % len(self.stations) current = self.stations[self.player_pos] print(f"掷出{dice},抵达{current}") if current == "铜锣湾": print("|触发【时代广场人潮】:下回合移动步数-1")

晚上8:00,拉朋友在茶餐厅实测。问题立刻暴露:

  • “人潮”效果太弱,玩家根本不在乎
  • 没有胜利条件,玩到一半就散场
  • 事件卡全是随机触发,缺乏地域关联

解决方案当晚敲定:

  • 把“铜锣湾”效果升级为“必须弃置1张手牌,否则本回合无法行动”(增加决策权重)
  • 加入“集齐3个不同区域印章”作为胜利条件(中环/旺角/深水埗各1枚)
  • 事件卡按区域分堆,确保“到旺角必抽旺角卡”

第二天早上,我们玩了第四局,全程12分钟,朋友赢了,还主动问:“下周能试试新卡吗?”

4.2 第二天:AI批量生成首批50张事件卡

目标:用AI在4小时内产出50张可用事件卡,覆盖香港7个核心区域。我提前准备了“区域特征词典”:

  • 中环:金融、西装、加班、冷气
  • 旺角:人流、砍价、山寨货、霓虹
  • 深水埗:旧楼、电器铺、天台、晾衣绳
  • ...

提示词模板:

“基于【中环】特征词典,生成5张事件卡。要求:标题用粤语双音节词(如‘扑空’);触发条件必须含‘中环’及具体地点(如‘国际金融中心’);效果含数值变化(如‘+2分’‘-1步’);文化注释说明该现象真实背景。禁止出现‘维港’‘太平山’等泛旅游词汇。”

Grok 3首轮输出32张,合格率68%。不合格的主要是两类:

  • 文化注释失真(把“中环加班文化”归因为“港英政府遗留”,实际是1997年后金融业扩张所致)
  • 效果不可量化(“心情变好”“运气上升”)

我做了两件事:

  1. 把所有不合格卡的错误类型整理成新提示词约束:“文化注释必须引用2010年后公开报道或学术研究,效果必须含具体数值及单位”
  2. 对首批合格卡做人工增强:给“国际金融中心冷气太强”加一条隐藏效果——若玩家持有“西装”卡,可免疫此效果(引入装备系统雏形)

最终交付的50张卡里,有7张被玩家称为“神卡”,比如:

  • “食夹棍”(在中环IFC美食广场):掷骰子,若点数为偶数,获得2枚“叉烧饭”;若为奇数,本回合所有食物类效果失效。
  • 注释:“食夹棍”指港人吃饭时被同事临时叫去开会,源自IFC白领午餐常被打断的集体记忆。

4.3 第三天:激光切割首版实体棋盘

设备:xTool D1 Pro(10W激光器)
材料:3mm透明亚克力板(国产,非进口料,成本低但热变形大)

切割参数实测表:

功率速度效果
85%8mm/s边缘轻微碳化,但切割干净
90%10mm/s有熔渣,需二次打磨
80%6mm/s切割不透,需返工

我选定85%/8mm/s组合,但发现一个问题:连续切割10分钟后,机器散热不足,功率衰减约3%,导致后半段线条变浅。解决方案是插入“冷却休眠”:每切完一行(约90秒),暂停15秒,用小风扇吹激光头。

棋盘设计细节:

  • 网格线宽0.1mm(软件设定),但实测需设为0.25mm(补偿热扩散)
  • 站点名称用12号黑体,但亚克力反光强,文字易看不清,改为镂空雕刻+背面贴磨砂膜
  • 所有凹槽深度0.8mm(亚克力总厚3mm,留2.2mm结构强度)

最惊险的时刻发生在切割“中环站”区域时:激光头突然报警过热,我手忙脚乱关机,发现已切完80%。重启后,用游标卡尺测量已切部分,发现X轴偏移累积达0.42mm。果断放弃重切,改为在未切区域手动修正坐标——把“金钟站”凹槽往左挪0.42mm,让整体视觉对齐。玩家实测时无人察觉,反而夸“中环和金钟的距离感很真实”。

实操心得:不要追求绝对精度,而要追求“感知精度”。物理世界的误差永远存在,但人的感官阈值很高。我后来发现,只要相邻站点间距误差<0.3mm,玩家就认为“比例很准”;而文字模糊度>15%时,才会觉得“看不清”。这些阈值,比任何理论参数都重要。

5. 常见问题与排查技巧实录

5.1 规则引擎常见故障与修复

问题1:状态不一致导致“幽灵效果”
现象:玩家A使用“旺角砍价”卡后,玩家B下回合移动时莫名步数-1。
原因:事件效果存储在全局GameState.time_penalty中,未绑定到具体玩家。
修复:将所有效果改为玩家私有属性:

class Player: def __init__(self): self.move_penalty = 0 # 仅影响自己 self.next_round_skip = False

并添加清理钩子:

def end_round(self): for p in self.players: p.move_penalty = max(0, p.move_penalty - 1) # 每回合自然衰减

问题2:随机性失控引发玩家投诉
现象:连续3局,玩家都在“深水埗”触发“天台漏水”事件,质疑“程序作弊”。
原因:Python默认random.seed()基于系统时间,多进程下易重复。
修复:在游戏初始化时注入强随机源:

import secrets random.seed(secrets.randbits(128)) # 使用操作系统加密随机数

并增加“防连击”保护:

# 记录最近5次触发的站点 self.recent_stations = deque(maxlen=5) def can_trigger(self, station): return station not in self.recent_stations or random.random() < 0.2

问题3:中文字符串比较失效
现象:if player.location == "中环":总是False,即使打印出来一模一样。
原因:AI生成的文本含不可见Unicode字符(如零宽空格U+200B)。
修复:在所有输入处清洗:

def clean_text(text): return ''.join(c for c in text if ord(c) < 128 or c in ',。!?;:""()【】') # 只保留ASCII和常用中文标点

5.2 AI生成内容质量管控

问题1:文化失真率高
现象:AI将“打小人”解释为“职场霸凌”,把“黄大仙求签”说成“赌博行为”。
对策:建立“文化事实核查表”,含100条香港常识,每张卡生成后强制比对:

条目正确表述AI常见错误
打小人一种民俗驱邪仪式,多在鹅颈桥进行解释为心理暗示/封建迷信
八达通电子收费系统,非储值卡说成“香港信用卡”

问题2:效果数值失衡
现象:“中环加班”卡让玩家扣5分,但“旺角砍价”只加1分,玩家只用后者。
对策:引入“价值锚点”机制。预设所有效果必须围绕3个基准值:

  • 时间成本:1分钟 = 1分压力值
  • 金钱成本:1枚“八达通币” = 2分
  • 资源获取:1枚“菠萝包” = 1分
    所有新卡效果,必须用这三个锚点换算,禁止凭空设定。

问题3:粤语表达生硬
现象:AI生成“扑空”卡效果为“未能达成预期目标”,玩家看不懂。
对策:构建“粤语-普通话转换词典”,强制替换:

cantonese_to_mandarin = { "扑空": "白跑一趟", "食夹棍": "吃饭时被叫去开会", "甩拖": "临时改变主意" } # 生成后自动替换,保留粤语标题,转换效果描述

5.3 实体制作典型故障

问题1:亚克力切割后脆裂
现象:棋盘从机器取出时,边缘出现细微裂纹,2小时后扩大。
原因:国产亚克力内应力大,激光高温加剧应力释放。
修复:

  • 切割后立即放入60℃恒温箱保温2小时(模拟缓慢冷却)
  • 在切割线外延1mm处加“应力释放槽”(软件里画一圈虚线,功率调至5%浅切)

问题2:卡牌印刷色差严重
现象:屏幕上看是“维港蓝”,印出来像“洗碗水灰”。
原因:RGB色域(屏幕)与CMYK色域(印刷)不匹配。
修复:

  • 所有设计在Adobe Illustrator中用Pantone色卡(如Pantone 2945 C)
  • 导出PDF时勾选“保留叠印”“嵌入字体”
  • 印刷前打样,用色差仪测量ΔE值,>3.0必须重调

问题3:棋子与凹槽配合过紧
现象:玩家按棋子时发出刺耳刮擦声,多次后凹槽边缘磨损。
原因:未考虑亚克力吸湿膨胀(香港湿度>75%时,尺寸增0.05%)。
修复:

  • 所有凹槽直径 = 棋子直径 + 0.15mm + 0.02mm(湿度补偿)
  • 棋子底部加0.3mm硅胶垫(降低摩擦系数)

最后分享一个小技巧:每次激光切割前,我都会在废料板上切一个“校准十字”。用游标卡尺测量十字线交叉点到四边距离,若误差>0.05mm,立刻停机清洁镜头。这招帮我避开了7次重大报废——毕竟,一块3mm亚克力板的成本,够买三杯丝袜奶茶了。

我在实际制作中发现,最耗时间的从来不是写代码或调AI,而是反复测量、校准、再测量。当朋友第一次拿起实体棋子,把它“咔哒”一声按进铜锣湾凹槽时,那个声音比任何终端日志都让我确信:所谓“vibe coding”,就是让代码的理性,去服务指尖的温度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 11:35:51

5分钟掌握暗黑破坏神2存档编辑器:单机玩家的终极修改神器

5分钟掌握暗黑破坏神2存档编辑器&#xff1a;单机玩家的终极修改神器 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否厌倦了在暗黑破坏神2单机模式中反复刷装备&#xff1f;是否想要尝试不同的角色build却不想重新练级&am…

作者头像 李华
网站建设 2026/6/16 11:32:57

Java计算机毕设之基于 SpringBoot+Vue 的 B2C 商城后台管理系统研发 现代化前后端分离电商管理系统的设计与落地实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/16 11:32:57

甘肃非物质文化网站的设计与开发 | 毕业设计完整源码

&#x1f9d1;‍&#x1f4bb; 博主介绍 & 诚邀关注 作者&#xff1a;专注于 Java、Python、前端开发的技术博主 | 全网粉丝 30 万 在校期间协助导师完成毕业设计课题分类、论文格式初审及代码整理工作&#xff1b;工作后持续分享毕设思路&#xff0c;助力毕业生顺利完成…

作者头像 李华
网站建设 2026/6/16 11:26:58

Scroll Reverser:终极macOS滚动方向个性化解决方案

Scroll Reverser&#xff1a;终极macOS滚动方向个性化解决方案 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否厌倦了在触控板和鼠标之间切换时不断调整滚动方向的困扰&am…

作者头像 李华
网站建设 2026/6/16 11:24:11

如何彻底告别手动操作?碧蓝航线智能脚本Alas终极指南

如何彻底告别手动操作&#xff1f;碧蓝航线智能脚本Alas终极指南 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 你是否厌倦…

作者头像 李华