《乒乓生涯》后端参数手册
面向「调整参数」的完整后端说明:所有公式、常量、属性作用点、比赛判定规则,与 src/ 源码逐条对应。改参数前先查此表,改完跑 tests/ 回归。
0. 调参速查表(想调什么 → 去哪改)
| 想调的东西 | 文件 → 常量/函数 |
| 球速快慢/弧线高低 | stroke.gd TECHS 各技术 speed;match.gd _launch_ball tf(飞行时间 0.22/0.30/0.46s) |
| 球的旋转强度 | stroke.gd TECHS omega + target_omega(上限 900);ball.gd ROT_DECAY(0.2) |
| 马格努斯/空气效应 | constants.gd MAGNUS_COEFF(0.2)/DRAG_COEFF(0.5);ball.gd forces_at |
| 球台弹性/摩擦(回跳) | constants.gd TABLE_RESTITUTION(0.9)/TABLE_FRICTION(0.5);table.gd 旋转耦合系数 0.6 |
| 技战术失误率曲线 | stroke.gd unforced_prob(指数 1.5、下限 0.3%、上限 70%) |
| 属性差距的失误率 | stroke.gd gap_miss_rate(≥61:0.85%/分;50-60:1%;40-50:1.25%;0-40:1.5%) |
| 落点散布(高手多准) | stroke.gd angle_error(σ=0.02+0.28×(1−t)²,clamp[0.02,0.35]) |
| 上台概率总体 | match.gd _ontable_prob(0.85+0.15t −0.5×max(Q−0.30,0) −主动失误 −接发判断惩罚) |
| 够球率(接得到接不到) | match.gd reach_p 公式 + 坡度 80/偏移 100 |
| 反应/移动速度 | match.gd _reaction_delay / ms = 2+4×启动/100 / brain fatigue |
| 发球成功率/质量 | match.gd SERVE_TYPES + _serve 公式 |
| 总评/球员卡数值 | attrs.gd 类别权重/风格权重/复合项 |
| 技术水平锚点(2300→61…) | rating.gd CAP_TABLE;scale.gd 双标尺 |
| AI 决策风格 | brain.gd setup_strategy/round_intent/serve_tactic |
| 徽章强度 | badges.gd BADGES(pct/prob) |
| 速度现实上限 | stroke.gd swing_speed cap(常规16/扣杀20);match.gd 也 clamp 16 |
| 达标平衡参考 | §12 实测表(6:4、传奇 85% 等) |
1. 坐标系与物理常量(constants.gd / ball.gd / table.gd / net.gd / racket.gd)
1.1 坐标约定
z 轴向上;重力 −z;台面 z=0.76;网沿 z=0.9125;x 为球台长边方向(±1.37),y 为宽边方向(±0.7625)。渲染时映射为 Godot y-up。
1.2 物理常量表
| 常量 | 值 | 含义 |
| BALL_RADIUS / BALL_MASS | 0.02 m / 0.0027 kg | 标准 40mm 球 |
| BALL_INERTIA = 0.4·m·r² | — | 实心球转动惯量;角冲量换算 m/I = 2.5/r² |
| CONTACT_MASS_RATIO = 2/7 | 0.2857 | 接触点无滑移封顶(=I/(I+mR²)) |
| AIR_DENSITY / DRAG_COEFF | 1.205 / 0.5 | 空气阻力 F_d = 0.5·ρ·A·Cd·v² |
| MAGNUS_COEFF | 0.2 | 马格努斯 F_m = 0.5·ρ·A·Cm·v²·(ω×v)/|ω||v|(大小与转速无关,方向随 ω) |
| ROT_DECAY | 0.2 s⁻¹ | 旋转衰减 ω(t)=ω₀·e^(−0.2t) |
| GRAVITY | 9.81 | — |
| TABLE_LENGTH/WIDTH | 2.74 / 1.525 | 半长 1.37、半宽 0.7625 |
| NET_HEIGHT / NET_POST | 0.1525 / 0.9125 | 网上沿绝对高度 |
| TABLE_RESTITUTION / FRICTION | 0.9 / 0.5 | 台面法向恢复 + 库仑摩擦(0.5 才能让下旋球回跳) |
| NET_RESTITUTION / NET_WIDTH | 0.3 / 1.83 | 网薄片碰撞 |
| RACKET_RESTITUTION / FRICTION | 0.85 / 0.8 | 拍面碰撞 |
碰撞模型:台面 — 法向冲量 jn=1.9×v_n;切向库仑 jt=min(μ·jn, 2/7·|v_t|),角速度耦合 Δω=0.6·rc×J/I(0.6 为经验系数,保留弹跳后下旋)。拍面相同结构;击球后 ω_出 = 0.3×物理 + 0.7×目标。
2. 属性体系(attrs.gd)
2.1 属性一览(53 项,绝对标尺 0-100)
| 类别 | 属性(权重) |
| 进攻(25) | 正手攻球/拍击/拉前冲/拉高吊/拉侧拐/挑打/晃撇/抹/反拉/侧身爆冲/快带、撇拉、反手攻球/弹击/撕/拉前冲/拉高吊/拧拉/侧拧/挑打/侧喇/抹/反拉、扣杀高球、直拍横打 |
| 防守(8) | 防守、快带、侧切、吸短、放高球、削球、防回头、直拍推挡 |
| 台内(6) | 摆短、劈长、晃撇、翻挑、晃搓、兜球 |
| 发接(4) | 发球旋转、发球隐蔽性、发球变化、接发球判断 |
| 步法(7) | 启动速度、移动精度、还原节奏、爆发力、核心腰腹、手腕柔韧性、耐力 |
| 心理(4) | 算球能力、沉着、胆识、变化 |
2.2 六类评分(内部权重)
进攻大类:正手拉球总评 0.20(前冲0.5+高吊0.3+侧拐0.2) + 反手拉球总评 0.15(前冲0.5+高吊0.5)
+ 正手攻球0.08 反手攻球0.08 侧身爆冲0.06 拧拉0.06 撕0.05 挑打0.04 正/反拉0.04×2
快带0.03 晃撇0.03 抹0.02×2 侧喇0.02 拍击0.01 扣杀0.02 高吊0.008 侧拐0.004 撇拉0.002 侧拧0.002 反手挑打0.004 直拍横打0.02
防守:防守0.30 快带0.15 侧切0.10 吸短0.10 放高0.10 削球0.15 防回头0.05 直拍推挡0.05
台内:摆短0.30 劈长0.25 晃撇0.15 翻挑0.10 晃搓0.10 兜球0.10
发接:发球旋转0.25 隐蔽0.20 变化0.20 接发判断0.35
步法:启动0.20 移动0.20 还原0.20 爆发0.15 腰腹0.15 手腕0.05 耐力0.05
心理:算球0.25 沉着0.25 胆识0.25 变化0.25
(直拍横打/推挡:横拍球员该权重跳过→归一)
2.3 风格权重(7 风格 × 六类:[进攻/防守/台内/发接/步法/心理])
| 风格 | 进攻 | 防守 | 台内 | 发接 | 步法 | 心理 |
| 进攻型 | .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 |
总评 = Σ(六类分 × 风格权重);副风格时 权重 = 主×0.7 + 副×0.3。总评口径:基础属性 × 器材修正(不含 form,防污染)。
2.4 有效属性(战斗实际用)
get_attr(k) = clamp( [基础 × 器材修正(k)] × form , 0, 100 )
奠基修正(2025 用户规格):正手/反手/防守技术 = 具体×0.85 + 奠基×0.15 → 再 × form、封顶 100
正手技术(含 撇拉/晃撇) ← 正手攻球;反手技术 ← 反手攻球
防守类(快带/侧切/吸短/放高球/削球/防回头) ← 防守
奠基技术本身(正手攻球/反手攻球/防守)不做奠基修正
form = 0.85+0.3·state ×(1+(士气−0.5)×0.2)×(1+大赛发挥/100×0.1,仅 big_match)×(0.85 带伤),clamp[0.5,1.3]
2.5 器材修正表
| 器材 | 修正 |
| 直拍 | 直拍横打/推挡 +5;正手挑打/摆短 +3;手腕柔韧性 +2 |
| 横拍 | 反手拧拉/撕 +3;反手拉前冲/核心腰腹 +2 |
| 正胶 | 拉球类×0.85;拍击/攻球/弹击(正反手)+8 |
| 生胶 | 反手弹击/攻球/撕 +10;拉前冲(正反)/正手高吊×0.8;接发判断 +5 |
| 长胶 | 削球 +10;拉前冲/攻球/扣杀×0.9 |
2.6 隐藏属性(不显示,作用点)
| 隐藏属性 | 作用 |
| 稳定性 | 士气波动幅度 ×(1−稳定性/100×0.5) |
| 关键分 | clutch_factor:沉着≥85→1.08 / 胆识≥85→1.05(10 平后) |
| 大赛发挥 | big_match 时 form ×(1+大赛/100×0.1) |
| 伤病倾向 | 每场受伤率 = 倾向/100×0.05;受伤 form×0.85 |
3. 显示标尺(scale.gd / rating.gd)
3.1 单项属性双标尺(绝对为引擎唯一标尺)
业余 → 绝对: 绝对 → 业余:
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
专业 → 绝对(2025 新标定): 绝对 → 专业:
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
锚点:专业30=绝对61(2300) 专业50=绝对75(2500) 专业70=绝对85(2700)
95+仅马龙 95.5(专业91);樊振东/张继科/老瓦 93(专业86)
3.2 开球网/业余/专业评分(ELO 底层锚点)
业余分段:400→1 600→8 800→15 1000→22 1200→30 1400→40 1600→50 1800→60 2000→70 2200→78 2300→85 2500→95
专业分段:2300→30 2400→39 2500→49 2600→59 2700→69 2800→79 2900→89 3000→100(2300 以下不显示"—")
ELO: E=1/(1+10^((Rb−Ra)/400)), K=32
CAP_TABLE(开球网→绝对属性上限):400→10~14 段、800→20~24、1200→30~34、1600→40~43、
2000→50~52、2200→56~58、2300→61、2500→75、2700→85、3000→100(用户新标定)
4. 技术规格(stroke.gd TECHS 全表)
| 技术 | 基础球速 m/s | 顶级转速 rad/s | 旋转 | 基础失误率 | 进攻性 aggr |
| 正手拉前冲 | 11.0 | 900 | top | 0.04 | 0.85 |
| 正手拉高吊 | 8.0 | 820 | top | 0.02 | 0.50 |
| 正手侧身爆冲 | 12.5 | 940→封顶900 | top | 0.04 | 0.95 |
| 正手攻球(奠基) | 10.5 | 160 | none | 0.02 | 0.70 |
| 正手拍击 | 13.0 | 90 | none | 0.08 | 0.75 |
| 正手快带 | 10.0 | 600 | top | 0.02 | 0.60 |
| 正手反拉 | 11.0 | 880 | top | 0.04 | 0.70 |
| 正手挑打 | 8.5 | 200 | none | 0.02 | 0.60 |
| 正手抹/晃撇 | 6.5 | 450/420 | side | 0.02 | 0.40 |
| 撇拉 | 8.0 | 600 | side | 0.02 | 0.50 |
| 反手攻球(奠基) | 9.5 | 150 | none | 0.02 | 0.65 |
| 反手弹击 | 12.0 | 110 | none | 0.08 | 0.80 |
| 反手撕 | 9.5 | 720 | top | 0.04 | 0.70 |
| 反手拉前冲 | 10.0 | 850 | top | 0.04 | 0.80 |
| 反手拉高吊 | 7.5 | 800 | top | 0.02 | 0.55 |
| 反手拧拉 | 8.5 | 750 | side | 0.05 | 0.70 |
| 反手侧拧 | 8.0 | 700 | side | 0.05 | 0.70 |
| 反手挑打 | 8.0 | 180 | none | 0.02 | 0.60 |
| 反手侧喇 | 7.5 | 520 | side | 0.02 | 0.50 |
| 反手抹 | 6.5 | 430 | side | 0.02 | 0.40 |
| 反手反拉 | 10.5 | 850 | top | 0.04 | 0.65 |
| 扣杀高球 | 15.0 | 250 | none | 0.08 | 1.00 |
| 摆短 | 3.2 | 500 | back | 0.01 | 0.30 |
| 劈长 | 6.5 | 600 | back | 0.01 | 0.35 |
| 晃搓 | 4.5 | 480 | back | 0.01 | 0.30 |
| 兜球 | 5.5 | 400 | side | 0.02 | 0.40 |
| 翻挑 | 7.5 | 200 | none | 0.01 | 0.50 |
| 晃撇 | 6.5 | 430 | side | 0.01 | 0.40 |
| 削球 | 5.5 | 650 | back | 0.03 | 0.30 |
| 侧切 | 5.5 | 500 | back | 0.03 | 0.35 |
| 吸短 | 3.0 | 300 | back | 0.02 | 0.20 |
| 放高球 | 5.5 | 450 | top | 0.03 | 0.20 |
| 防守(奠基) | 7.5 | 120 | none | 0.015 | 0.25 |
| 快带 | 9.0 | 600 | top | 0.02 | 0.50 |
| 防回头(自动) | 9.0 | 260 | none | 0.015 | 0.50 |
| 直拍推挡 | 8.0 | 100 | none | 0.015 | 0.40 |
| 直拍横打 | 9.5 | 220 | top | 0.04 | 0.60 |
旋转轴混合(OMEGA_MIX):反手拧拉(上旋+侧0.5)、撕(0.6)、侧喇(侧1.0)、撇拉(0.7)、正/反手抹、晃撇(纯侧)、兜球(纯侧)、晃搓/劈长/削球(下旋+侧0.3)。y 分量随出球方向翻转。
4.1 发球类型(match.gd SERVE_TYPES,10 类)
| 类型 | 旋转轴 | 基础转速 | 球速档 | 风险(失误率加) |
| 下旋 | -Y | 550 | 0.90 | 0 |
| 上旋 | +Y | 400 | 1.10 | 0 |
| 奔球 | +Y | 400 | 1.30 | 0.02 |
| 左侧上旋 | +Y+Z(归一) | 480 | 1.00 | 0.01 |
| 左侧下旋 | -Y+Z | 480 | 0.95 | 0.01 |
| 右侧上旋 | +Y-Z | 480 | 1.00 | 0.01 |
| 右侧下旋 | -Y-Z | 480 | 0.95 | 0.01 |
| 转不转 | -Y | 550 | 0.90 | 0.01 |
| 高抛 | -Y | 700 | 0.90 | 0.03 |
| 下蹲砍式 | +Y+Z | 620 | 1.05 | 0.03 |
5. 属性 → 物理映射(每条公式)
5.1 挥拍速度 swing(出球速度主体)
swing = TECHS.speed × (0.6 + 0.6×技术/100) × (0.8 + 0.4×爆发力/100) × 状态系数 sf
× 接发因素 recv_factor(=0.5+0.5×判断准确率,接发时) × 徽章 × 疲劳惩罚(1−0.25×疲劳)
× (0.8 + 0.4×risk) × 连失收力(≥2 次下网/出界 ×0.88) × 扣杀求稳(0.85+0.15×risk)
→ 接发 clamp 7.5 m/s;全局 clamp 16 m/s(扣杀/拍击/弹击 20,stroke 内与 match 内双保险)
侧切卸力:×(0.5+0.5×侧切/100);吸短减力:×(0.4+0.6×吸短/100)
状态系数 sf = 手感 feel(正态1.0±0.08,clamp[0.8,1.2]) × 压力(1−0.05×总评差/10,clamp[0.85,1.15])
× 关键分(沉着≥85→1.08;胆识≥85→1.05) × 疲劳(1.0=不乘,疲劳在 quality_penalty)
战斗有效出球速度由 _launch_ball 反推,tf 决定:快带/弹击/拍击 0.22s;常规 0.30s;高吊/放高/削球/高球 0.46s
5.2 目标旋转 ω
ω = TECHS.omega × (技术/100) × (0.8+0.4×手腕/100),clamp ≤ 900 rad/s(≈143 转/秒,现实顶级)
洗下旋:拉上旋打来球下旋时 ω.y −= 0.2×|来球ω.y|,保底 0.25×原目标(强下旋+低技术 → 弧线平,物理裁决)
出球 = 0.3×物理碰撞 + 0.7×目标(混合)
5.3 落点散布 σ(拍面误差,决定"打得多准")
σ = 0.02 + 0.28×(1 − 技术/100)² rad,clamp [0.02, 0.35]
× (1 + 0.4×来球旋转强度) × (1 − 手腕/100×0.25) × 徽章(err_mult)
× 机会球 0.7(来球质量<0.25)
→ 目标落点 = 区域中心 ± 散布:纵深 ×3.2 米,横向 ×3.2×1.4
参考:技术 90 → σ≈0.023(±7cm);61 → 0.063(±19cm);30 → 0.157(±47cm)
安全阈值:σ_min 0.02 rad = 现实高手落点精度极限(±6cm/3m)
5.4 主动失误率 unforced_prob(非受迫,上限 70%)
p = 技术基础失误率 base_mistake × (1 − 技术/100)^1.5 × 心理 × 体能 × 冒险
+ 绝对属性差距项 gap_miss_rate(对手总评 − 自己总评)
心理 mental = 1 + (1 − 沉着/100)×0.3;体能 fatigue = 1+疲劳度;冒险 risk_mult = 0.6+0.8×risk
特例:扣杀 = 0.08×…^1.5 × (0.3+1−沉着/100);放高球 = 0.03×…^1.5 × (0.3+1−核心腰腹/100)
clamp [0.003(下限,现实记录), 0.70(全局上限,平衡机制)]
【属性差距分段系数】自己绝对 ≥61:0.85%/分;50-60:1.0%/分;40-50:1.25%/分;0-40:1.5%/分
例:61 打 62 → +0.85%;61 打 60 → −0.85%(打强加、打弱减)
5.5 质量系数 Q(回球质量,机会球/受迫判定)
Q = (0.35+0.65×技术/100) × (0.35+0.65×爆发力/100) × (0.35+0.65×手腕/100) × 手感 × rand(0.9~1.1)
参考:老瓦 91 → ≈0.79;青训 61 → ≈0.57;2200 54.8 → ≈0.50;新手 20 → ≈0.28
用途:①下一拍 incoming_q(受迫压制 −0.5×max(Q−0.30,0):Q<0.30 的机会球零受迫,强球按超出段压制 → 发球/回球质量正传导)
②机会球识别(来球 Q<0.45 → 抢攻:软球=机会球,接发同样直接起板) ③失误分类(≥0.45 受迫)
5.6 接发属性(发球威胁完整传导)
发球威胁 threat = 隐蔽性×0.50 + 发球旋转×0.30 + 发球变化×0.20(判断"看不出来"是主项)
判断准确率 judge = 接发球判断/100 × (1 − threat×0.5) × rand(0.9~1.1)
吃发球(直接接飞)率 = 0.30 × (1−judge) × (0.35+0.75×threat) × (1−接发技术/100) × 心理(1+(1−沉着)×0.5)
→ 作者(29判断)接木鱼(52/52/54):≈12%/分;木鱼(53)接作者(33/22/20):≈5%/分
冒高率 popup = (1−技术/100)×(1−judge)×发球旋转系数
→ 冒高 = 吃发球的主要形态:回球质量×0.45(菜球),上台概率再 −0.20,被对手直接冲
接发回球质量:QQ × (1 − 0.5×max(发球质量−0.30, 0))(发球越凶,接发回球越软)
回球软 factor = 0.5 + 0.5×judge(进 swing);接发上台惩罚 = (0.5−(2×factor−1)) × (0.20+0.45×发球质量)
接发首拍反应窗口:−隐蔽性×0.5×0.5m(看不出→判断滞后→够球窗口缩短)
5.6b 目标落点反推(修正说明)
落点 = 双方半台:先将 zone.x(已含方向符号)折算为"远离中线距离",clamp[0.35,1.30] 后乘回方向
—— 防止旧写法把负侧落点全部钳成 0.35(进攻方球全扎网前短球,物理必下网)
反推初速:弹道满足过网约束(上旋下坠/下旋上浮,有效重力 g_eff=G±a_mg,由 ω×v̂ 真实方向判定)且不低于过网最低 vz;
迭代 5 次 RK4 校准至目标落点(误差 <0.04m),误差按飞行方向取符号(未达目标→提高 vz,过头→降低)
5.7 防守相关
防守成功率 = 0.6 + 0.4×防守/100;防守质量 = 0.7 + 0.4×防守/100
防回头(自动):对手上一拍含"爆冲"且 防回头≥30 → 概率 0.15+0.45×防回头/100 触发(回空当,不属主动技术)
E-R-L:E = 技术×1.0×1.0×1.0;R = 对手防守 × 站位罚 × 反应系数
站位罚 = (1−0.2×球距/2.5) × (0.9+0.2×移动精度/100),clamp[0.7,1.1]
反应系数 = 0.9+0.2×启动/100;escore = E−R+rand(−15,15):>10 → swing×1.06;<0 → p_on×0.94
6. 比赛引擎(match.gd)
6.1 发球(独立模型)
成功率:serve_miss = 0.12×(1−发球旋转/100)^1.5 × (1−发球隐蔽性/100×0.4)
+ 属性差距×0.5 + 类型风险;× (1+疲劳×0.5);clamp[0.003,0.70];roll 失败 = 发球失误(2 次=双误)
出球速度 = 5.5基础 × (0.8+0.4×爆发力/100) × 类型球速档 × sf,最低 5.2(物理无法过网的下限)
落点精度 err = (1−place_acc)×0.05 + (1−隐蔽性/100)×0.02
place_acc = (移动精度×0.5 + 发球变化×0.5)/100
转速 = 类型基础 × (发球旋转/100) × (0.7+0.3×变化/100) × rand(0.9~1.1);转不转 50% 概率 ×0.12
落点:玩家点选任意(x∈[0.15,1.30], y∈[−0.68,0.68]);AI 用战术(深度 0.4-1.3 × 弱侧 y)
发球质量(对手接发难度)_last_opp_q = 发球旋转×0.7 + 隐蔽性×0.3
发球后落点判定:深度(近网<0.35 / 半出台<0.95 / 底线) × 侧(反手<−0.25 / 正手>0.25 / 中路)
6.2 回合主循环(每帧 dt=0.0005s)
1. RK4 步进球
2. 站位:横向跟随 ms = 2+4×启动/100×(1−0.3×疲劳);纵向退台:球速>8 → 退台,退速 1.5+2.5×启动/100
3. 判定顺序:网(|x|<0.02 且 z<网上沿)→ 台(首跳/二跳)→ 未触台落地面(擦边 _last_erl>10 或出界)
→ 触台后落地(未接住)→ 越底线(未触台=击球方出界;已触台=按可达性判漏球)→ 够球窗口
4. 够球窗口:bounced 且 球在接球方半台 >−0.05 且 t_since≥反应延迟 且 (vel.z<0.5 或 z>1.0) 且 z∈(0.45,1.5)
反应延迟 = (0.05+0.15×(1−启动/100)) × (1+0.4×疲劳)
5. 够球判定:dist ≤ 0.8 + ms×t_since 且 roll < reach_p
来球难度 diff = 速度分0.3 + 旋转分0.3 + 落点分0.4(速度/20、旋转/900、y偏差/0.7625,各归一×100)
步法分 = 启动0.3 + 移动精度0.5 + 还原0.2,× (1−0.35×疲劳)
reach_p = 1/(1+e^(−(步法分−diff+100)/80))(偏移100、坡度80:整体高、属性差温和)
6. 击球(目标导向,见 §7)→ 交换 striker/receiver,bounced=false,t_since=0
7. 相持上限 40 拍 → E-R-L 兜底(±15 掷骰)
每分硬上限 40 拍;发球轮:每 2 分交换,10 平后每分交换;双误规则
6.3 得分/失误分类
kind:unforced(非受迫,来球质量<0.45)/ forced(受迫,≥0.45)/ forced_opp(接方触球仍丢)/ winner(未触球制胜)
一发失误:对手得分;双误:两次发球失败 → 对手得分
统计 stats:points/points_lost/winners/unforced/forced/serve_won/serve_total/receive_won/
rally_pts(≥5拍)/clutch_pts(10平后得分)/quality_sum/shots
发球轮换:swap 每分+1,swap%2==0 或 deuce 时换发
6.4 赛后评分(0-10)
base = 6 + (得分差)×0.2 + 制胜×0.05 − 非受迫×0.1 − 受迫×0.03
+ (发球得分率−0.5)×4 + (接发得分率−0.5)×4 + 相持得分×0.02 + 关键分×0.1
最终 = base × (1 + (对手总评−80)/200),clamp[0,10]
评语:≥8.5 统治级 / ≥7.5 出色 / ≥6.5 中规中矩 / ≥5.5 状态平平 / 低迷
7. 目标导向击球(每板两步,用户批准模型)
7.1 ① 判定阶段(属性驱动)
目标落点区域:depth = 0.55+0.35×(0.5+0.5×risk)(安全区,不贴底线)
控制型技术(摆短/侧切/吸短/晃搓/兜球/正反手抹/晃撇/翻挑/劈长):depth = 0.22+0.35×技术/100
y(横向):战术 target_zone(backhand −0.35 / forehand +0.35 / middle 0 / move 随机 ±0.35 / 其余 ±(−0.2~0.2))
进攻技术默认大角 ±0.3
散布 σ(§5.3)→ 目标点 = 区域 ± σ(纵 ×3.2m、横 ×3.2×1.4),clamp x∈[0.35,1.30] y∈[−0.62,0.62]
上台概率 p_on = 0.85 + 0.15×(技术/100) − 0.25×来球质量 − unforced_prob
接发 ×(0.75+0.25×recv_factor);E-R-L 被压制 ×0.94;clamp [0.30, 0.997]
roll 失败 → 下网/出界(50/50),回合结束(kind 按 _error_kind)
7.2 ② 物理生成(反推 + RK4 裁决)
飞行时间 tf:快带/弹击/拍击 0.22s;常规 0.30s;高吊/放高/削球/高球 0.46s
水平速度 vh = min(水平距离/tf, swing×0.95 且 ≥3.5);竖直 vz = (台高−起点z+½g·tf²)/tf
过网约束:跨网时 vz ≥ (网上沿+球半径+0.012 − 起点z + ½·g_eff·t_net²)/t_net
g_eff = 9.81 ± 0.0558×(vh²+vz²)(上旋下压/下旋上浮)
迭代:最多 3 次 RK4 短模拟(_sim_land)修正 vz(×0.45),残差 < 5cm 停止;vz 不低于过网约束
出球 ω = 目标旋转(§5.2,含洗下旋)
物理裁决:球飞出拍后由主循环 RK4/碰撞判定出界/下网/漏球(不保证上台,失误概率已由 p_on 定)
校准点:① p_on 线性项(0.85+0.15t)—— 决定"同级失误率";② gap_miss_rate 系数 —— 跨级别压制坡度;
③ 受迫 0.25×Q —— 对手高质量回球的压制强度;④ reach 偏移 100/坡度 80 —— 够不到的比例;
⑤ tf 与 swing cap —— 球速手感。5 个旋钮即"每 1 分差距"敏感度的全部来源。
8. 思维链 AI(brain.gd)
8.1 战略层(局间 setup_strategy)
风格 → 主基调:intent = attack(进攻/快攻/弧圈)/ defend(防守反击/削球)/ control(台内/变化)
总评差 → 进攻比例:>15 → 0.7;<−10 → 0.3;否则 0.5;碾压局(差>25)→ 0.55 + 风险基线×0.55(求稳)
战术大师(算球≥90 且 变化≥90):target_zone=move、进攻比例≥0.6、发球多变≥0.9(老瓦式)
对手弱点 → 压制区域:对手正手攻 < 反手攻−5 → 压正手;反之压反手;否则 mixed
比分 → 风险基线:落后≥2 分 → 0.7;领先≥2 分 → 0.35;否则 0.5;× (0.7+0.6×胆识/100),clamp[0.1,0.9]
发球多变 = 发球变化/100;快攻型+启动≥80 → pace=fast
8.2 心理状态(每分 update_after_point)
信心:得 +0.05 / 失 −0.08
疲劳 = 0.012 × (1.5 − 耐力/100)/分(耐力越低累越快),惩罚:失误率 ×(1+疲劳)、质量 ×(1−0.25×疲劳)
士气波动 volatility = 0.08 × (1−沉着/100×0.6) × (1−稳定性/100×0.5)
得 +v×0.7;主动失误 −v×2.2(波动最大);被压失分 −v×1.0;连得3分且士气<0.6 → +v×0.8
士气效果:风险 ×(0.35+0.65×士气);士气<0.3 → 失误率再 ×1.15
8.3 战术层
回合意图:连失≥2 且信心<0.5 → control;热手(连得3)且 attack 基调 → attack;
attack 基调按攻击比例掷骰;defend 基调 70% defend;control 基调变化≥80 时 30% 偶发抢攻
risk_adjust = 基线 + 比分(落后3分 +0.2 / 领先4分 −0.15) + 热手+0.1 / 连失−0.1
+ 关键分(沉着≥85 −0.1 / 胆识≥85 +0.1),clamp[0.05,0.95]
发球战术:对手接发判断<60 → 50% 多变(侧旋/下旋);否则按发球多变率随机[下旋/侧旋/上旋];
落点 = target_zone 弱侧 y(±0.35);深度 0.4-0.7(短)/0.9-1.3(长) 各 50%
8.4 执行层技术决策
score = (技术/100)×aggr − 基础失误率×0.6 + 博弈预测×0.6
博弈 = 我方质量Q→对手失误概率(Q − 对手防守启动×0.55 + 0.35, clamp[0.05,0.85]) − 自己失误概率
AI 选择:70% 最优(±0.04 抖动),30% 按属性加权随机
9. 可用技术矩阵(玩家/AI 均可选池)
| 来球条件 | 可用技术(奠基技术不出现) |
| 高球 z>1.25 且 距网<1.5 | 扣杀高球、正手侧身爆冲 |
| 快而刁(速度>13 或 落点>1.25) | 快带、侧切、吸短、放高球、削球 |
| 台内短球(<0.55)下旋 | 摆短、劈长、反手拧拉、正手挑打、正手晃撇、晃搓、翻挑、兜球、正手抹、反手抹 |
| 台内短球 上/不转 | 正手挑打、反手弹击、反手拧拉、翻挑、兜球、正手晃撇 |
| 出台长球(>1.2)下旋 | 正手拉前冲、拉高吊、反手拉前冲、拉高吊、劈长、削球、侧切 |
| 出台长球 上旋 | 正手快带、正手反拉、反手反拉、反手撕、快带、侧切 |
| 出台长球 侧/不转 | 正手拉前冲、反手拉前冲、正手快带、反手撕、撇拉、正手晃撇 |
| 半出台 下旋 | 拉前冲/高吊(正反)、劈长、正手挑打、反手拧拉 |
| 半出台 上旋 | 快带/反拉(正反)、反手撕、拉前冲(正反) |
| 半出台 侧旋 | 正手快带、快带、撇拉、正手晃撇、反拉(正反)、拉前冲 |
| 半出台 不转 | 拉前冲、反手拉前冲、快带、撕、反拉、撇拉、晃撇 |
阶段过滤:≤3 板(前三板)收窄为发球抢攻池:摆短/劈长/正手挑打/反手拧拉/拉前冲/拉高吊(正反)/侧身爆冲/正手快带/撇拉/正手晃撇/反手撕/反手弹击;算球或变化 ≥90 的非常规强手破例开放全池。>3 板(相持)全池。属性 <30 的技术不出现在池中。
10. 徽章(badges.gd,12 枚)
| 徽章 | 稀有度 | 触发 | 效果 |
| 霸王拧 | 金 | 拧拉,接发/台内 | 30%:旋转+30%/球速+25%;8% 直接得分 |
| 正手杀板 | 金 | 侧身爆冲/拉前冲,相持/接发 | 25%:球速+20%/旋转+15% |
| 前三板大师 | 银 | 接发 | 全技术 +20% |
| 铁壁 | 金 | 防守/放高/快带/防回头,相持 | 25%:失误率−50%/防守+10% |
| 大心脏 | 金 | 关键分(10 平后) | 沉着/胆识+20%、失误−30% |
| 发球机器 | 金 | 发球 | 发球旋转+20%/隐蔽+15% |
| 飞毛腿 | 银 | 相持/接发 | 启动速度+10% |
| 绝地反击 | 银 | 大比分落后(局差≥1 且本局差≥4) | 全技术+10%、失误−15% |
| 冷静大师 | 铜 | 连失 2 分后 | 下一板失误−20% |
| 吸短大师 | 银 | 吸短 | 吸短+15% |
| 削球铁闸 | 银 | 削球/侧切 | 下旋+15% |
| 游击队长(老瓦) | 金 | 相持/接发 | 拍面误差−30%(落点控制/变线) |
| 防守大师(老瓦) | 金 | 防守类技术 | 防守属性+20% |
| 魔术师(老瓦) | 金 | 前三板(本分 ≤3 拍) | 全属性+30%(发力/转速) |
开局赠送:进攻→正手杀板;快攻→飞毛腿;弧圈→铁壁;台内→吸短大师;防守反击→冷静大师;削球→削球铁闸;变化→前三板大师;所有开局+大心脏。
11. 生涯/赛事(career.gd / tournament.gd / rating.gd)
训练成长/日 = 0.2(心理类0.25) × 侧重(重点3/一般0.5/其他0.1) × 年龄(≤19:1.2 / ≤24:1.0 / ≤29:0.8 / 30+:0.5)
× 潜力(0.4+0.2×星级) × 瓶颈(当前/100:<70 全速;70-85 0.6;85-95 0.25;≥95 0.05)
× 体能(1.0/0.85/0.6/0.3) × 多样(1.05/0.9/0.7) × 随机
比赛消耗:state −0.15;休息:state +0.1×天数;受伤:倾向/100×5% 每场,form×0.85
WTT 六层:支线(排名0+,积分250,对手300-500)→ 常规挑战(300+,400,150-300)→ 球星(150+,600,50-150)
→ 冠军赛(50+,1000,20-50)→ 大满贯(20+,2000,4-20)→ 总决赛(16+,1500,1-8)
世界排名与开球网完全分离(专业 vs 业余两套);国内邀请赛对手显示开球网(业余)
12. 平衡实测参考(当前默认参数)
| 对阵 | 结果(10 场/组) | 说明 |
| 老瓦(90.3) vs 青训(60) | 85% 分、20:0 场次 | 总评差 30(+三金徽章)碾压 |
| 老瓦 vs 2200 业余(54.8) | 84%、20:0 | — |
| 老瓦 vs 王楚钦(90)/樊/张(93)/马龙(95.5) | 78-79%(徽章加成≈97 级) | 其他传奇未配徽章,配卡后自然平衡 |
| 青训(60) vs 2200(54.8) | 71%(差距 ±5.2×1%) | 跨级别压制(用户口径 6:4 为旧模型) |
| 总评差 1 分 | ≈ 胜率+1.5~2 分点 | 由 gap_miss/受迫/reach 共同合成 |
平衡旋钮(按灵敏度):① gap_miss_rate 系数 ② p_on 受迫 0.25 ③ unforced_prob 指数 1.5 ④ reach 偏移 100/坡度 80 ⑤ swing cap / tf。改任一后必跑 6:4 与传奇两套基准测试。
13. 测试套件
| 套件 | 覆盖 | 检查数 |
| run_tests | 物理内核(飞行/碰撞/回跳)37 项解析对照 | 37 |
| run_match_tests | 总评/失误率/计分/整场/质量 vs 30 总评 | 52 |
| run_rating_test | 开球网/业余/专业映射 + CAP_TABLE + ELO | 19 |
| run_state_test | form/器材/奠基修正/隐藏属性 | 26 |
| run_career_test | 训练成长/赛季/徽章 | 19 |
| run_interactive_test | 回合制挂起/注入恢复 | 3 |
| run_ui_test | UI 流程(创建→训练→比赛) | 8 |
| run_scale_test | 双标尺四段换算 | 22 |
| run_tour_test | WTT 层级/排名/邀请赛 | 17 |
运行:godot --headless --path . --script res://tests/run_XXX.gd。改参数后全量回归共 203 项。
14. 常用公式速查(按属性)
| 属性 | 作用点(公式位置) | +1 分的典型效果 |
| 单项技术 t | swing(5.1)/转速(5.2)/σ(5.3)/失误(5.4)/Q(5.5) | 球速+0.6%、转速+1%、σ−1.5%、失误−(相对3~10%) |
| 爆发力 | swing f2 = 0.8+0.4t/100 | 球速+0.4% |
| 手腕柔韧性 | 转速 f2;σ ×(1−t/100×0.25) | 转速+0.4%、σ−0.25% |
| 启动速度 | ms=2+4t/100;get 反应延迟(6.2);步法分×0.3 | 移速+0.04m/s、反应−0.0015s |
| 移动精度 | 步法分×0.5(最大项);发球落点精度 | 够球率约+1.5 分点 |
| 还原节奏 | 步法分×0.2 | 够球率约+0.6 分点 |
| 耐力 | 疲劳累积 0.012×(1.5−t/100) | 疲劳满场时间延后约+1.3%/分 |
| 沉着 | mental(5.4);clutch≥85→1.08;士气波动;risk 关键分 | 失误−(相对)0.3~0.5%;情绪波动−0.6% |
| 胆识 | risk_base×(0.7+0.6t/100);clutch≥85→+0.1 risk | 发力+约0.15%、失误+约0.4%(搏杀倾向) |
| 算球能力 | 博弈预测精度(score/expect_advantage);前三板破例(≥90) | 决策质量(间接) |
| 变化 | serve_variety=t/100;rotate 强度(0.7+0.3t/100);≥90 破例+战术大师 | 发球多变+1%;旋转+0.3% |
| 发球旋转 | 发球转速(4.1);失误(6.1);质量系数×0.7 | 发球转速+1%;双误率−0.15 分点 |
| 发球隐蔽性 | 对手 judge ×(1−t/100×0.5);发球失误;质量×0.3 | 对手判断−0.5% |
| 发球变化 | 旋转强度 0.7+0.3t/100;落点精度×0.5 | 旋转+0.3%;落点误差−0.5% |
| 接发球判断 | judge = t/100×(1−隐蔽×0.5)×rand;接发失误;回球软系数 | 判断+1%(被隐蔽打折) |
| 防守 | 防守成功率/质量;E-R-L 的 R;奠基(防守类×0.85+防守×0.15) | 防守成功率+0.4%/分 |
| 核心腰腹 | 放高球失误项(0.3+1−t/100);横拍+2 | 放高失误−(相对)0.5% |