训练价值网络做五子棋教练:把大局观变成可计算的胜率
2026/9/13 14:57:47 网站建设 项目流程

这个系列第二篇来了。上一篇我们折腾的是让AI自己学会玩一个游戏,走到哪一步、赢没赢,全靠它自己摸索。这一篇我不打算教AI“会玩”了,我想训练一个神经网络模型,让它回头去教小孩玩——它不上场下棋,只在旁边看着,等孩子落子之后给出一个“全局维度的评价”:这一手看着赚了,实际是往哪个方向亏了,还有哪些位置比这里更急。

说白了,这是一次把“大局观”从玄学变成可量化数字的尝试。模型不负责替小孩赢棋,它负责在每次落子后做一个冷静的“教练点评”:胜率掉了多少、哪个方向更值得走、哪些局部冲突被忽略了。我拿五子棋做的原型,训练过程全部在本地完成,没有用现成的在线服务,模型权重也就几MB,普通笔记本跑得很轻松。这篇文章我会把完整思路、数据怎么造、模型怎么设计、有哪些坑,通通写出来。

1. “会玩的模型”和“会教的模型”,差别到底在哪

1.1 从自弈玩家到旁观教练:任务定义变了

一说到“用神经网络玩游戏”,大家第一反应都是那种自己会下棋、能赢人的AI。这类AI的核心任务是决策:给定当前局面,输出下一步走哪里。围棋上有AlphaGo,象棋上有各种引擎,它们本质上都是“策略网络+价值网络”的组合。策略网络负责生成候选落子,价值网络负责评估局面好坏,最后配合蒙特卡洛树搜索(MCTS)找出最强应对。

但如果目标是当教练,任务定义就完全变了。我不需要模型替我下棋,我需要它回答两个问题:第一,孩子走的这一手,对全局胜负而言到底是加分还是减分;第二,当前盘面上,还有哪些点比孩子下的位置更“急迫”。前者是“单步评价”,后者是“选点推荐”,这跟“自己下出强手”是两码事。

我在实践里发现,最适合当教练的不是策略网络,而是价值网络。策略网络输出的是“每个落子位置的概率”,它只告诉你“AI认为该走哪”,却不告诉你“这一步到底价值多大”。价值网络输出的是一个连续数值,通常是胜率估计,天然适合做“逐手打分”:把某一步落子后的新局面送给价值网络,得到新胜率,再减去落子前的胜率,差值就是这一步对大局的真实贡献。

所以这个项目里的模型训练目标,并不是“下一步怎么走”,而是“这个局面到底谁优势、优势多少”。教练功能是在模型训练好之后,用“胜率差值”这个后处理步骤实现的。

1.2 “大局观”这个玄乎的词,怎么变成模型的损失函数

很多家长会跟孩子说“你下棋没有大局观”。孩子听完基本是懵的,因为他们不知道什么叫“有大局观”,也看不到自己哪一手丢了“大局观”。我的做法是把大局观翻译成一串数字。

定义局面价值函数V(S),它表示在局面S下,“我方”的预期胜率。孩子下了落子a之后,局面从S_t变成S_{t+1},那么这一步的价值变化就是:

ΔV = V(S_{t+1}) - V(S_t)

如果ΔV是正的,说明这手棋让局面变得对自己有利;如果ΔV是负的,说明虽然局部可能占了一点便宜,但从全局看是在吃亏。所谓的“贪小便宜吃大亏”,反映到数字上就是:局部吃了一个子,但V从0.58降到了0.44,掉了14个百分点。

这里有一个人容易绕晕的细节:如果价值网络定义的是“当前行动方胜率”,那么孩子落子后轮到对手行动,S_{t+1}的V不能直接和S_t的V比较,因为视角变了。我的处理办法是,网络始终预测“记录方(我方/孩子方)”的胜率,输入张量里用一个额外通道标明当前轮到谁落子。这样不管轮到哪一方,V都在同一个坐标系里,ΔV才能直接相减。

所以“大局观”本质上是价值函数对不同局部特征的敏感程度。一个训练良好的价值网络,必须学会判断“哪块棋更急”“哪边的潜在损失更大”“哪些先手便宜现在不占以后就没机会了”。这些棋理没有一个被我们写进规则里,全是模型从数据里自己学出来的,这就是神经网络做教练最有意思的地方。

1.3 为什么这种教练任务不能直接套一个大语言模型

你可能会有疑问:现在大语言模型这么强,为什么不直接把棋盘状态描述成文字,让大模型来当教练?我在动手之前还真试过这条路,结论是现阶段不太靠谱,原因有三个。

第一,棋盘状态用文字描述会产生严重的语义丢失。15×15的棋盘点位、黑白分布、最近几手落子,转成长文本后信息密度太低,模型很难从一串坐标里感受到“右边的白棋还有一口气、左边的黑棋马上要成龙”这种空间关系。

第二,大模型给不了稳定的数值反馈。教练需要的是经过标定的胜率估计,我宁可面对一个卷积神经网络输出的0.532,也不想知道大模型“感觉”这步棋“还可以”。没有精准的量化,复盘就落不到实处。

第三,可解释性差。卷积神经网络的输出可以配合梯度热力图,直接可视化“模型认为当前哪个区域最影响胜率”,这是实打实的大局观展示。大模型通常只能给一段模棱两可的话,价值网络的大局观是看得见摸得着的。

所以我选择了轻量卷积神经网络方案。它不需要海量显存,不需要在线API,训练完还能导出成ONNX跑到普通CPU上,对孩子来说也足够直观。

2. 没有现成“教练棋谱”,数据就用自对弈造出来

2.1 自对弈生成带全局结果的对局

严格来说,市面上没有“教练棋谱”这种数据集——没有人会系统地标注“这步棋让胜率掉了多少”。想训练价值网络,最直接的办法是自对弈:让AI自己跟自己下很多局,每局结束以后我们只知道最终胜负,但可以把过程中每一个局面都保存下来,用终局结果作为这个局面的标签。

听起来简单,但怎么自对弈很讲究。如果用两个随机策略AI互下,生成的数据噪声太大,价值网络学出来的基本都是“谁先手谁赢”这种粗浅规律。如果直接上最强的开源棋类引擎自对弈,生成的棋局水平太高,又跟小孩的真实水平脱节。

我的做法是构造两个“有性格”的AI。一方模拟小孩,我叫它“小孩AI”,策略是70%的随机落子加30%的局部贪心——局部贪心就是哪里能吃子就走哪,这跟很多小孩下棋时“哪里有子吃就下哪里”的行为很像。另一方是“稳健AI”,策略是50%的局部贪心加若干步简单的威胁搜索。我们只记录“小孩AI”视角的胜负,最后这个模型学会的就是“在稳健全局策略下,当前局面对小孩方有多有利”。

我跑了8万局自对弈,每局大概30到80手不等,总共积攒了约400万个局面样本。每个样本包含棋盘状态、轮到谁走、以及终局结果z∈{+1,-1}。如果“小孩AI”最终赢了,整局所有的局面标签都是+1;输了就是-1。数据量听起来很大,但去重后再做旋转镜像增强,真正有效的独立局面大约在100万级别,训练一个小价值网络完全够用。

2.2 从终局胜负到每一步的指导信号

用终局胜负当局面标签,乍一看非常粗糙:第5手的局面和第50手的局面都用同一个+1标注,模型能学出东西吗?答案是能,这正是价值网络的核心训练方法。

模型的任务是在给定局面下预测“这局最终谁赢”。为了把数百万个局面和最终胜负对应起来,模型被迫学习大量中间规律,比如“某个方向已经形成双三,等于胜利在望”“某块棋被包围且没有做眼空间,等于慢性死亡”。这些规律不是任何代码写死的,而是从数据中涌现出来的隐式棋理,也就是我们说的“大局感”。

模型训练好之后,我再把终局胜负标签“翻译”成单步指导信号。对于每一步落子a,我计算ΔV = V(S_{t+1}) - V(S_t),这个差值就是这一手的“大局评分”。我发现一个很有用的规律:在中盘阶段,好的棋手之间对弈时,ΔV的绝对值一般不大,谁先走出一个明显的掉胜率招法,谁就开始慢性落后。教练模型要盯的就是这些“掉点招”。

如果你想让每步的标签更平滑,还有一个进阶做法是使用时间差分(TD)方法,用“本步的即时收益+后续局面的折现值”作为标签,而不是用最终胜负。但对于我们这种教练场景,直接用最终结果训练出来的价值网络已经足够了,没必要过度设计。

2.3 数据增强与噪音控制:别让模型把对手的毛病学进去

自对弈造数据最大的风险是:模型不光学到了局面的客观好坏,还把自对弈AI的毛病也学进去了。

我踩到的第一个坑就是“对手太弱导致一切看起来都能赢”。当我用“小孩AI vs 随机AI”对弈时,模型很快学会了一个错误的规律:只要随便围住一片空,胜率就接近100%。因为随机AI根本不会反击。后来我把对手固定为有一定威胁搜索能力的“稳健AI”,数据可靠性一下子提高了。

第二个坑是视角混乱。黑白双方在五子棋里是完全对称的,但从某一方视角看,棋局完全不同。我在生成数据时坚持“记录方视角”:始终把“小孩AI”方的棋子放第一个通道,把对手棋子放第二个通道,标签z也始终是“小孩AI”的胜负。这样训练时不需要把每个样本做黑白翻转,模型学到的是“无论我是黑还是白,我该怎么评估”。

数据增强方面,旋转和镜像对五子棋来说都是合法变换,一张棋盘能扩出8个方向,直接提升样本多样性。另外我建议剔除开局前3手和终局前3手附近的数据。开局前几手谁胜率有明显先后手差异,价值网络容易记住“轮到我下就优势”这种低质量特征;终局前几手标签充满“一步杀”的极端信息,会让模型的输出过于尖锐。去掉这些区间之后,训练出来的价值网络更平滑,更适合当中盘教练。

3. 模型设计:给神经网络装一只“大局眼”

3.1 棋盘状态怎么编码成张量

价值网络的输入是棋盘状态,必须编码成张量。以五子棋15×15棋盘为例,我用6个通道:

通道内容
1我方棋子位置(0/1矩阵)
2对方棋子位置(0/1矩阵)
3最近一手落子位置
4最近第二手落子位置
5当前是否轮到我方落子(全1或全0)
6常值1通道,提供位置偏置

通道1和通道2是核心,把黑白分布完整送给模型。通道3和通道4提供“时序感”,让模型知道棋局是刚刚开始还是已经进入中盘,也帮它理解“刚下的这一手改变了什么”。通道5是关键设计,因为我们的价值网络始终预测“我方胜率”,必须告诉模型“现在该谁走”。常值通道等于给网络一个可学习的坐标偏置,在很多棋盘游戏里都能稳定提升效果。

整个张量形状是(6, 15, 15),对网络来说非常轻量。不需要额外写规则,不需要标注“哪块棋有气、哪块棋是活三”,这些特征全部由卷积网络自己从原始棋盘中提取。

3.2 小残差网络加价值头,规模不大但够用

模型结构我没有搞得很复杂,就是一个带价值头的残差网络。给一小段核心代码:

import torch import torch.nn as nn class ResBlock(nn.Module): def __init__(self, channels): super().__init__() self.conv1 = nn.Conv2d(channels, channels, 3, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(channels) self.conv2 = nn.Conv2d(channels, channels, 3, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(channels) self.act = nn.ReLU(inplace=True) def forward(self, x): out = self.act(self.bn1(self.conv1(x))) out = self.bn2(self.conv2(out)) return self.act(x + out) class ValueNet(nn.Module): def __init__(self, channels=64, blocks=4): super().__init__() self.head = nn.Sequential( nn.Conv2d(6, channels, 3, padding=1, bias=False), nn.BatchNorm2d(channels), nn.ReLU(inplace=True), ) self.blocks = nn.Sequential(*[ResBlock(channels) for _ in range(blocks)]) self.pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channels, 32), nn.ReLU(inplace=True), nn.Linear(32, 1), nn.Tanh(), ) def forward(self, x): x = self.head(x) x = self.blocks(x) x = self.pool(x).flatten(1) return self.fc(x)

我最终的配置是64通道、4个ResBlock,参数量在70万左右。这个规模对“评估局面胜率”这个任务来说绰绰有余。AlphaZero那种几百层的大网络是为了从零训练出超越人类的棋力,我们只需要一个判断力的“鉴赏家”,深度太深反而容易在几百万样本上过拟合。

这里再补充一个观点:残差连接对价值网络特别重要。因为价值网络的训练目标只有一个数值,信息必须从底层棋盘特征一直传到输出层,中间不能有明显的信息衰减。残差块让梯度和特征都能顺畅流动,这是我对比过“普通卷积堆叠”和“残差结构”之后的结论,同样是4层网络,残差结构在验证集上的校准误差低了大约30%。

3.3 损失函数、优化器与真正的“大局观”来源

价值网络的输出层我用了tanh,把输出压到-1到1之间,对应终端标签z∈{+1,-1}。损失函数用最简单的均方误差:

loss = mean((v - z)^2)

实践中我发现MSE比交叉熵在五子棋上更稳,因为标签z不是0/1二分类,而是“胜平负”式的连续语义,MSE的梯度更平缓,不容易出现早期震荡。

优化器我选了Adam,初始学习率1e-3,配合权重衰减1e-4。Batch size取256,跑30个epoch。训练时按局文件切分训练集和验证集,比例9:1,这一点很关键——千万不能按局面随机切分,否则同一局的内容同时存在于训练集和验证集,验证指标会虚高,模型真正拿到新对局上就露馅。

那“大局观”到底从哪里来?我倾向于这样理解:一个700万参数的价值网络,要记住约100万个有效局面的胜负标签,是不可能的。它只能选择压缩信息,把局面抽象成少数几个影响胜负的全局特征。在这个过程中,网络被迫学会识别“哪些局部冲突是急所”“哪些位置的子力对全局有辐射作用”。它不是记住了棋谱,而是形成了自己的“棋感”。人类小孩下棋也是类似的过程:下的局数多了,慢慢就知道不能只顾眼前,哪里更急、哪里有潜在危险,会形成一种直觉。神经网络管这个叫隐式特征学习,我们管它叫大局观。

3.4 一组直接可用的训练关键参数速查

参数我的配置说明
输入通道6双色棋子+最近两手+行动方+常值
卷积通道数64太小拟合不足,太大容易过拟合
ResBlock数量4任务简单,不需要太深
输出1,tanh我方胜率估计,范围[-1,1]
参数量约70万权重文件几MB
优化器Adamlr=1e-3,weight_decay=1e-4
Batch size256CPU训练也能承受
Epoch30按验证集loss选最优checkpoint

这套参数在普通配置的笔记本上就能训练。没有独立显卡也能跑,就是慢一些,一个epoch大概十几分钟,睡一觉起来正好。

4. 训练与调优实测记录

4.1 训练流程与超参数选择

我实际的训练流程是这样走的。先把自对弈产生的JSONL对局文件解析成样本,每一条样本是“棋盘张量+标签z”,然后按对局文件编号切分训练集和验证集。加载数据的时候,我在线做旋转镜像增强,每张棋盘随机选一个对称变换再送进网络,相当于把有效样本量扩大了8倍。

训练过程中我同时监控两个指标:验证集的MSE loss和校准曲线。单纯看loss下降是不够的,价值网络很容易出现一种假健康状态:训练loss和验证loss都在降,但预测的胜率过于极端,永远输出0.95或者-0.95。这种模型看起来“很自信”,实际在教练场景里毫无用处,因为它区分不出一手好棋和一手坏棋之间的微妙差别。

为了对抗极端输出,我做了一个非常关键的处理:标签平滑。终端标签z原本是±1,我把它改成±0.8。这样一来,模型知道胜利并不是板上钉钉,总是留了一点不确定性。效果很明显,模型的胜率估计从“两极分化”变成了“中间有过渡”,用起来舒服多了。

4.2 怎么判断模型学到的是大局,还是记住了棋谱

这是这个项目最核心的质量检验环节。我用了三种方法交叉验证。

第一种是校准曲线。把验证集中的所有局面按模型预测胜率分桶,比如预测0.1-0.2的放一桶,0.2-0.3的放一桶,以此类推,然后统计每个桶里实际的胜率。如果模型预测0.3-0.4的桶实际胜率恰好也在0.3-0.4附近,说明模型输出是可信的。我的模型在0.2-0.8这个区间表现不错,极值区间偏差稍大,这也是标签平滑的副作用,可以接受。

第二种是“单步评估测试”。我从真实对局里挑出一些有代表性的局面,人为构造“好手”和“坏手”各一手,让模型分别计算ΔV。比如某个局面下,正确的全局要点在中腹连成势力,但在右下角可以吃到一个子。模型应该给出:吃子的ΔV明显为负,连势的ΔV明显为正。如果它能稳定区分这两种走法,说明它真正理解了这个局面的急所。

第三种是大局热力图。对当前局面,我计算价值网络输出对棋盘输入每个位置的梯度,把梯度绝对值叠加成一张热力图。这张图上最亮的位置,就是模型认为“当前对胜率影响最大”的区域。我拿几个典型中盘局面做了可视化,发现热力图确实会集中在冲突激烈、尚未定型的区域,而不是平均分布在整个棋盘上。这就很像人类棋手“盯着急所看”的感觉了。

4.3 实测效果:模型给出的“一步掉胜率”是否靠谱

我用5万局数据训练了一版模型,验证集上的Brier分数大约0.16,对于胜负预测来说属于可接受范围。然后我把家里小孩真实下的几盘棋导进去做复盘。

有一盘棋让我印象很深。孩子在一个局部连续吃掉了对手两个子,他自己很得意,但模型显示每次吃子之后,胜率都在往下掉,从开局60%一路掉到42%。原因很典型:他在吃子的过程中,无论从速度还是方向上,都把主力棋子堆到了棋盘右侧,而左侧对手趁机形成了一条已经无法阻止的长连。从局部看他赚了,从全局看他输了。

模型给出的建议选点全部集中在左侧防守和反制区域,和稍微高等级的棋软给出的推荐高度吻合。这种“局部吃子但全局亏”的典型场景被模型精准捕捉到了,那一刻我知道这套“大局观教练”的思路是通的。整套模型跑一次完整对局复盘的耗时在一两秒内,已经能达到“孩子下完棋马上就能复盘”的产品级体验。

5. 把教练接到小孩的棋局中:使用形态与部署

5.1 三步走:算胜率、算落子差值、输出建议

模型训练好之后,教练功能的核心流程分为三步。

第一步,对当前局面S_t编码,让价值网络输出V(S_t),得到当前胜率。第二步,遍历当前所有合法空点,把每个空点分别落子到棋盘上得到临时局面S_{t+1},再送进价值网络算出V(S_{t+1}),计算ΔV = V(S_{t+1}) - V(S_t)。对所有空点的ΔV排序,取前三个作为推荐选点。第三步,把孩子实际下的落子也单独过一遍,计算出孩子这步棋的ΔV,和推荐选点做对比。

如果给模型加上策略头(Policy Head),还能更高效:先用策略网络把落子概率最高的前10个点筛出来,再只对这10个点做价值网络细评,全程耗时可以从几百毫秒降到几十毫秒。但我个人觉得对教练场景来说,全点评估的完整ΔV分布更有价值,因为它能被直接叠加到棋盘上,形成一张“局面价值地图”:每个空点都有一个数字,颜色从红到绿,孩子一眼就能看到哪里值得走、哪里是价值洼地。

5.2 把数字翻译成小孩听得懂的话

模型输出的是一堆胜率数字,但孩子要的是有温度的反馈。我总结了一套翻译模板,核心逻辑是:先给结果,再点原因,最后给方向。

举两个实际例子。如果孩子下了一手“局部赚但全局亏”的棋,模型计算出ΔV=-14%,我的翻译是这样的:“这一手之后,你的胜率从58%降到了44%。你刚刚在右下角吃了对方一个子,局部确实赚了,但问题的关键是左上角已经被对手抢先动手了,那里比右下要急得多。”

如果孩子下了一手中规中矩但偏缓的棋,模型发现有一个更好的急所,ΔV=+12%,我的翻译是这样:“这手棋没有明显的错,但它是在一个不紧急的位置落子。现在盘面上最急的地方在中间偏左,如果先下那里,你的胜率还能再涨12个百分点。”

这套话术不需要大语言模型生成,用模板填充就能拐出来。关键在于两点:第一,所有数字都来自模型真实的胜率差值,不胡编;第二,每次点评都要落到“哪个方向、哪片区域”,而不是只说“你下得不好”。我把这个功能做成了命令行小工具,也在Jupyter Notebook里做了简单的可视化,棋盘上每个点用颜色深浅标出ΔV高低。孩子自己就能看懂哪里是“大局热的区域”。

5.3 部署资源与提速方案

整套系统的资源需求非常亲民。训练阶段,6GB显存的显卡就能跑得很舒服,没有显卡的话纯CPU也能训练,只是慢一些。推理阶段就完全无所谓了,普通笔记本CPU单次前向大约1到3毫秒,全盘225个空点逐点跑一圈也就半秒上下。

我还把模型导出成ONNX,顺手做了int8量化,模型文件从几MB压缩到两三MB,推理速度比PyTorch原始模型快了两三倍。如果以后想移植到平板上给小孩用,这条路也已经铺好了。

有一点需要提醒:终局阶段模型对“一步杀”极度敏感,因为这种情况下胜率变化很剧烈,模型会输出“强烈推荐去杀棋”的结果。如果你希望教练聚焦在大局观训练上,可以在中前盘阶段隐藏掉直接连杀类的推荐,等局面进入终局再开启“胜负手模式”。这个设计不是技术问题,而是产品取舍问题,我的做法是默认在中盘隐藏杀棋提示,避免孩子过度关注局部攻击。

6. 踩坑记录与几个独家体会

6.1 常见问题排查速查表

现象可能原因解决办法
胜率预测总是0.05或0.95,没有中间值标签太极端,模型在背胜负标签标签平滑,把±1改成±0.8
黑白双方胜率明显不对称输入视角不统一,模型没被明确告知行动方加“当前行动方”通道,统一“我方”坐标系
模型对终局一步杀反应过度价值网络对直接胜负天然敏感中盘阶段隐藏杀棋推荐,终局开“胜负手模式”
训练集表现好,真实对局一塌糊涂自对弈AI和小孩的真实风格差异过大收集少量真实棋谱,对模型做微调
逐点评估太慢遍历全部空点做前向计算加策略头先筛Top10,再精排
模型只学“先手优势”数据里包含过多开局前几手样本剔除每局前3手的局面样本
热力图过于分散,看不出焦点网络通道数太多或过拟合减少ResBlock数量,增强数据增强

最值得说的是第二行这个“黑白胜率不对称”问题。我第一次训练出来的模型,黑棋胜率明显高于白棋,我还以为这是数据里有先手偏差。后来排查发现,是数据生成时没有统一“我方”视角定义,一部分样本里“我方”是黑,另一部分“我方”是白,但网络不知道自己该预测谁,结果学成了一个“谁黑谁赢”的坏模型。加了“当前行动方”通道后,这个问题立刻消失。这个细节如果没注意到,教练模型根本没法用。

6.2 我的几点实操体会

整个项目做下来,我有几个非常明确的感受。

第一,当教练这件事,价值网络比策略网络合适得多。策略网络擅长“找一步好棋”,但它的输出是一个相对概率,没法告诉你“你这手到底比最优差了多少”。价值网络输出的是胜率,天然带量纲,差出来的每一个百分点都可以直接当作“大局亏损”。这个特性是教练场景最需要的。

第二,数据质量远大于网络规模。我中间试过一次把网络加到128通道、8个ResBlock,参数量翻了几倍,结果验证集上的校准误差几乎没有好转。反而是把自对弈数据里“对手太弱”的问题修正之后,模型效果飙升。很多同学做AI项目第一反应是堆模型,我的建议是先把训练数据的问题想清楚:对手是谁、标签怎么定义、视角是否统一,这些才是决定上限的地方。

第三,“给孩子做教练”和“找AI虐人”是两种完全不同的体验。AI自己会下棋时,我们关注的是“它赢没赢”;当它变成教练时,我们关注的是“孩子能不能理解为什么”。我在复盘界面里花的时间,一点都不比训练模型少。数字要展示,但更要用孩子能接受的方式讲出来。

6.3 后续还能怎么玩

这套东西的扩展空间比我想象中大。同一套“自对弈产生数据、价值网络做评估、ΔV做单步点评”的框架,稍微改改棋盘的通道定义,就能迁移到中国象棋、国际象棋、甚至一些简单的回合制战棋游戏上。

另一个方向是把热点图和语音点评接进来。我现在的版本只是命令行加简单可视化,如果做成一个像样的App,孩子下棋时旁边有个声音实时念叨“这一手太缓了”“那边快顶不住了”,沉浸感会强很多。我自己现在还在用这套模型陪孩子做每周复盘,每周末挑两盘棋,把胜率曲线打出来,看看这一周“掉胜率手数”有没有变少。这件事比家长在旁边说一百遍“你下棋要多想想全局”都有用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询