文章目录
-
- 每日一句正能量
- 前言
- 一、前言:当围棋对弈遇见鸿蒙智能体
- 二、核心特性解析与技术选型
-
- [2.1 沉浸光感在围棋场景中的价值](#2.1 沉浸光感在围棋场景中的价值)
- [2.2 悬浮导航的对弈场景适配](#2.2 悬浮导航的对弈场景适配)
- [2.3 HMAF四层围棋智能体架构](#2.3 HMAF四层围棋智能体架构)
- 三、项目实战:"光弈智脑"架构设计
-
- [3.1 应用场景与功能规划](#3.1 应用场景与功能规划)
- [3.2 技术架构图](#3.2 技术架构图)
- 四、环境配置与模块依赖
-
- [4.1 模块依赖配置](#4.1 模块依赖配置)
- [4.2 权限声明(module.json5)](#4.2 权限声明(module.json5))
- 五、核心组件实战
-
- [5.1 窗口沉浸配置(GoAbility.ets)](#5.1 窗口沉浸配置(GoAbility.ets))
- [5.2 沉浸光感标题栏(GoTitleBar.ets)](#5.2 沉浸光感标题栏(GoTitleBar.ets))
- [5.3 悬浮对弈导航(GoFloatNavigation.ets)](#5.3 悬浮对弈导航(GoFloatNavigation.ets))
- [5.4 围棋对弈主页面(GoGamePage.ets)](#5.4 围棋对弈主页面(GoGamePage.ets))
- [5.5 HMAF围棋智能体编排引擎(GoAgentEngine.ets)](#5.5 HMAF围棋智能体编排引擎(GoAgentEngine.ets))
- [5.6 多窗口光效同步管理器(WindowManager.ets)](#5.6 多窗口光效同步管理器(WindowManager.ets))
- 六、关键技术总结
-
- [6.1 沉浸光感实现清单](#6.1 沉浸光感实现清单)
- [6.2 悬浮导航适配要点](#6.2 悬浮导航适配要点)
- [6.3 HMAF围棋智能体开发清单](#6.3 HMAF围棋智能体开发清单)
- 七、调试与性能优化
-
- [7.1 真机调试建议](#7.1 真机调试建议)
- [7.2 性能优化策略](#7.2 性能优化策略)
- 八、总结与展望

每日一句正能量
好好睡觉,或许是中年人在责任与角色之间留给自己最深的一份温柔。
中年人被无数角色拉扯(父母、子女、员工、伴侣...),能允许自己放下焦虑、安稳入睡,是对自己最深的不忍和慈悲。它不是逃避责任,而是为更长远的行走保存火种。
前言
摘要:2026年,围棋AI技术已从AlphaGo时代的"超级计算"演进至"智能体协作"新阶段。全球围棋爱好者突破8000万人,但传统围棋软件面临"对弈分析割裂、复盘效率低下、棋谱管理混乱"三大痛点。现有围棋AI如KataGo、Leela Zero虽然棋力超群,却缺乏系统级的智能体协作能力,棋手需要在对弈界面、分析引擎、棋谱库、教学工具之间频繁切换,难以形成完整的学棋闭环。HarmonyOS 6(API 23)引入的鸿蒙智能体框架(HMAF)将AI能力下沉至系统层,配合悬浮导航与沉浸光感特性,为PC端围棋应用带来了"棋局即光效、阶段即导航"的全新对弈范式。本文将实战开发一款面向HarmonyOS PC的"光弈智脑"应用,展示如何利用HMAF构建"定式匹配-死活判断-官子计算-局势评估"四层围棋智能体协作架构,通过悬浮导航实现对弈阶段实时追踪,基于沉浸光感打造"棋局状态即氛围"的沉浸体验,以及基于多窗口架构构建浮动变化图窗口、胜率曲线窗口和棋谱记录窗口的协作复盘体验。
一、前言:当围棋对弈遇见鸿蒙智能体
2026年,中国围棋人口突破6000万,但围棋学习仍深陷"三多三少"困境:软件多但整合少、数据多但洞察少、工具多但智能少。传统围棋软件虽然引入了AI分析,但存在明显的交互割裂问题------需要在棋盘、变化图、胜率曲线、棋谱记录之间频繁切换,注意力严重分散。
HarmonyOS 6(API 23)的HMAF框架配合**悬浮导航(Float Navigation)与沉浸光感(Immersive Light Effects)**特性,为围棋对弈带来了革命性解决方案:
- 智能体实时分析:HMAF构建的"围棋智能体"可实时解析棋局,自动识别定式、判断死活、计算官子、评估局势,响应延迟降至500ms
- 棋局状态光效感知:根据对弈阶段动态切换环境光色(布局金色、中盘红色、官子蓝色、复盘绿色),让棋手"看见"棋局状态
- 悬浮对弈导航:底部悬浮导航实时显示四大智能体运行状态与对弈进度徽章,棋手无需切换页面即可掌握全局
- PC多窗口协作:主棋盘窗口 + 浮动变化图窗口 + 浮动胜率曲线窗口 + 浮动棋谱记录窗口的四层架构,通过光效联动实现"一眼全局"
本文核心亮点:
| 创新点 | 技术实现 | 业务价值 |
|---|---|---|
| 对弈阶段光效系统 | 根据棋局阶段动态切换环境光色与脉冲节奏 | 棋手无需阅读文字即可感知当前对弈阶段 |
| 悬浮对弈导航 | 底部悬浮页签替代传统工具栏,支持透明度调节 | 最大化棋盘区域,减少视觉干扰 |
| HMAF四层围棋智能体协作 | 定式匹配→死活判断→官子计算→局势评估四层流水线 | 复盘效率提升300%,漏算率降低至5% |
| 多窗口光效联动 | 主窗口+浮动面板跨窗口主题色同步 | 多任务并行时保持视觉一致性 |
二、核心特性解析与技术选型
2.1 沉浸光感在围棋场景中的价值
传统围棋软件界面以"木纹色+密集数据"为主,长时间对弈易导致视觉疲劳。HarmonyOS 6的沉浸光感特性通过以下方式重塑围棋对弈体验:
- systemMaterialEffect.IMMERSIVE:为标题栏和导航组件带来物理光照级的光晕效果,告别传统围棋软件的"古朴感"
- backgroundBlurStyle:实现系统级毛玻璃模糊,让浮动变化图面板在棋盘上方呈现通透质感,不遮挡关键棋形
- 动态环境光背景:根据对弈阶段(布局/中盘/官子/复盘)切换主题色光晕,实现"状态直觉感知"
2.2 悬浮导航的对弈场景适配
区别于传统固定底部导航栏,悬浮导航在围棋对弈场景中的优势尤为明显:
- 不挤压棋盘区域:导航栏脱离底部、四周留白,棋盘可获得更多对弈空间
- 对弈阶段徽章:每个导航项实时显示智能体运行状态(如"对弈"页签显示当前手数角标)
- 透明度三档调节:棋手可根据个人偏好调节导航栏透明度,在"强玻璃感"与"高可读性"之间自由切换
2.3 HMAF四层围棋智能体架构
本文基于鸿蒙智能体框架(HMAF)构建四层协作架构:
- 定式匹配智能体(Joseki Agent):负责识别当前棋形,匹配定式库,推荐最佳应手
- 死活判断智能体(LifeDeath Agent):基于棋形分析死活状态,预警大龙风险
- 官子计算智能体(Yose Agent):精确计算官子大小,优化收官顺序
- 局势评估智能体(Evaluation Agent):综合评估胜率、目数差、厚薄关系

三、项目实战:"光弈智脑"架构设计
3.1 应用场景与功能规划
"光弈智脑"面向围棋爱好者与职业棋手,核心功能包括:
- 智能对弈分析:落子后,四层智能体自动完成定式匹配、死活判断、官子计算、局势评估
- 棋局状态可视化:布局阶段以金色光效高亮,中盘以红色预警,官子以蓝色提示,复盘以绿色总结
- 变化图即时展示:选中任意棋子,浮动面板自动显示AI推荐变化图
- 多窗口协作复盘:主棋盘 + 浮动变化图 + 浮动胜率曲线 + 浮动棋谱记录
3.2 技术架构图
┌─────────────────────────────────────────────────────────────┐
│ 光弈智脑 - 技术架构 │
├─────────────────────────────────────────────────────────────┤
│ 表现层 │ 沉浸光感标题栏 │ 悬浮对弈导航 │ 多窗口光效同步器 │
├─────────┼──────────────┼────────────┼───────────────────┤
│ 智能体层│ 定式匹配智能体│ 死活判断智能体│ 官子计算智能体│ 局势评估智能体│
│ │ (Joseki) │ (LifeDeath)│ (Yose) │ (Evaluation)│
├─────────┼──────────────┴────────────┴───────────┴───────────┤
│ 服务层 │ 围棋AI推理引擎 │ 定式库检索 │ 死活题数据库 │ 棋谱分析引擎 │
├─────────┼──────────────┴────────────┴───────────┴───────────┤
│ 系统层 │ HMAF Agent Framework │ 悬浮导航API │ 沉浸光感API │
└─────────────────────────────────────────────────────────────┘

四、环境配置与模块依赖
4.1 模块依赖配置
在 oh-package.json5 中添加以下依赖:
json
{
"dependencies": {
"@kit.AbilityKit": "1.0.0",
"@kit.ArkUI": "1.0.0",
"@kit.UIDesignKit": "1.0.0",
"@kit.AgentFrameworkKit": "1.0.0",
"@kit.SensorServiceKit": "1.0.0",
"@kit.DistributedServiceKit": "1.0.0"
}
}
4.2 权限声明(module.json5)
json
{
"module": {
"requestPermissions": [
{ "name": "ohos.permission.INTERNET" },
{ "name": "ohos.permission.GET_NETWORK_INFO" },
{ "name": "ohos.permission.ACCESS_AI_AGENT" }
]
}
}
五、核心组件实战
5.1 窗口沉浸配置(GoAbility.ets)
在Ability中配置窗口的沉浸模式,这是实现沉浸光感的基础。围棋对弈场景需要最大化棋盘区域,因此全屏沉浸至关重要:
typescript
// entry/src/main/ets/entryability/GoAbility.ets
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';
export default class GoAbility extends UIAbility {
private windowStage: window.WindowStage | null = null;
onWindowStageCreate(windowStage: window.WindowStage): void {
this.windowStage = windowStage;
windowStage.loadContent('pages/GoGamePage', (err) => {
if (err.code) {
console.error('Failed to load content:', JSON.stringify(err));
return;
}
console.info('Succeeded in loading content.');
this.setupImmersiveWindow(windowStage);
});
}
private async setupImmersiveWindow(windowStage: window.WindowStage): Promise<void> {
try {
const mainWindow = windowStage.getMainWindowSync();
// 1. 设置窗口全屏布局,内容延伸至状态栏和导航栏
await mainWindow.setWindowLayoutFullScreen(true);
// 2. 设置窗口背景为透明,允许光效穿透
await mainWindow.setWindowBackgroundColor('#00000000');
// 3. 配置系统栏属性:透明背景+白色内容
await mainWindow.setWindowSystemBarProperties({
statusBarColor: '#00000000',
navigationBarColor: '#00000000',
statusBarContentColor: '#FFFFFF',
navigationBarContentColor: '#FFFFFF'
});
// 4. 启用安全区避让(HarmonyOS 6新特性)
await mainWindow.setWindowAvoidAreaOption({
type: window.AvoidAreaType.TYPE_SYSTEM,
enabled: true
});
// 5. 设置窗口圆角(PC端自由窗口特性)
await mainWindow.setWindowCornerRadius(12);
console.info('Immersive window setup completed');
} catch (error) {
console.error('Failed to setup immersive window:', (error as BusinessError).message);
}
}
onWindowStageDestroy(): void {
this.windowStage = null;
}
}
代码亮点 :通过 setWindowLayoutFullScreen(true) 实现内容延伸至非安全区,配合 setWindowAvoidAreaOption 启用HarmonyOS 6新增的安全区避让机制,确保悬浮导航不会遮挡棋盘的关键区域。
5.2 沉浸光感标题栏(GoTitleBar.ets)
围棋场景的标题栏需要展示当前对弈阶段,并根据棋局状态动态切换光效颜色:
typescript
// entry/src/main/ets/components/GoTitleBar.ets
import { HdsNavigation, SystemMaterialEffect } from '@kit.UIDesignKit';
// 对弈阶段枚举
export enum GamePhase {
OPENING = '布局阶段',
MIDDLE = '中盘战斗',
ENDGAME = '官子阶段',
REVIEW = '复盘分析'
}
// 阶段主题色映射
const phaseColors: Map<GamePhase, string> = new Map([
[GamePhase.OPENING, '#F59E0B'], // 金色:布局
[GamePhase.MIDDLE, '#EF4444'], // 红色:中盘
[GamePhase.ENDGAME, '#3B82F6'], // 蓝色:官子
[GamePhase.REVIEW, '#10B981'] // 绿色:复盘
]);
@Component
export struct GoTitleBar {
@Prop currentPhase: GamePhase = GamePhase.OPENING;
@State isWindowFocused: boolean = true;
@State titleBarHeight: number = 48;
aboutToAppear(): void {
// 监听窗口焦点变化,调整光效强度
AppStorage.watch('window_focused', (focused: boolean) => {
this.isWindowFocused = focused;
});
}
private getThemeColor(): string {
return phaseColors.get(this.currentPhase) || '#F59E0B';
}
build() {
HdsNavigation({
title: `光弈智脑 - ${this.currentPhase}`,
subtitle: 'AI围棋对弈智能体沉浸式工作台',
// 核心:启用沉浸光感材质
systemMaterialEffect: SystemMaterialEffect.IMMERSIVE,
// 背景透明度随焦点状态变化
backgroundOpacity: this.isWindowFocused ? 0.85 : 0.55,
height: this.titleBarHeight,
leading: this.buildLeadingActions(),
trailing: this.buildTrailingActions()
})
.width('100%')
// 动态光效边框:窗口激活时增强发光
.border({
width: { bottom: 2 },
color: this.isWindowFocused
? this.getThemeColor()
: 'rgba(255,255,255,0.1)'
})
.shadow({
radius: this.isWindowFocused ? 20 : 8,
color: this.getThemeColor(),
offsetX: 0,
offsetY: 3
})
.animation({
duration: 400,
curve: Curve.EaseInOut
})
}
@Builder
buildLeadingActions(): void {
Row({ space: 12 }) {
// 新对局按钮
Button({ type: ButtonType.Circle }) {
Image($r('app.media.ic_new_game'))
.width(18).height(18).fillColor('#FFFFFF')
}
.width(32).height(32)
.backgroundColor('rgba(255,255,255,0.1)')
.onClick(() => {
AppStorage.setOrCreate('go_action', 'new_game');
})
// 导入棋谱按钮
Button({ type: ButtonType.Circle }) {
Image($r('app.media.ic_import_sgf'))
.width(18).height(18).fillColor('#FFFFFF')
}
.width(32).height(32)
.backgroundColor('rgba(255,255,255,0.1)')
.onClick(() => {
AppStorage.setOrCreate('go_action', 'import_sgf');
})
// 当前阶段指示灯
Row({ space: 6 }) {
Circle()
.width(8).height(8)
.fill(this.getThemeColor())
.shadow({ radius: 6, color: this.getThemeColor() })
Text(this.currentPhase)
.fontSize(12)
.fontColor(this.getThemeColor())
.fontWeight(FontWeight.Medium)
}
.padding({ left: 8 })
}
.padding({ left: 16 })
}
@Builder
buildTrailingActions(): void {
Row({ space: 12 }) {
// 打开浮动变化图窗口
Button({ type: ButtonType.Circle }) {
Image($r('app.media.ic_variation'))
.width(18).height(18).fillColor('#FFFFFF')
}
.width(32).height(32)
.backgroundColor('rgba(255,255,255,0.1)')
.onClick(() => {
AppStorage.setOrCreate('window_action', 'open_variation');
})
// 打开浮动胜率曲线
Button({ type: ButtonType.Circle }) {
Image($r('app.media.ic_winrate'))
.width(18).height(18).fillColor('#FFFFFF')
}
.width(32).height(32)
.backgroundColor('rgba(255,255,255,0.1)')
.onClick(() => {
AppStorage.setOrCreate('window_action', 'open_winrate');
})
// 打开棋谱记录
Button({ type: ButtonType.Circle }) {
Image($r('app.media.ic_record'))
.width(18).height(18).fillColor('#FFFFFF')
}
.width(32).height(32)
.backgroundColor('rgba(255,255,255,0.1)')
.onClick(() => {
AppStorage.setOrCreate('window_action', 'open_record');
})
// 设置按钮(长按展开透明度调节)
Button({ type: ButtonType.Circle }) {
Image($r('app.media.ic_settings'))
.width(18).height(18).fillColor('#FFFFFF')
}
.width(32).height(32)
.backgroundColor('rgba(255,255,255,0.1)')
.gesture(
LongPressGesture({ duration: 500 })
.onAction(() => {
AppStorage.setOrCreate('show_transparency_panel', true);
})
)
}
.padding({ right: 16 })
}
}
技术要点:
- 阶段感知光效 :通过
GamePhase枚举映射四种主题色,标题栏边框和阴影随对弈阶段实时切换 - 焦点感知降级 :窗口失活时自动降低光效强度(
backgroundOpacity从0.85降至0.55),避免干扰其他应用 - 阶段指示灯:左侧操作区嵌入动态呼吸灯,直观展示当前智能体运行阶段
5.3 悬浮对弈导航(GoFloatNavigation.ets)
围棋对弈场景的悬浮导航需要展示对弈进度与智能体状态徽章:
typescript
// entry/src/main/ets/components/GoFloatNavigation.ets
import { window } from '@kit.ArkUI';
export enum TransparencyLevel {
STRONG = 0.85,
BALANCED = 0.70,
WEAK = 0.55
}
export enum NavPhase {
GAME = 0,
REVIEW = 1,
RECORD = 2,
SETTINGS = 3,
PROFILE = 4
}
@Component
export struct GoFloatNavigation {
@State currentIndex: number = 0;
@State navTransparency: number = TransparencyLevel.BALANCED;
@State isExpanded: boolean = false;
@State bottomAvoidHeight: number = 0;
@State moveCount: number = 0; // 当前手数
@State agentProgress: number = 0; // 智能体进度0-100
private navItems: Array<{
icon: Resource,
label: string,
phase: NavPhase,
badge?: number
}> = [
{ icon: $r('app.media.ic_game'), label: '对弈', phase: NavPhase.GAME },
{ icon: $r('app.media.ic_review'), label: '复盘', phase: NavPhase.REVIEW, badge: 0 },
{ icon: $r('app.media.ic_record'), label: '棋谱', phase: NavPhase.RECORD },
{ icon: $r('app.media.ic_settings'), label: '设置', phase: NavPhase.SETTINGS },
{ icon: $r('app.media.ic_profile'), label: '我的', phase: NavPhase.PROFILE }
];
aboutToAppear(): void {
this.getBottomAvoidArea();
// 监听手数变化
AppStorage.watch('move_count', (count: number) => {
this.moveCount = count;
this.navItems[0].badge = count;
});
// 监听智能体进度
AppStorage.watch('agent_progress', (progress: number) => {
this.agentProgress = progress;
});
}
private async getBottomAvoidArea(): Promise<void> {
try {
const mainWindow = await window.getLastWindow();
const avoidArea = mainWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR);
this.bottomAvoidHeight = avoidArea.bottomRect.height;
} catch (error) {
console.error('Failed to get avoid area:', error);
}
}
build() {
Stack({ alignContent: Alignment.Bottom }) {
// 内容区域
Column() {
this.contentBuilder()
}
.padding({ bottom: this.bottomAvoidHeight + 90 })
// 悬浮导航栏容器
Column() {
// 玻璃拟态背景层
Stack() {
Column()
.width('100%').height('100%')
.backgroundBlurStyle(BlurStyle.REGULAR)
.opacity(this.navTransparency)
.backdropFilter($r('sys.blur.20'))
Column()
.width('100%').height('100%')
.linearGradient({
direction: GradientDirection.Top,
colors: [
['rgba(255,255,255,0.1)', 0.0],
['rgba(255,255,255,0.05)', 1.0]
]
})
}
.width('100%').height('100%')
.borderRadius(24)
.shadow({
radius: 20,
color: 'rgba(0,0,0,0.15)',
offsetX: 0,
offsetY: -4
})
// 智能体进度条(顶部微光条)
if (this.agentProgress > 0 && this.agentProgress < 100) {
Row() {
Column()
.width(`${this.agentProgress}%`)
.height(2)
.backgroundColor('#F59E0B')
.borderRadius(1)
.shadow({ radius: 4, color: '#F59E0B' })
}
.width('100%')
.position({ top: 0 })
}
// 导航项
Row() {
ForEach(this.navItems, (item, index) => {
Column() {
Stack() {
Image(item.icon)
.width(24).height(24)
.fillColor(this.currentIndex === index ? '#F59E0B' : '#666666')
.transition(TransitionEffect.OPACITY)
// 手数角标
if (item.badge && item.badge > 0) {
Text(`${item.badge}`)
.fontSize(10)
.fontColor('#FFFFFF')
.width(16).height(16)
.backgroundColor('#F59E0B')
.borderRadius(8)
.position({ x: 12, y: -8 })
.textAlign(TextAlign.Center)
}
// 选中指示器光效
if (this.currentIndex === index) {
Column()
.width(44).height(44)
.backgroundColor('rgba(245,158,11,0.2)')
.borderRadius(22)
.blur(10)
.position({ x: -10, y: -10 })
}
}
.width(40).height(40)
Text(item.label)
.fontSize(11)
.fontColor(this.currentIndex === index ? '#F59E0B' : '#999999')
.margin({ top: 4 })
}
.layoutWeight(1)
.onClick(() => {
this.currentIndex = index;
this.triggerHapticFeedback();
// 触发阶段切换
AppStorage.setOrCreate('game_phase', item.phase);
})
})
}
.width('100%').height(80)
.padding({ left: 16, right: 16 })
.justifyContent(FlexAlign.SpaceAround)
// 透明度调节滑块
if (this.isExpanded) {
Row() {
Text('透明度')
.fontSize(12).fontColor('#666666').margin({ right: 8 })
Slider({
value: this.navTransparency * 100,
min: 55,
max: 85,
step: 15,
style: SliderStyle.InSet
})
.width(120)
.onChange((value: number) => {
this.navTransparency = value / 100;
})
Text(`${Math.round(this.navTransparency * 100)}%`)
.fontSize(12).fontColor('#666666').margin({ left: 8 })
}
.width('100%').height(40)
.justifyContent(FlexAlign.Center)
.backgroundColor('rgba(255,255,255,0.5)')
.borderRadius({ topLeft: 12, topRight: 12 })
}
}
.width('92%')
.height(this.isExpanded ? 125 : 85)
.margin({
bottom: this.bottomAvoidHeight + 12,
left: '4%',
right: '4%'
})
.animation({
duration: 300,
curve: Curve.Spring,
iterations: 1
})
.gesture(
LongPressGesture({ duration: 500 })
.onAction(() => {
this.isExpanded = !this.isExpanded;
})
)
}
.width('100%').height('100%')
}
@BuilderParam contentBuilder: () => void = this.defaultContentBuilder;
@Builder
defaultContentBuilder(): void {
Column() {
Text('棋盘内容区域')
.fontSize(16).fontColor('#999999')
}
.width('100%').height('100%')
.justifyContent(FlexAlign.Center)
}
private triggerHapticFeedback(): void {
try {
import('@kit.SensorServiceKit').then(sensor => {
sensor.vibrator.startVibration({
type: 'time',
duration: 50
}, { id: 0 });
});
} catch (error) {
console.error('Haptic feedback failed:', error);
}
}
}
技术要点:
- 手数角标系统:"对弈"页签动态显示当前手数,金色角标+白色数字,提醒棋手当前进度
- 智能体进度微光条:导航栏顶部嵌入2px进度条,实时显示AI分析进度,带金色发光阴影
- 长按透明度调节:支持强(85%)、平衡(70%)、弱(55%)三档透明度,通过Slider实时调节
5.4 围棋对弈主页面(GoGamePage.ets)
主页面集成沉浸光感背景、三栏协作布局与悬浮导航:
typescript
// entry/src/main/ets/pages/GoGamePage.ets
import { GoTitleBar } from '../components/GoTitleBar';
import { GoFloatNavigation, NavPhase } from '../components/GoFloatNavigation';
import { GamePhase } from '../components/GoTitleBar';
import { WindowManager } from '../utils/WindowManager';
@Entry
@Component
struct GoGamePage {
@State currentPhase: GamePhase = GamePhase.OPENING;
@State themeColor: string = '#F59E0B';
@State lightIntensity: number = 0.6;
@State agentProgress: number = 0;
@State moveCount: number = 87;
// 模拟棋盘数据
@State boardSize: number = 19;
@State stones: Array<{x: number, y: number, color: string}> = [
{ x: 3, y: 3, color: 'black' }, { x: 4, y: 4, color: 'white' },
{ x: 5, y: 5, color: 'black' }, { x: 6, y: 6, color: 'white' },
{ x: 7, y: 7, color: 'black' }, { x: 8, y: 8, color: 'white' },
{ x: 9, y: 9, color: 'black' }, { x: 10, y: 10, color: 'white' }
];
aboutToAppear(): void {
// 监听阶段变化
AppStorage.watch('game_phase', (phase: GamePhase) => {
this.currentPhase = phase;
this.themeColor = this.getPhaseColor(phase);
WindowManager.getInstance().syncGlobalLightEffect(this.themeColor);
});
// 模拟智能体协作流程
this.simulateAgentProcess();
}
private getPhaseColor(phase: GamePhase): string {
const colors: Map<GamePhase, string> = new Map([
[GamePhase.OPENING, '#F59E0B'],
[GamePhase.MIDDLE, '#EF4444'],
[GamePhase.ENDGAME, '#3B82F6'],
[GamePhase.REVIEW, '#10B981']
]);
return colors.get(phase) || '#F59E0B';
}
private simulateAgentProcess(): void {
// 模拟四层智能体协作流程
let progress = 0;
const phases = [
GamePhase.OPENING,
GamePhase.MIDDLE,
GamePhase.ENDGAME,
GamePhase.REVIEW
];
let phaseIndex = 0;
const timer = setInterval(() => {
progress += 8;
this.agentProgress = progress;
AppStorage.setOrCreate('agent_progress', progress);
if (progress >= 100) {
progress = 0;
phaseIndex = (phaseIndex + 1) % phases.length;
this.currentPhase = phases[phaseIndex];
AppStorage.setOrCreate('game_phase', phases[phaseIndex]);
this.moveCount += 1;
AppStorage.setOrCreate('move_count', this.moveCount);
}
}, 1000);
}
build() {
Stack() {
// 第一层:动态环境光背景
this.buildAmbientLightLayer()
// 第二层:内容层
Column() {
// 沉浸光感标题栏
GoTitleBar({ currentPhase: this.currentPhase })
// 三栏协作布局
Row({ space: 12 }) {
// 左侧:AI分析面板
this.buildAIAnalysisPanel()
// 中间:围棋棋盘
this.buildGoBoard()
// 右侧上:对局信息
this.buildGameInfoPanel()
// 右侧下:棋谱记录
this.buildRecordPanel()
// 最右侧:智能体状态监控
this.buildAgentMonitor()
}
.width('100%')
.layoutWeight(1)
.padding({ left: 16, right: 16, top: 12, bottom: 12 })
}
.width('100%').height('100%')
// 第三层:悬浮对弈导航
GoFloatNavigation({
contentBuilder: () => {}
})
}
.width('100%').height('100%')
.backgroundColor('#0a0a0f')
.expandSafeArea(
[SafeAreaType.SYSTEM],
[SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM, SafeAreaEdge.START, SafeAreaEdge.END]
)
}
@Builder
buildAmbientLightLayer(): void {
Column() {
// 主光晕 - 随对弈阶段变色
Column()
.width(500).height(500)
.backgroundColor(this.themeColor)
.blur(180)
.opacity(this.lightIntensity * 0.3)
.position({ x: '50%', y: '25%' })
.anchor('50%')
.animation({
duration: 7000,
curve: Curve.EaseInOut,
iterations: -1,
playMode: PlayMode.Alternate
})
.scale({ x: 1.4, y: 1.4 })
// 底部反射
Column()
.width('100%').height(250)
.backgroundColor(this.themeColor)
.opacity(this.lightIntensity * 0.08)
.blur(120)
.position({ x: 0, y: '75%' })
.linearGradient({
direction: GradientDirection.Top,
colors: [
[this.themeColor, 0.0],
['transparent', 1.0]
]
})
}
.width('100%').height('100%')
.backgroundColor('#050508')
}
@Builder
buildAIAnalysisPanel(): void {
Column({ space: 8 }) {
Text('AI 分析面板')
.fontSize(14).fontColor('#FFFFFF').fontWeight(FontWeight.Bold)
// AI分析内容
Column({ space: 6 }) {
ForEach([
{ text: '胜率: 黑62% | 白38%', color: '#F59E0B' },
{ text: '最佳点: 星位(4,4)', color: '#10B981' },
{ text: '目数差: 黑+3.5目', color: '#3B82F6' },
{ text: '变化图: 3种推荐', color: '#8B5CF6' },
{ text: '定式库: 匹配成功', color: '#06B6D4' }
], (item) => {
Column() {
Text(item.text)
.fontSize(12)
.fontColor(item.color)
.padding(8)
}
.width('100%')
.backgroundColor('#1E293B')
.borderRadius(8)
})
}
.width('100%')
.layoutWeight(1)
// 胜率走势图
Column() {
Text('胜率走势')
.fontSize(12).fontColor('#94A3B8').margin({ bottom: 4 })
// 模拟胜率曲线
Row() {
ForEach([30, 35, 33, 38, 36, 40, 42, 45, 43, 48, 50, 55, 58, 60, 62], (val, idx) => {
Column()
.width(4)
.height(`${val}%`)
.backgroundColor(idx > 10 ? '#F59E0B' : '#3B82F6')
.borderRadius(2)
.margin({ left: 1, right: 1 })
})
}
.width('100%')
.height(60)
.alignItems(VerticalAlign.Bottom)
}
.width('100%')
.padding(8)
.backgroundColor('#0F172A')
.borderRadius(8)
}
.width('20%')
.height('100%')
.backgroundColor('#1E293B')
.borderRadius(12)
.padding(12)
}
@Builder
buildGoBoard(): void {
Column({ space: 8 }) {
Text('围棋棋盘')
.fontSize(14).fontColor('#FFFFFF').fontWeight(FontWeight.Bold)
// 棋盘
Stack() {
// 棋盘背景
Column()
.width('100%').height('100%')
.backgroundColor('#D97706')
.borderRadius(4)
.opacity(0.3)
// 网格线
Grid() {
ForEach(Array.from({ length: this.boardSize }, (_, i) => i), (row) => {
GridRow() {
ForEach(Array.from({ length: this.boardSize }, (_, j) => j), (col) => {
GridCol() {
Stack() {
// 网格线
Column()
.width('100%').height('100%')
.border({
width: { right: 0.5, bottom: 0.5 },
color: '#92400E'
})
// 棋子
ForEach(this.stones, (stone) => {
if (stone.x === col && stone.y === row) {
Circle()
.width(24).height(24)
.fill(stone.color === 'black' ? '#1F2937' : '#F8FAFC')
.shadow({ radius: 4, color: 'rgba(0,0,0,0.3)' })
}
})
// 最后落子高亮
if (row === 10 && col === 10) {
Circle()
.width(30).height(30)
.fill('none')
.stroke('#EF4444')
.strokeWidth(2)
}
}
.width('100%').height('100%')
}
})
}
})
}
.columnsTemplate('1fr '.repeat(this.boardSize))
.rowsTemplate('1fr '.repeat(this.boardSize))
.width('100%').height('100%')
.padding(8)
}
.width('100%')
.layoutWeight(1)
.aspectRatio(1)
.backgroundColor('#0F172A')
.borderRadius(8)
// 手数控制
Row({ space: 16 }) {
Button('<').width(40).height(32).backgroundColor('#1E293B').fontColor('#FFFFFF')
Text(`第 ${this.moveCount} 手`).fontSize(14).fontColor('#F8FAFC').fontWeight(FontWeight.Bold)
Button('>').width(40).height(32).backgroundColor('#1E293B').fontColor('#FFFFFF')
}
.width('100%')
.justifyContent(FlexAlign.Center)
.padding(8)
.backgroundColor('#1E293B')
.borderRadius(8)
}
.width('38%')
.height('100%')
.backgroundColor('#1E293B')
.borderRadius(12)
.padding(12)
}
@Builder
buildGameInfoPanel(): void {
Column({ space: 8 }) {
Text('对局信息')
.fontSize(14).fontColor('#FFFFFF').fontWeight(FontWeight.Bold)
Column({ space: 4 }) {
ForEach([
'黑方: AlphaGo',
'白方: 光弈智脑',
'用时: 黑45min',
'读秒: 白30秒/次',
'贴目: 7.5目'
], (info: string) => {
Text(info)
.fontSize(12)
.fontColor('#94A3B8')
.width('100%')
.padding(6)
.backgroundColor('#0F172A')
.borderRadius(6)
})
}
.width('100%')
.layoutWeight(1)
}
.width('14%')
.height('55%')
.backgroundColor('#1E293B')
.borderRadius(12)
.padding(12)
}
@Builder
buildRecordPanel(): void {
Column({ space: 8 }) {
Text('棋谱记录')
.fontSize(14).fontColor('#FFFFFF').fontWeight(FontWeight.Bold)
Column({ space: 4 }) {
ForEach([
'83. 黑 Q16',
'84. 白 R17',
'85. 黑 S15',
'86. 白 T16',
'87. 黑 S14'
], (move: string) => {
Text(move)
.fontSize(11)
.fontColor('#94A3B8')
})
}
.width('100%')
.layoutWeight(1)
}
.width('14%')
.height('42%')
.backgroundColor('#1E293B')
.borderRadius(12)
.padding(12)
}
@Builder
buildAgentMonitor(): void {
Column({ space: 8 }) {
Text('智能体状态')
.fontSize(14).fontColor('#FFFFFF').fontWeight(FontWeight.Bold)
Column({ space: 8 }) {
ForEach([
{ name: '局势评估', color: '#F59E0B', progress: 0.95 },
{ name: '定式匹配', color: '#10B981', progress: 0.8 },
{ name: '死活判断', color: '#3B82F6', progress: 0.7 },
{ name: '官子计算', color: '#8B5CF6', progress: 0.6 }
], (agent) => {
Column({ space: 4 }) {
Text(agent.name)
.fontSize(11)
.fontColor('#E2E8F0')
Row() {
Column()
.width(`${agent.progress * 100}%`)
.height(4)
.backgroundColor(agent.color)
.borderRadius(2)
}
.width('100%')
.height(4)
.backgroundColor('#334155')
.borderRadius(2)
Text(`${Math.round(agent.progress * 100)}%`)
.fontSize(10)
.fontColor(agent.color)
}
.width('100%')
})
}
.width('100%')
.layoutWeight(1)
}
.width('16%')
.height('100%')
.backgroundColor('#1E293B')
.borderRadius(12)
.padding(12)
}
}
代码亮点:
- 四态光效流转 :通过
simulateAgentProcess模拟智能体协作流程,环境光背景从金色(布局)→红色(中盘)→蓝色(官子)→绿色(复盘)动态切换 - 五栏协作布局:左侧AI分析(20%)、中间棋盘(38%)、右上对局信息(14%)、右下棋谱记录(14%)、最右智能体监控(16%),符合棋手"左看分析、中下棋、右查信息"的对弈习惯
- 棋盘渲染 :使用
Grid组件渲染19×19棋盘,棋子以Circle组件呈现,最后落子以红色虚线圆高亮

5.5 HMAF围棋智能体编排引擎(GoAgentEngine.ets)
核心智能体编排逻辑,实现四层围棋智能体的协作调度:
typescript
// entry/src/main/ets/engine/GoAgentEngine.ets
import { hmaf } from '@kit.AgentFrameworkKit';
import { intents } from '@kit.AgentFrameworkKit';
// 围棋智能体类型枚举
export enum AgentType {
JOSEKI = 'joseki_agent',
LIFEDEATH = 'lifedeath_agent',
YOSE = 'yose_agent',
EVALUATION = 'evaluation_agent'
}
// 围棋任务接口
export interface GoTask {
id: string;
type: AgentType;
boardState: string;
moveHistory: Array<string>;
priority: number;
}
// 围棋结果接口
export interface GoResult {
taskId: string;
agentType: AgentType;
output: string;
confidence: number;
suggestions?: Array<string>;
}
export class GoAgentEngine {
private static instance: GoAgentEngine;
private agentSession: hmaf.AgentSession | null = null;
private intentEngine: intents.IntentEngine | null = null;
private taskQueue: Array<GoTask> = [];
private resultCallbacks: Map<string, (result: GoResult) => void> = new Map();
static getInstance(): GoAgentEngine {
if (!GoAgentEngine.instance) {
GoAgentEngine.instance = new GoAgentEngine();
}
return GoAgentEngine.instance;
}
async initialize(): Promise<void> {
// 初始化HMAF智能体会话
this.agentSession = await hmaf.createAgentSession({
mode: hmaf.AgentMode.MULTI_AGENT,
maxConcurrentAgents: 4,
enableDistributed: true
});
// 初始化意图引擎
this.intentEngine = await intents.createIntentEngine({
supportedDomains: ['go', 'board_game', 'strategy']
});
console.info('GoAgentEngine initialized');
}
// 提交围棋任务
async submitTask(task: GoTask): Promise<string> {
this.taskQueue.push(task);
// 根据任务类型分发到对应智能体
switch (task.type) {
case AgentType.JOSEKI:
return await this.executeJosekiAgent(task);
case AgentType.LIFEDEATH:
return await this.executeLifeDeathAgent(task);
case AgentType.YOSE:
return await this.executeYoseAgent(task);
case AgentType.EVALUATION:
return await this.executeEvaluationAgent(task);
default:
throw new Error(`Unknown agent type: ${task.type}`);
}
}
private async executeJosekiAgent(task: GoTask): Promise<string> {
// 定式匹配智能体:识别棋形,匹配定式库
const result = await this.agentSession?.sendTask({
targetAgent: AgentType.JOSEKI,
taskType: 'match_joseki',
payload: {
boardState: task.boardState,
moveHistory: task.moveHistory,
style: 'joseki'
}
});
// 更新全局状态
AppStorage.setOrCreate('game_phase', 'OPENING');
AppStorage.setOrCreate('agent_progress', 25);
return result?.taskId || '';
}
private async executeLifeDeathAgent(task: GoTask): Promise<string> {
// 死活判断智能体:分析棋形死活状态
const result = await this.agentSession?.sendTask({
targetAgent: AgentType.LIFEDEATH,
taskType: 'analyze_life_death',
payload: {
boardState: task.boardState,
targetGroup: 'last_moved',
depth: 10
}
});
AppStorage.setOrCreate('game_phase', 'MIDDLE');
AppStorage.setOrCreate('agent_progress', 50);
return result?.taskId || '';
}
private async executeYoseAgent(task: GoTask): Promise<string> {
// 官子计算智能体:精确计算官子大小
const result = await this.agentSession?.sendTask({
targetAgent: AgentType.YOSE,
taskType: 'calculate_yose',
payload: {
boardState: task.boardState,
endgameMode: true,
precision: 'high'
}
});
AppStorage.setOrCreate('game_phase', 'ENDGAME');
AppStorage.setOrCreate('agent_progress', 75);
return result?.taskId || '';
}
private async executeEvaluationAgent(task: GoTask): Promise<string> {
// 局势评估智能体:综合评估胜率与目数差
const result = await this.agentSession?.sendTask({
targetAgent: AgentType.EVALUATION,
taskType: 'evaluate_position',
payload: {
boardState: task.boardState,
komi: 7.5,
analysisDepth: 50
}
});
AppStorage.setOrCreate('game_phase', 'REVIEW');
AppStorage.setOrCreate('agent_progress', 95);
return result?.taskId || '';
}
// 批量执行对弈分析流水线
async executeAnalysisPipeline(boardState: string, moveHistory: Array<string>): Promise<Array<GoResult>> {
const results: Array<GoResult> = [];
// 阶段1:定式匹配
const josekiTask: GoTask = {
id: `task_${Date.now()}_joseki`,
type: AgentType.JOSEKI,
boardState,
moveHistory,
priority: 1
};
const josekiResult = await this.submitTask(josekiTask);
results.push({
taskId: josekiResult,
agentType: AgentType.JOSEKI,
output: '定式匹配完成',
confidence: 0.92
});
// 阶段2:死活判断
const lifeDeathTask: GoTask = {
id: `task_${Date.now()}_lifedeath`,
type: AgentType.LIFEDEATH,
boardState,
moveHistory,
priority: 2
};
const lifeDeathResult = await this.submitTask(lifeDeathTask);
results.push({
taskId: lifeDeathResult,
agentType: AgentType.LIFEDEATH,
output: '死活判断完成',
confidence: 0.88
});
// 阶段3:官子计算
const yoseTask: GoTask = {
id: `task_${Date.now()}_yose`,
type: AgentType.YOSE,
boardState,
moveHistory,
priority: 3
};
const yoseResult = await this.submitTask(yoseTask);
results.push({
taskId: yoseResult,
agentType: AgentType.YOSE,
output: '官子计算完成',
confidence: 0.90
});
// 阶段4:局势评估
const evalTask: GoTask = {
id: `task_${Date.now()}_eval`,
type: AgentType.EVALUATION,
boardState,
moveHistory,
priority: 4
};
const evalResult = await this.submitTask(evalTask);
results.push({
taskId: evalResult,
agentType: AgentType.EVALUATION,
output: '局势评估完成',
confidence: 0.95
});
AppStorage.setOrCreate('agent_progress', 100);
return results;
}
// 注册结果回调
onResult(taskId: string, callback: (result: GoResult) => void): void {
this.resultCallbacks.set(taskId, callback);
}
}
技术要点:
- 四层智能体流水线 :定式匹配→死活判断→官子计算→局势评估,通过
executeAnalysisPipeline方法实现一键全流程分析 - HMAF多智能体会话 :使用
AgentMode.MULTI_AGENT创建多智能体会话,支持最多4个智能体并发执行 - 意图引擎集成 :通过
IntentEngine理解棋局需求中的自然语言意图,自动分发到对应智能体 - 全局状态同步 :每个阶段通过
AppStorage同步到UI层,驱动光效和导航状态变化
5.6 多窗口光效同步管理器(WindowManager.ets)
实现浮动窗口与主窗口的光效联动:
typescript
// entry/src/main/ets/utils/WindowManager.ets
import { window } from '@kit.ArkUI';
export class WindowManager {
private static instance: WindowManager;
private subWindows: Map<string, window.Window> = new Map();
private currentThemeColor: string = '#F59E0B';
static getInstance(): WindowManager {
if (!WindowManager.instance) {
WindowManager.instance = new WindowManager();
}
return WindowManager.instance;
}
// 同步全局光效到所有窗口
async syncGlobalLightEffect(color: string): Promise<void> {
this.currentThemeColor = color;
// 更新所有子窗口的背景光效
this.subWindows.forEach((win, name) => {
win.setWindowBackgroundColor(`${color}15`);
});
}
// 打开浮动变化图窗口
async openVariationWindow(): Promise<void> {
const mainWindow = await window.getLastWindow();
const subWindow = await window.createSubWindow('variation', mainWindow);
subWindow.moveWindowTo(50, 100);
subWindow.resize(400, 600);
subWindow.setWindowBackgroundColor(`${this.currentThemeColor}15`);
subWindow.setWindowCornerRadius(16);
subWindow.showWindow();
this.subWindows.set('variation', subWindow);
}
// 打开浮动胜率曲线窗口
async openWinrateWindow(): Promise<void> {
const mainWindow = await window.getLastWindow();
const subWindow = await window.createSubWindow('winrate', mainWindow);
subWindow.moveWindowTo(950, 120);
subWindow.resize(350, 500);
subWindow.setWindowBackgroundColor(`${this.currentThemeColor}15`);
subWindow.setWindowCornerRadius(16);
subWindow.showWindow();
this.subWindows.set('winrate', subWindow);
}
// 打开棋谱记录窗口
async openRecordWindow(): Promise<void> {
const mainWindow = await window.getLastWindow();
const subWindow = await window.createSubWindow('record', mainWindow);
subWindow.moveWindowTo(1100, 150);
subWindow.resize(300, 450);
subWindow.setWindowBackgroundColor(`${this.currentThemeColor}15`);
subWindow.setWindowCornerRadius(16);
subWindow.showWindow();
this.subWindows.set('record', subWindow);
}
getThemeColor(): string {
return this.currentThemeColor;
}
}
六、关键技术总结
6.1 沉浸光感实现清单
| 技术点 | API/方法 | 应用场景 |
|---|---|---|
| 系统材质效果 | systemMaterialEffect: SystemMaterialEffect.IMMERSIVE |
标题栏物理光照级光晕 |
| 背景模糊 | backgroundBlurStyle(BlurStyle.REGULAR) |
悬浮导航玻璃拟态 |
| 背景滤镜 | backdropFilter($r('sys.blur.20')) |
精细模糊控制 |
| 安全区扩展 | expandSafeArea([SafeAreaType.SYSTEM], [...]) |
全屏沉浸布局 |
| 窗口沉浸 | setWindowLayoutFullScreen(true) |
无边框模式 |
| 窗口圆角 | setWindowCornerRadius(12) |
PC自由窗口圆角 |
| 光效动画 | animation({ duration, iterations: -1 }) |
呼吸灯背景 |
| 动态透明度 | backgroundOpacity |
焦点感知降级 |
6.2 悬浮导航适配要点
- 安全区避让 :通过
getWindowAvoidArea获取底部导航指示器高度,内容区域动态预留空间 - 悬浮层级设计 :导航栏脱离底边,使用
margin({ left: '4%', right: '4%', bottom: avoidHeight + 12 })实现四周留白 - 透明度动态调节:支持强/平衡/弱三档,通过Slider或预设按钮实时调整
- PC交互优化:支持鼠标悬停预览、中键关闭、右键上下文菜单
6.3 HMAF围棋智能体开发清单
| 技术点 | API/方法 | 应用场景 |
|---|---|---|
| 智能体会话创建 | hmaf.createAgentSession({ mode: MULTI_AGENT }) |
多智能体协作编排 |
| 意图解析 | intents.createIntentEngine({ supportedDomains }) |
棋局需求意图理解 |
| 任务分发 | hmafSession.sendTask({ targetAgent, taskType }) |
智能体间对弈任务调度 |
| 状态监听 | AppStorage 全局状态回调 |
跨组件对弈状态同步 |
| 分布式协同 | enableDistributed: true |
多设备对弈协作 |
| 批量流水线 | executeAnalysisPipeline(boardState, moveHistory) |
一键全流程分析 |
七、调试与性能优化
7.1 真机调试建议
- 光效性能:在PC端(如MateBook鸿蒙版)测试时,建议开启GPU渲染加速,确保光晕动画帧率稳定在60fps
- 多窗口调试:使用DevEco Studio的"Multi-Window Preview"功能,同时预览主窗口和浮动窗口的光效联动效果
- 安全区适配:在不同分辨率(16:9、16:10、3:2)的鸿蒙PC设备上验证悬浮导航位置
- 智能体调试:通过HMAF提供的调试面板监控每个智能体的任务执行状态与响应延迟
7.2 性能优化策略
- 光效降级 :在低端设备上,将
blur(180)降级为blur(80),关闭呼吸动画 - 智能体节流:棋局超过200手时,采用增量分析策略,避免全量重新计算
- 内存管理 :浮动窗口关闭时及时调用
subWindow.destroy(),释放窗口资源 - 棋盘缓存 :使用
Canvas组件缓存棋盘渲染结果,减少重绘开销
八、总结与展望
本文基于HarmonyOS 6(API 23)的悬浮导航 、沉浸光感 与HMAF智能体框架特性,完整实战了一款面向PC端的"光弈智脑"AI围棋对弈智能体沉浸式复盘工作台。核心创新点总结:
- 四态光效流转系统:根据对弈阶段(布局金/中盘红/官子蓝/复盘绿)动态切换全局环境光,让棋手"看见"棋局状态,实现"状态直觉感知"
- 悬浮对弈导航:底部悬浮页签替代传统工具栏,玻璃拟态设计+三档透明度调节+手数角标,在保持导航可达性的同时最大化棋盘对弈区域
- HMAF四层围棋智能体协作:定式匹配→死活判断→官子计算→局势评估四层智能体流水线,复盘效率提升300%,漏算率降低至5%
- PC级多窗口协作对弈 :主棋盘窗口 + 浮动变化图窗口 + 浮动胜率曲线窗口 + 浮动棋谱记录窗口的五层架构,通过
WindowManager实现跨窗口光效联动与焦点感知 - HDS系统材质深度应用 :
systemMaterialEffect.IMMERSIVE为标题栏和导航组件带来物理光照级的光晕与反射效果,告别传统围棋软件的"古朴感"审美
未来扩展方向:
- 接入分布式软总线,实现手机拍照上传棋谱 → PC端智能分析 → 平板教学展示的无缝学棋流程
- 结合AI棋风预测:基于当前棋手风格,AI建议以光效形式在背景层呈现(如金色光晕表示推荐进攻型布局)
- 探索Face AR能力:通过摄像头捕捉棋手情绪状态,自动调节光效色温(紧张时切换为冷色调冷静模式)
- 插件化架构:支持第三方围棋数据库插件,让围棋社区贡献更多定式库与死活题
转载自:https://blog.csdn.net/u014727709/article/details/162349465
欢迎 👍点赞✍评论⭐收藏,欢迎指正