You need to enable JavaScript to run this app. QML与C++开发五子棋:C++类联动控制QML棋盘对象状态
优惠活动
大模型
产品
解决方案
定价
更多

QML与C++开发五子棋:C++类联动控制QML棋盘对象状态

QML+C++五子棋电脑自动落子实现方案
  • 实现电脑自动落子完全不需要模拟点击QML的鼠标事件,只需要把棋盘状态和视图做解耦:所有落子状态由C++侧统一管控,QML仅做显示绑定,就能直接通过修改数据完成任意位置的状态更新
  • 重构现有棋盘状态存储逻辑
    当前代码把落子状态分散存在每个QML单元格的Rectangle可见属性里,既无法快速定位所有空点,也无法从全局直接修改指定位置的状态,这就是没法自动落子的核心原因。需要在C++侧实现继承自QAbstractListModel的棋盘数据模型,为10*10棋盘的100个格子定义3个可被QML访问的角色:
    • isEmpty:标记当前格子是否为空
    • humanPlaced:标记当前格子是否为人类玩家的红棋
    • aiPlaced:标记当前格子是否为电脑玩家的黑棋
  • 改造QML侧的单元格绑定关系
    把Repeater的model直接绑定C++侧导出的棋盘模型,将两个棋子矩形的可见属性从硬编码的信号赋值改成绑定模型角色,同时把人类点击的逻辑收敛为调用模型的落子接口,核心改造代码如下:
    Grid {
        x: 10; y: 10
        width: 418
        height: 418
        rows: 10; columns: 10; spacing: 2
    
        Repeater { 
            model: gBoardModel // 从C++注册到QML上下文的棋盘模型对象
            Rectangle { 
                width: 40; height: 40
                color: "white"
    
                // 人类玩家红棋显示
                Rectangle {
                    visible: model.humanPlaced
                    radius: width * 0.5
                    anchors.fill: parent
                    anchors.margins: 5
                    color: "red"
                }
                // 电脑玩家黑棋显示
                Rectangle {
                    visible: model.aiPlaced
                    radius: width * 0.5
                    anchors.fill: parent
                    anchors.margins: 5
                    color: "black"
                }
    
                MouseArea{
                    anchors.fill: parent
                    enabled: model.isEmpty && gGameState.isHumanTurn // 仅空格、人类回合可响应点击
                    TapHandler{
                        onTapped: gBoardModel.placeHumanChess(index)
                    }
                }
            }
        }
    }
    
  • 电脑回合的自动更新流程
    C++侧的模型在收到人类落子的调用后,按顺序执行流程即可完成自动落子更新:
    1. 先更新对应格子的状态:将目标格的isEmpty设为false、humanPlaced设为true,触发dataChanged信号通知QML刷新视图
    2. 执行全局胜负判定:如果人类落子后形成五连,直接更新游戏状态为人类胜利,跳过AI流程
    3. 运行预设的AI落子逻辑(初期可直接从所有空格里随机选一个落点,后续再升级为带位置评分的搜索算法),得到电脑落子的目标索引
    4. 延迟300-500ms模拟AI思考间隔,更新目标索引对应格子的状态:将isEmpty设为false、aiPlaced设为true,再次触发dataChanged信号,QML会自动在对应位置显示黑棋
  • 避坑提示
    不要为了触发落子特意模拟MouseArea的点击事件,这种强耦合的实现很容易出现状态不一致的bug。坚持数据驱动视图的原则,所有显示逻辑跟着模型的属性值走,不需要手动操作QML组件的内部状态。

内容的提问来源于stack exchange,提问作者Md Sabbir Hossain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.07 00:24:05