《乒乓生涯》引擎技术交接文档
用途:换 agent 时的完整交接。覆盖评分机制、属性机制、AI 决策、物理引擎、每 1 分差距的含义、真实球员数据标定方法、完整开发日志。
项目路径:/root/1234/tt-physics/ | 引擎:Godot 4.7(GDScript,纯代码后端 + Control UI)| 测试:9 套件 200 项检查全绿。
0. 一页速览(10 行读懂整个系统)
| # | 要点 |
| 1 | 坐标系 z 向上(重力 -z),台面 z=0.76,网上沿 0.9125;渲染时才映射为 Godot y-up。 |
| 2 | 球飞行 = RK4 积分(重力/空气阻力/马格努斯/旋转衰减);台/网/拍按冲量+库仑摩擦碰撞。 |
| 3 | 球员有 54 项属性(0-100 绝对标尺,引擎唯一标尺)+ 器材(握拍/胶皮)+ 隐藏属性(稳定性/关键分/大赛/伤病/士气/疲劳)。 |
| 4 | 三套评分:开球网积分(ELO 400-3000,底层锚点)、业余评分、专业评分;单项属性另有业余/专业双显示标尺,经"绝对属性"换算。 |
| 5 | 击球 = 意图生成 + 物理裁决:属性决定"想怎么打"(挥拍/拍面角/目标旋转/误差),物理引擎决定"结果是否上台"。没有保送,打不上台就是失误。 |
| 6 | AI 三层思维链:战略层(风格/比分/总评差→主基调)→战术层(回合意图/发球战术)→执行层(技术选择+机会球+博弈预测)。 |
| 7 | 状态系统:士气(随得失分波动,沉着决定波动幅度)、疲劳(累积,惩罚质量≤25%+失误率线性升)、发挥系数 form=状态×士气×大赛×伤病。 |
| 8 | 失误 = 主动(非受迫,只关自己属性)+ 受迫(对手质量≥0.45 压制)+ 物理失误(拍面误差推出可行角度窗口)。 |
| 9 | 冒险/搏杀 = risk 管线(胆识→战略基线→比分/手感/士气修正),risk 同时推高发力和失误率、决定爆冲还是求稳。 |
| 10 | WTT 赛事按世界排名解锁(支线→挑战→球星→冠军→大满贯→总决赛),对手是真实球员库;国内邀请赛(业余)对手显示开球网。 |
1. 评分机制(三套体系 + 绝对属性)
1.1 开球网积分(400-3000,底层锚点)
ELO 制:预期胜率 E = 1/(1+10^((Rb-Ra)/400)),K=32。所有球员内部都持有一个开球网积分,是业余/专业两套评分的换算桥梁。专业界面隐藏它,只在业余赛事对手身上显示。
1.2 业余评分(0-100)
由开球网积分分段线性映射(低分段区分度高):
| 开球网 | 400 | 600 | 800 | 1000 | 1200 | 1400 | 1600 | 1800 | 2000 | 2200 | 2300 | 2500 |
| 业余评分 | 1 | 8 | 15 | 22 | 30 | 40 | 50 | 60 | 70 | 78 | 85 | 95 |
1.3 专业评分(0-100)
2300 起(2300 以下不属专业体系,显示"—"):
| 开球网 | 2300 | 2400 | 2500 | 2600 | 2700 | 2800 | 2900 | 3000 |
| 专业评分 | 30 | 39 | 49 | 59 | 69 | 79 | 89 | 100 |
1.4 绝对属性(引擎唯一标尺,0-100)
核心概念:物理引擎、比赛模拟、失误计算全部只认"绝对属性"。业余/专业标尺只是显示层包装。PlayerAttrs.attrs 存的就是绝对属性;get_attr() 返回"绝对×器材修正×本场发挥系数"。
| 开球网段 | 绝对属性上限 | 典型绝对属性 |
| 400-800 | 20 | 5-15 |
| 800-1200 | 35 | 15-28 |
| 1200-1600 | 55 | 28-45 |
| 1600-2000 | 75 | 45-60 |
| 2000-2200 | 58 | 50-56 |
| 2200-2300 | 61 | 54-61 |
| 2300-2500 | 75 | 61-75 |
| 2500-2700 | 85 | 75-85 |
| 2700-3000 | 100 | 85-100 |
用户新标定(2025 更新):2300 = 绝对属性上限 61;2500 = 75;2500-2700 即 75-85。95+ 只给马龙(95.5);樊振东/张继科/瓦尔德内尔 ≈ 93;其余真实球员同比例缩放(见 6.1)。
1.5 单项属性双标尺换算(核心公式,已在 src/scale.gd)
业余 → 绝对: 绝对 → 业余:
v≤60: v×0.55 v≤33: v/0.55
60<v≤80: 33+(v-60)×0.8 33<v≤49: 60+(v-33)/0.8
80<v≤90: 49+(v-80)×1.1 49<v≤60: 80+(v-49)/1.1
v>90: 60+(v-90)×4.0 v>60: 90+(v-60)/4.0
专业 → 绝对: 绝对 → 专业:
v≤30: 40+v×0.7 v<40: 0(专业体系外)
30<v≤50: 61+(v-30)×0.7 40≤v≤61: (v-40)/0.7
50<v≤70: 75+(v-50)×0.5 61≤v≤75: 30+(v-61)/0.7
v>70: 85+(v-70)×0.5 75≤v≤85: 50+(v-75)/0.5
v>85: 70+(v-85)/0.5
用户新标定(2025 更新):专业 30(青训/开球网 2300) = 绝对 61;专业 50(二线/2500) = 绝对 75;专业 70(主力/2700) = 绝对 85;专业 100 = 绝对 100(传奇)。95+ 仅马龙(绝对 95.5 ≈ 专业 91);樊振东/张继科/老瓦绝对 93 ≈ 专业 86。
| 关键锚点 | 业余 | 绝对 | 专业 | 含义 |
| 业余90 = 绝对60 ≈ 开球网2200 | 90 | 60 | 0(专业体系外) | 业余顶级单项 ≈ 专业门外 |
| 专业30 = 绝对61 ≈ 开球网2300 | 91 | 61 | 30 | 青训入门(16岁国青) |
| 专业50 = 绝对75 ≈ 开球网2500 | 94 | 75 | 50 | 职业二线 |
| 专业70 = 绝对85 ≈ 开球网2700 | 96 | 85 | 70 | 职业主力/世界级 |
陷阱(历史 bug):绝不能把"业余评分/专业评分"直接当绝对属性用——必须经换算。曾把 2200 对手按"业余78"直接设绝对78,导致对手凭空强 20 点。
1.6 总评(绝对总评)计算
总评 = Σ(大类评分 × 风格权重)
大类评分 = Σ(子属性 × 类内权重) (进攻类先算"正手拉球总评=前冲0.5+高吊0.3+侧拐0.2"等复合项)
风格权重(7风格,主0.7+副0.3混合):
进攻型 .35/.10/.15/.10/.20/.10 快攻型 .30/.10/.20/.10/.20/.10
弧圈相持 .35/.10/.10/.10/.25/.10 台内控制 .20/.10/.30/.15/.15/.10
防守反击 .15/.30/.15/.10/.20/.10 削球型 .10/.35/.10/.10/.25/.10
变化型 .20/.10/.20/.20/.15/.15 (顺序:进攻/防守/台内/发接/步法/心理)
器材修正先加在属性上(横拍反手拧拉+3…、正胶旋转类×0.85…),再截断开球网段上限,再加权。
总评与单项标尺的关系:总评是属性加权(绝对口径)。显示时再经绝对→专业/业余换算。16 岁青训开局:开球网 2300 → 绝对属性上限 61、绝对属性基础 58-61(核心技术/步法=61)、绝对总评约 60、专业综评≈29。
2. 属性机制(54 项,每项"差 1 分"的影响)
2.1 属性 → 物理参数的通用公式链
挥拍速度 swing = 基础速度 × (0.6+0.6·技术/100) × (0.8+0.4·爆发力/100) × 状态系数
目标转速 ω = 顶级理论转速 × (技术/100) × (0.8+0.4·手腕/100) (上限900 rad/s≈143转/秒)
拍面误差 err = ((1-技术/100)×0.04 + 0.006 + (1-技术/100)×0.02×来球旋转强度) × (1-手腕/100×0.4)
主动失误率 p = 基础失误率(按技术) × (1-技术/100) × 心理(1+(1-沉着/100)×0.5) × 体能(1+疲劳) × 风险(0.6+0.8×risk)
质量系数 Q = (技术/100)×(爆发力/100)×(手腕/100)×手感×rand(0.9~1.1)
落点深度 = 0.45+0.7×(技术/100)^1.2 (控制型技术改打短球0.25+0.4·t/100)
够球率 P = 1/(1+e^(-(步法分-来球难度)/8)), 步法分=启动×0.3+移动精度×0.5+还原×0.2
2.2 技术类属性(38 项)差 1 分的通用效果
技术属性 t 每 +1 分(以 t=70 为基准的典型值):
| 影响项 | 公式 | t=70→71 变化 | t=90→91 变化 |
| 挥拍速度 | ×(0.6+0.6·t/100) | +0.60% | +0.53% |
| 出球旋转 | ×(t/100) | +1.43% | +1.11% |
| 拍面误差 | -(0.04+0.02·spin)/100 rad | -0.0006 rad(-0.034°,-3.4%) | -0.0004 rad(-5.5%) |
| 主动失误率 | ×(1-t/100) | -3.3%(相对) | -10%(相对) |
| 质量系数 Q | ×(t/100) | +1.43% | +1.11% |
| 落点深度 | 0.45+0.7·(t/100)^1.2 | +0.6%(≈+0.6cm) | +0.5% |
| AI 选择权重 | score=t/100·aggr-失误×0.6 | +1%·aggr | +1%·aggr |
各技术的基础值差异(决定"同属性下不同技术强度"):
| 技术 | 基础球速 m/s | 顶级转速 rad/s | 旋转类型 | 基础失误率 | 进攻性 aggr |
| 正手拉前冲 | 11.0 | 900 | 上旋 | 0.04 | 0.85 |
| 正手拉高吊 | 8.0 | 820 | 上旋 | 0.02 | 0.50 |
| 正手侧身爆冲 | 12.5 | 940 | 上旋 | 0.04 | 0.95 |
| 正手攻球 | 10.5 | 160 | 不转 | 0.02 | 0.70 |
| 正手拍击 | 13.0 | 90 | 不转 | 0.08 | 0.75 |
| 正手快带 | 10.0 | 600 | 上旋 | 0.02 | 0.60 |
| 正手反拉 | 11.0 | 880 | 上旋 | 0.04 | 0.70 |
| 正手挑打 | 8.5 | 200 | 不转 | 0.02 | 0.60 |
| 正手抹/晃撇 | 6.5 | 420-450 | 侧旋 | 0.02 | 0.40 |
| 撇拉 | 8.0 | 600 | 侧旋 | 0.02 | 0.50 |
| 反手攻球 | 9.5 | 150 | 不转 | 0.02 | 0.65 |
| 反手弹击 | 12.0 | 110 | 不转 | 0.08 | 0.80 |
| 反手撕 | 9.5 | 720 | 上旋 | 0.04 | 0.70 |
| 反手拉前冲 | 10.0 | 850 | 上旋 | 0.04 | 0.80 |
| 反手拉高吊 | 7.5 | 800 | 上旋 | 0.02 | 0.55 |
| 反手拧拉 | 8.5 | 750 | 侧上旋 | 0.05 | 0.70 |
| 反手侧拧 | 8.0 | 700 | 侧上旋 | 0.05 | 0.70 |
| 反手挑打 | 8.0 | 180 | 不转 | 0.02 | 0.60 |
| 反手侧喇 | 7.5 | 520 | 侧旋 | 0.02 | 0.50 |
| 反手抹 | 6.5 | 430 | 侧旋 | 0.02 | 0.40 |
| 反手反拉 | 10.5 | 850 | 上旋 | 0.04 | 0.65 |
| 扣杀高球 | 15.0 | 250 | 不转 | 0.08 | 1.00 |
| 直拍横打 | 9.5 | 220 | 上旋 | 0.04 | 0.60 |
| 防守 | 7.5 | 120 | 不转 | 0.015 | 0.25 |
| 快带 | 9.0 | 600 | 上旋 | 0.02 | 0.50 |
| 侧切 | 5.5 | 500 | 下旋 | 0.03 | 0.35 |
| 吸短 | 3.0 | 300 | 下旋 | 0.02 | 0.20 |
| 放高球 | 5.5 | 450 | 上旋 | 0.03 | 0.20 |
| 削球 | 5.5 | 650 | 下旋 | 0.03 | 0.30 |
| 防回头 | 9.0 | 260 | 不转 | 0.015 | 0.50 |
| 直拍推挡 | 8.0 | 100 | 不转 | 0.015 | 0.40 |
| 摆短 | 3.2 | 500 | 下旋 | 0.01 | 0.30 |
| 劈长 | 6.5 | 600 | 下旋 | 0.01 | 0.35 |
| 晃撇 | 6.5 | 430 | 侧旋 | 0.01 | 0.40 |
| 翻挑 | 7.5 | 200 | 不转 | 0.01 | 0.50 |
| 晃搓 | 4.5 | 480 | 下旋 | 0.01 | 0.30 |
| 兜球 | 5.5 | 400 | 侧旋 | 0.02 | 0.40 |
特殊修正:侧切出球速度×(0.5+0.5·侧切/100)卸力;吸短×(0.4+0.6·吸短/100)减力;扣杀失误=0.08×(1-扣杀/100)×(0.3+1-沉着/100)×体能×风险;放高球失误=0.03×(1-放高球/100)×(0.3+1-核心腰腹/100)×体能×风险。
2.3 身体类(7 项)差 1 分的影响
| 属性 | 引擎用途 | +1 分的具体效果 |
| 启动速度 | 步法分×0.3;移动速度=2+4·t/100 m/s;反应延迟=0.05+0.15·(1-t/100) | 步法分+0.3;移速+0.04m/s;反应-0.0015s;够球率(难度50时)+约0.9个百分点(在P=0.5附近) |
| 移动精度 | 步法分×0.5;击球点偏移(1-到位系数)×0.15;发球落点精度×0.5 | 步法分+0.5(够球影响最大项,约+1.5个百分点);到位偏移减小 |
| 还原节奏 | 步法分×0.2 | 步法分+0.2(约+0.6个百分点够球率) |
| 爆发力 | 挥拍速度×(0.8+0.4·t/100);发球速度同款 | 出球速度+0.4%(≈0.05m/s);单板质量+约0.4% |
| 核心腰腹 | 放高球失误(0.3+1-核心/100)项;横拍修正+2 | 放高球失误-约0.5%(相对) |
| 手腕柔韧性 | 转速×(0.8+0.4·t/100);拍面误差×(1-t/100×0.4) | 转速+0.4%;拍面误差-0.4%(旋转类技术收益明显) |
| 耐力 | 疲劳累积速率=0.012×(1.5-t/100)/分;疲劳→质量惩罚≤25%+失误率×(1+疲劳)+移动/反应衰减 | 每分疲劳累积-0.00012;疲劳满的时间延后约1.3%/分 |
2.4 心理类(4 项)差 1 分的影响
| 属性 | 引擎用途 | +1 分的具体效果 |
| 沉着 | 失误率心理系数(1+(1-t/100)×0.5);士气波动值 0.08×(1-t/100×0.6);关键分≥85→1.08;扣杀失误(0.3+1-t/100)项 | 失误率-0.3~0.5%(相对);士气波动-0.6%(大心脏);关键分稳 |
| 胆识 | 冒险基线×(0.7+0.6·t/100);关键分≥85→+0.1风险 | risk+0.006→发力+约0.15%、失误率+约0.4%(搏杀倾向,收益与风险并存) |
| 算球能力 | 预留:博弈预测/预判线路(当前公式未直接调用,待接入) | 暂无(设计位置:AI 技术选择的"对手失误概率"评估精度) |
| 变化 | 发球变化频率=t/100;发球旋转强度(0.7+0.3·t/100);变化型风格≥80 偶发抢攻 | 发球多样性+1%;发球旋转+0.3% |
2.5 发接类(4 项)差 1 分的影响
| 属性 | 引擎用途 | +1 分的具体效果 |
| 发球旋转 | 发球转速×t/100;发球失误0.15×(1-t/100);发球质量系数(对手接发难度)×0.7 | 发球转速+1%;双误率-0.15个百分点;对手接发难度+0.7% |
| 发球隐蔽性 | 对手判断准确率×(1-t/100×0.5);发球失误(1-t/100)项;发球质量系数×0.3 | 对手判断-0.5%;发球失误-约1%(相对) |
| 发球变化 | 旋转强度(0.7+0.3·t/100);落点精度(移动精度×0.5+t×0.5)/100 | 发球旋转+0.3%;发球落点误差-0.5% |
| 接发球判断 | 判断准确率=t/100×(1-隐蔽×0.5)×rand;接发失误0.05×(1-判断)×(1-技术)×心理;回球质量系数0.5+0.5×判断 | 判断+1%(被隐蔽×0.5打折);接发失误-约3%(相对);接发回球质量+0.5% |
2.6 隐藏属性(5 项)
| 属性 | 作用 | +1 分效果 |
| 稳定性 | 士气波动×(1-t/100×0.5) | 情绪起伏-0.5% |
| 关键分 | 关键分系数=max(…,1+t/100×0.08) | 10平后属性+0.08% |
| 大赛发挥 | 大赛 form×(1+t/100×0.1) | 大赛场次发挥+0.1% |
| 伤病倾向 | 每场受伤率=t/100×0.05;受伤 form×0.85 | 受伤率+0.05% |
| 潜力(星级1-5) | 训练潜力系数0.6~1.4 | — |
3. AI 球员决策机制
3.1 三层思维链(src/brain.gd)
战略层(比赛/局间):风格→主基调(attack/control/defend);总评差>25→风险基线×0.55求稳;
比分落后→基线0.7、领先→0.35;再×胆识因子(0.7+0.6·胆识/100);压制区域=对手弱侧(反手/正手/中路)。
战术层(每回合):round_intent() 抢攻/控制/防守(连失2分+信心低→转控制;手感热→抢攻);
serve_tactic() 发球旋转/落点/速度(对手接发弱→多变旋转;压对手弱侧)。
执行层(每拍 _strike):技术选择=策略表(按来球旋转×落点)→机会球识别(对手质量<0.4→拧拉/爆冲/扣杀)
→冒险度 risk(见3.2)→接发判断→主动失误roll→意图生成→物理裁决。
3.2 冒险/搏杀管线(risk)
risk = clamp(战略基线(0.7+0.6·胆识/100 修正) + 意图(抢攻+0.15/防守-0.2)
+ 比分(落后3分+0.2/领先4分-0.15) + 手感(热+0.1/连失-0.1)
+ 关键分(沉着≥85-0.1/胆识≥85+0.1), 0.05~0.95)
× 士气(0.35+0.65·士气)
risk 三出口:① 发力 swing×(0.8+0.4·risk) ② 失误率×(0.6+0.8·risk) ③ 技术选择(risk≥0.55→爆冲/扣杀,否则拉前冲)
物理裁决兜底:risk高→球快→可行角度窗口窄→拍面误差推出窗口→出界/下网(冒险=高失误的物理来源,非概率硬凑)
反馈:连续下网/出界≥2→swing×0.88收力(自动从搏杀降级,不会无限失误)
3.3 状态机制(士气/疲劳/发挥系数)
士气 morale(0-1):得分+波动×0.7;主动失误-波动×2.2(莫名其妙没打上波动最大);被压失分-波动×1.0;
连得3分+波动×0.8回稳。波动值=0.08×(1-沉着/100×0.6)×(1-稳定性/100×0.5)。
士气低→保守(risk×士气因子)+士气<0.3→失误率×1.15(决策崩盘)。
疲劳 fatigue(0-1):每分+0.012×(1.5-耐力/100);疲劳→质量惩罚≤25%+失误率×(1+疲劳)+移动-30%+反应+40%+步法分-35%。
发挥系数 form=状态系数(0.85+0.3×近期状态)×士气心理(1+(士气-0.5)×0.2)×大赛(1+大赛发挥/100×0.1)×伤病(0.85)。
最终有效属性=绝对属性×器材修正×form(比赛引擎每分刷新;比赛后复位,防残留污染球员卡)。
3.4 技术选择细节
策略表(select_technique):近网下旋→摆短/劈长/拧拉/挑打/晃搓…;近网上旋→挑打/弹击/拧拉;
底线长下旋→拉高吊/拉前冲/削球;底线长上旋→快带/反拉/攻球;追身→攻球/推挡/防守;高球→扣杀。
机会球:对手质量Q<0.4→台内拧拉/挑打、中台risk≥0.55爆冲否则拉前冲、高球risk≥0.55扣杀否则拉前冲。
有限博弈(expect_advantage):每个候选技术算"我的出球质量→对手失误概率-我的失误概率",加权0.6进技术得分。
AI 决策:70% 选得分最高技术,30% 属性加权随机(临场变化)。
3.5 器材机制
| 项 | 效果 |
| 直拍 | 直拍横打/推挡+5、正手挑打/摆短+3、手腕+2;反手位技术池含直拍横打(横拍球员这两项=无此项) |
| 横拍 | 反手拧拉/撕+3、反手拉前冲/核心腰腹+2 |
| 反胶 | 基准(全面) |
| 正胶 | 拉球类×0.85、拍击/攻球/弹击+8(速度型,旋转弱) |
| 生胶 | 反手弹击/攻球/撕+10、拉球×0.8、接发判断+5(不吃转) |
| 长胶 | 削球+10、拉球/攻球/扣杀×0.9(削球手) |
3.6 徽章系统(12 枚,src/badges.gd)
触发:技术/情境(接发/相持/关键分/落后)匹配→每效果独立概率→应用。
效果类型:属性提升(可破上限)/球速提升/旋转提升/失误率降低/直接得分(发力×1.25)。
例:霸王拧(拧拉30%旋转+30%速度+25%、8%直接得分)、前三板大师(接发全属性+20%必触发)、
大心脏(关键分沉着胆识+20%、失误-30%)、绝地反击(落后全属性+10%)、发球机器(发球旋转+20%隐蔽+15%)。
开局按风格赠送(STYLE_BADGES)+大心脏。
4. 物理引擎运算方式
4.1 飞行(RK4,dt=0.0005s)
力:重力(9.81,-z)+空气阻力+马格努斯。马格努斯 |Fm|=0.5·ρ·A·Cm·v²·(ω×v)/|ω||v| ——大小只与v²有关、与转速无关!
下压力 a_m=0.0561·v²(球向+X飞、上旋ω=+Y时向下);实战用平均系数0.0382·v²(球速飞行中衰减到0.6-0.7,平均下压力≈0.68×瞬时)。
旋转衰减:ω(t)=ω0·e^(-λt)。
4.2 碰撞
台:法向恢复0.9+库仑摩擦μ=0.5,切向冲量封顶 min(μ·jn, 2/7·|v_t|)。下旋球底部前滚→摩擦削减前向速度→
多次弹跳后回跳/停台(已实验验证:ω=550慢发高弧23次弹跳停在对方半台近网)。
网:薄片模型,x反向低恢复(0.3),y/z衰减。
拍:平面碰撞,恢复0.85,摩擦0.8,无滑移封顶;碰撞后旋转=0.3×物理+0.7×目标旋转(简化旋转传递)。
4.3 目标导向击球模型(2025 重写,用户批准):每板两步
① 判定阶段(属性驱动):技术/战术 → 目标落点区域(安全区,不贴底线;技术决定深浅、战术决定左右、risk 决定深浅)+ 属性散布(σ = 0.02+0.28×(1−t/100)^2 rad,安全阈值下限 0.02 rad=现实高手落点精度极限)→ 上台概率 p_on = 0.85+0.15×t − 0.25×来球质量(受迫) − 主动失误率,接发再×判断系数;失败 = 下网/出界,回合结束。
失误率(用户规格 2025):主动失误率 = 自身技术基础(基础失误率×(1−t/100)^1.5,心理/体能/冒险修正) + 绝对属性差距项(正降负加):自己绝对 ≥61 每分差距 0.85%、50-60 每分 1.0%、40-50 每分 1.25%、0-40 每分 1.5%(对手总评−自己总评)。全局上限 70%(平衡机制:1200 新手打明显强者时"10个自杀7,8个"),下限 0.3%(现实记录)。1200 打 1200 差距项=0,不会全失误。
② 物理生成阶段(反推+模拟):由目标落点反推出球速度(纯重力估算 v_h=L/t_f、v_z=(z_T−z0+½gt²)/t_f,含过网约束与马格努斯有效重力)→ 2-3 次 RK4 短模拟迭代校准(残差 ≤5cm)→ 将出球状态交给物理引擎,RK4 完整飞行(阻力/马格努斯/弹跳)裁决。
循环:击球 → 够球判定(线性曲线)→ 对手击球。失误率与落点完全由属性决定;离拍后轨迹完全物理。安全阈值:球速 ≤16 m/s(常规)/20(扣杀)、失误率 ≥0.3%、落点散布 ≥0.02 rad、有效属性 ≤100。
(原"拍面角+经验压拍"实现已废弃:碰撞微观过程由反推取代,见开发日志 16)
4.3旧 意图生成+物理裁决(击球核心,_strike)
1 技术选择(策略表/机会球/博弈) → 2 冒险度risk → 3 接发判断(首拍:判断准确率=接发判断/100×(1-隐蔽×0.5)×rand)
→ 4 主动失误roll(基础失误率×(1-技术/100)×心理×体能×风险) → 5 意图:
swing=基础×(0.6+0.6·技/100)×(0.8+0.4·爆/100)×状态×risk×疲劳惩罚
目标仰角=射程公式(平均Magnus修正)+过网约束+经验压拍(上旋来球摩擦抬vz→压拍 atan((2/7)·R·ω/v)×技术精度)
发力控制:出球速度≤可行上限v_max(二分,保证"过网且落台内"的最大速度;含迎面来球借力)
→ 6 拍面误差±err(属性决定) → 7 racket.collide → RK4飞行 → 触台/撞网/出界/漏球 由引擎判定(不保证上台)。
4.4 失误模型
主动失误(非受迫)=概率roll+物理失误,只关自己属性(与对手级别无关)。
受迫失误=对手来球质量Q≥0.45压制(王0.87压李、李0.03压不动王、同级≈0.5部分受迫)。
物理失误=拍面误差把出球推出可行角度窗口(快球窗口窄→搏杀天然高失误)。
够球判定:P=1/(1+e^(-(步法分-来球难度)/8)),来球难度=球速×0.3+旋转×0.3+落点×0.4(各0-100)。
E-R-L:执行-应对+运气>10→敢打满速+擦边运气;<0→误差×1.5+低分失误概率。
5. 每一分的差距意味着什么
5.1 总评差 1 分
| 绝对总评分段 | 对应水平 | 开球网参考 | 专业/业余综评参考 |
| 20-30 | 纯新手/入门 | 400-800 | 业余 5-15 |
| 30-40 | 初级爱好者 | 800-1200 | 业余 15-28 |
| 40-48 | 中级爱好者 | 1200-1600 | 业余 28-50 |
| 48-55 | 业余好手 | 1600-2000 | 业余 50-70 |
| 55-61 | 业余顶级 / 专业入门 | 2000-2300 | 业余 70-85 / 专业 21-30 |
| 61-75 | 职业(青训→二线) | 2300-2500 | 专业 30-50 |
| 75-85 | 职业主力 / 世界级 | 2500-2700 | 专业 50-70 |
| 85-93 | 世界顶尖 | 2700-2900 | 专业 70-86(樊振东/张继科/老瓦 93 ≈ 专业 86) |
| 93-100 | 历史传奇 | 2900-3000 | 专业 86-100(95+ 仅马龙 95.5 ≈ 专业 91) |
展示口径(2025 更新):界面一律优先展示"专业综评/业余综评"(由绝对总评经双标尺换算),开球网作为底层锚点仅在业余邀请赛等场合附属显示。
设计口径:总评差 1 分 ≈ 开球网差 20 分 ≈ 胜率 53%(ELO)。总评差 5 分 ≈ 胜率 60%,差 10 分 ≈ 70%,差 20 分 ≈ 80%+。
5.2 单项技术差 1 分(汇总,实测口径)
| 差距 | 出球速度 | 转速 | 拍面误差 | 主动失误率 | 质量Q | 综合感受 |
| 技术 60→61 | +0.6% | +1.7% | -3.4% | -2.4%(相对) | +1.7% | 几乎无感(需多拍累积) |
| 技术 70→80(10分) | +6% | +14% | -24% | -33% | +14% | 一个档次(失误率明显下降+球质更高) |
| 技术 90→91 | +0.5% | +1.1% | -5.5% | -10%(相对) | +1.1% | 顶尖段每分更金贵(失误率绝对值已很低) |
关键理解:技术属性同时作用 6 个出口(速度/转速/误差/失误率/质量/落点),单项+1 的单板收益约 0.5-1.5%,乘以每局 20-50 拍,对同水平对手的净胜率影响约 +0.5~1 个百分点。所以"差 1 分"单看微小,但"差 10 分 = 一个档次"是设计口径(与 FC 的"总评 +1 是大事、+5 是档次"同理)。
5.3 开球网差 100 分
ELO 预期胜率 64%。实测(新标定:青训绝对总评 60 vs 2200 业余绝对总评 54.8,差 5.2 分):约 6:4 开(10 场 8 胜、55.6% 分胜率),符合"总评差 5 分 ≈ 胜率 60%"口径;状态差(0.7)时约 55 开,低谷(0.5)可反转至 5:5。
5.4 初始球员 vs 各段对手(实测 3 种子,供校准参考)
| 对手 | 绝对总评 | 结果 |
| 开球网1800(业余75→绝对45) | 45 | 2:0 碾压(每局对手3-5分) |
| 开球网2000(业余82→绝对53) | 53 | 2:0 优势 |
| 开球网2200(业余85→绝对54.8) | 54.8 | 8/10 场 ≈ 6:4(用户口径),状态差可反转 |
| 张守衡(省队级,长胶削球) | 82 | 0:2 劣势(能咬1局) |
| 王全能(专业90) | 95 | 0:2 大劣势 |
| 王楚钦(世界第1) | 96.4 | — |
6. 真实球员数据(主观标定,如何自己改)
诚实说明:前 20 名选手的姓名/国籍/排名/握拍/打法来自 2026 年公开新闻(世排:王楚钦第1、19岁勒布伦升至第2、林诗栋第6等),但每人的绝对属性数值是按用户新标定同比例缩放(95+ 仅马龙 95.5;樊振东/张继科/老瓦 93;世界第1 王楚钦 90;前 10 ≈ 86-88.5;11-20 ≈ 80-85;21-50 ≈ 75-80;51-100 ≈ 67-74;101-200 ≈ 59-66;201-300 ≈ 53-58;300+ ≈ 48-52),不是真实技术报告。你完全可以按 FC 的方式逐人改。
6.1 怎么改(全部在 src/pros.gd)
const TOP20 := [
{"name": "王楚钦", "nation": "中国", "rank": 1, "style": "进攻型", "grip": "横拍", "rubber": "反胶", "abs": 96.0},
...
]
每行改:abs=绝对属性中心(总分水平)、style=打法(决定AI战术+风格权重)、grip/rubber=器材。
生成时按 abs ±2 分散到 54 项,核心打法属性再 +4。
世界排名→绝对属性映射(abs_by_rank)也在同文件,想改梯度就改它。
赛事对手段(tournament.gd LEVELS 的 opp_rank)决定各赛事遇到的世界排名区间。
6.2 FC 式定制的建议落点
FC 的"总评=多小项加权、每项影响比赛行为"我们已经具备;要更精细可加:正手/反手/中路倾向、步法覆盖半径、比赛风格徽章树、潜力动态上限、伤病恢复时间等(当前隐藏属性只做了 5 项基础版)。
7. 开发日志
| 阶段 | 内容 | 关键决策/踩坑 |
| 1. 物理内核 | RK4 飞行/台网拍碰撞/够球判定,37 项解析对照测试 | 坐标 z-up;无滑移封顶 2/7 修掉转速虚高 2405rad/s;触台吸附 +R;rc=-R·n 修上旋刷成下旋 |
| 2. 属性体系 | 54 项技术/六大类/7 风格权重/训练成长公式/示例球员 | 复合项(正手拉球总评);单项+5 对总评影响约0.2 的设计原则 |
| 3. 比赛引擎 | 发球/接发判断/回合/计分/统计/赛后评分/播报 | 曾用"牛顿搜索保证上台"→被否(保送),改为意图生成+物理裁决 |
| 4. 拟真改造 | 去保送、旋转上限改现实900rad/s、冒险求稳、主动/受迫失误分离、经验压拍 | 最大教训:任何"保证上台"都违反用户拟真要求;失误必须由属性+物理自然产生 |
| 5. 三层思维链 | brain.gd:战略/战术/执行+对手建模+博弈预测+战术规则库 | 机会球识别(软球爆冲);领先求稳/落后搏杀 |
| 6. 状态机制 | 士气(沉着决定波动)/疲劳(质量惩罚≤25%+失误线性)/发挥系数form/伤病/大赛 | 七局四胜实验:90专业带状态惩罚仍 4:0 反制1800业余 |
| 7. 评分体系 | 开球网ELO+业余/专业映射+属性上限表+总评截断 | — |
| 8. 双标尺 | 单项属性业余/专业标尺(scale.gd),四段换算 | bug教训:业余评分直接当绝对属性→对手虚强20点;专业0=绝对60 的语义靠"直拍专属=无此项"规避 |
| 9. 器材 | 握拍侧重/四种胶皮/直拍横打专属 | aggr() 未知技术崩溃(直拍横打不在表内) |
| 10. 物理实验 | 死转下旋回跳(完整轨迹至静止)、非常规技术vs30 | 台面摩擦0.15→0.5 才能回跳;只看首跳会误判 |
| 11. 生涯循环 | 徽章12枚/副风格/比赛经验/15天周期/回合制挂起(manual_player/inject_choice) | form 残留污染总评(手动循环没调 after_match);经验只统计最后一点(shot_log 每分清空) |
| 12. WTT赛事 | 六层级排名解锁/真实选手库/国内邀请赛/主页推进动画 | 世界排名与开球网分离(用户核心指正);rank_req=0 判定 bug |
| 13. 打包 | Godot 便携 exe+同名 pck 双击即玩;export templates 网络受限未下成 | pck 自动加载规则(乒乓生涯.exe+乒乓生涯.pck) |
| 14. 新标定 | 2300→绝对61、2500→75、2500-2700→75-85、95+仅马龙(95.5)、樊/张/老瓦93;专业标尺 30→61/50→75/70→85;青训开局绝对总评60(专业≈29);展示改专业/业余综评 | 用户指令(2025);CAP_TABLE/scale.gd/pros.gd 同步;文档 1.4/1.5/5.1 更新 |
| 15. 平衡与修复 | 发球转速量级(下旋550 rad/s)+洗下旋扣减;接发高点击球;出界球误判"漏球"修复;压拍补偿按 th 扫描标定;机会球稳杀;瞄准马格努斯系数标定 0.042 | 旧模型实测 2300 vs 2200 = 8/10 场、55.6% 分(≈6:4);9 套件 202 项全绿 |
| 16. 目标导向击球模型(用户批准重构) | 每板两步:①属性判定(目标落点+散布+上台概率,失败=失误) ②物理生成(反推初速+过网约束+2-3次RK4迭代校准→物理引擎裁决);删除拍面角/压拍/瞄准近似链;安全阈值体系(球速/失误率/落点散布/有效属性);传奇精确属性卡(瓦尔德内尔:台内控制+变化型、反手拧拉=0、三金徽章:游击队长(err-30%)/防守大师(防守+20%)/魔术师(前三板全属性+30%));get_attr 封顶 100 | 实测:老瓦(总评90.3)vs 青训(60) 85% 分 20:0 场次、vs 2200 业余 84% 20:0(碾压 ✓);vs 王楚钦/樊/张/马龙 78-79%(其他传奇暂无徽章,待配卡);青训 vs 2200 71%(跨级别压制);9 套件 202 项全绿 |
| 18. 游玩环节大修(用户规格) | ①奠基技术:正/反手攻球、防守不作为比赛可选技术,改底层修正(有效属性=具体×0.85+奠基×0.15),UI 标注"奠基" ②发球模型:10 类发球(下旋/上旋/奔球/左侧上·下旋/右侧上·下旋/转不转/高抛/下蹲砍式)+ 任意落点点选 + 失误率机制判定成功率 + 物理运算确认 + 发球后落点判定(近网/半出台/底线×正手位/中路/反手位) ③接发与阶段切换:接发方看落点与判断旋转;技术可用矩阵(位置×旋转×时间刁钻)过滤;≤3板前三板池(发球抢攻,非常规技术≥90破例),>3板相持全池 ④2D双窗可视化(俯视球台/拍位/落点+侧视球高/弧线) ⑤决策动画(回放来球动画,球与拍逐帧,决策前静止;够不到球=漏球由 reach 判定裁决) | 9 套件 203 项全绿;老瓦 vs 青训 87% 20:0 碾压保持 |
| 17. 失误率机制(用户规格) | 主动失误 = 自身技术基础 + 绝对属性差距项(≥61:0.85%/分;50-60:1%/分;40-50:1.25%/分;0-40:1.5%/分,正降负加)+ 对手回球质量(受迫);全局上限 70%、下限 0.3%;无分段自杀率(1200 打 1200 差距=0 不全是失误,1200 打强者时差距项推高至 70% 上限 → "10个自杀7,8个") | 实测:老瓦 vs 青训 85%(差距 −30×0.85% → 失误压至下限);青训 vs 2200 71%(差距 ±5.2×1% 双向);传奇内部 78-79%(待配卡) |
附:参数手册
详细参数手册(所有公式/常量/属性作用点/调参入口):参数手册.html —— 含物理常量表、属性→物理公式(swing/转速/落点散布/失误率/质量/接发)、比赛引擎判定(发球/够球/目标导向击球)、思维链、徽章、平衡实测与调参速查表。
附:测试与运行
cd /root/1234/tt-physics
./run.sh # 启动游戏(Linux)
godot --headless --path . --script res://tests/run_XXX.gd # 9 套件:
run_tests(物理37) run_match_tests(比赛52) run_rating_test(评分19) run_state_test(状态25)
run_career_test(生涯19) run_interactive_test(回合制4) run_ui_test(UI流程8)
run_scale_test(双标尺19) run_tour_test(赛事17)
Windows 版下载:https://theparadiseoftabletennis.art/ttcareer/ttcareer-windows.zip
—— 文档完。所有公式与数值均可在 src/ 源码与 tests/ 断言中逐条核对 ——