开发HarmonyOS NEXT版五子棋游戏实战
大家好,我是 V 哥。首先要公布一个好消息,V 哥原创的《鸿蒙HarmonyOS NEXT 开发之路 卷1:ArkTS 语言篇》图书终于出版了,有正在学习鸿蒙的兄弟可以关注一下,写书真是磨人,耗时半年之久,感概一下,希望可以帮助到正在入门鸿蒙开发的小伙伴,一书在手 ArkTS无优。
今天要给大家分享一个 ArkTS小游戏的开发,五子棋游戏,通过这个小游戏的学习,可以帮助小伙伴们快速开发出自己的第一款纯血鸿蒙应用,先上图:
五子棋游戏介绍
1. 这个五子棋游戏包含以下功能:
- 使用15x15的标准棋盘
- 支持双人轮流下棋(黑棋先手)
- 自动判断胜负(任意方向五连即胜)
- 游戏结束提示
- 重新开始功能
- 触摸交互支持
2. 视觉反馈:
- 黑色棋子代表玩家1
- 白色棋子代表玩家2
- 棕色(#CBA)棋盘背景
3. 使用方法:
- 点击棋盘格子下棋
- 当一方达成五连时弹出胜利提示
- 点击"重新开始"按钮重置游戏
4. 游戏规则:
- 黑棋先手,白棋后手,轮流下棋
- 棋子只能下在空白处
- 率先在横、竖、斜任意方向形成五连者获胜
- 游戏结束后需要点击重新开始才能开始新游戏
5. 该代码使用了HarmonyOS的ArkUI框架,主要特性包括:
- 使用Grid布局实现棋盘
- @State管理游戏状态
- TouchTarget处理触摸事件
- AlertDialog显示胜利提示
- Flex布局实现整体界面
- 二维数组存储棋盘状态
注意:V哥在测试时使用的是模拟器,在真实设备运行时可能需要根据屏幕尺寸调整单元格大小(修改.width(30)和.height(30)的数值)以获得最佳显示效果。
下面是详细代码实现及解释,按照以下思路即可完美实现。
五子棋游戏代码分析
这段代码实现了一个简单的五子棋游戏,使用了ArkTS(Ark TypeScript)语言。下面我将详细解释每个部分的功能,帮助你理解代码。
1. 导入和声明
@Entry
@Component
struct GobangGame {
@Entry
和@Component
是装饰器,用于标记这是一个页面组件。struct GobangGame
定义了一个名为GobangGame
的结构体,表示五子棋游戏的主界面。
2. 状态变量
@State board: number[][] = Array(15).fill(null).map(() => Array(15).fill(0))@State currentPlayer: number = 1 // 1: 黑棋, 2: 白棋@State gameOver: boolean = false
@State
表示这些变量是可变的状态。board
是一个15x15的二维数组,表示棋盘,初始值为0(空位),1表示黑棋,2表示白棋。currentPlayer
表示当前玩家,1为黑棋,2为白棋。gameOver
表示游戏是否结束。
3. 构建UI
build() {Column() {// 游戏标题Text(this.gameOver ? '游戏结束' : `当前玩家: ${this.currentPlayer === 1 ? '黑棋' : '白棋'}`).fontSize(20).margin(10)// 重新开始按钮Button('重新开始').onClick(() => this.resetGame()).margin(5)// 棋盘Column() {ForEach(this.board, (row: number[], rowIndex: number) => {Row() {ForEach(row, (cell: number, colIndex: number) => {Column().width(30).height(30).border({ width: 1, color: '#999' }).backgroundColor(this.getCellColor(cell)).onTouch((event: TouchEvent) => {if (event.type === TouchType.Down) {this.handleClick(rowIndex, colIndex)}})}, (colIndex: number) => colIndex.toString())}}, (rowIndex: number) => rowIndex.toString())}.margin(10)}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
build()
方法用于构建页面的UI。- 使用
Column
和Row
布局容器来排列元素。 - 显示当前玩家或游戏结束信息。
- 提供一个“重新开始”按钮,点击后调用
resetGame()
方法重置游戏。 - 使用
ForEach
循环渲染棋盘,每个单元格是一个Column
,设置了宽度、高度、边框和背景颜色,并绑定了触摸事件。
4. 获取单元格颜色
private getCellColor(value: number): ResourceColor {return value === 1 ? '#000' : value === 2 ? '#fff' : '#CBA'}
getCellColor
方法根据单元格的值返回相应的颜色:- 1(黑棋)返回黑色 (
#000
) - 2(白棋)返回白色 (
#fff
) - 0(空位)返回浅灰色 (
#CBA
)
- 1(黑棋)返回黑色 (
5. 处理点击事件
private handleClick(row: number, col: number) {if (this.gameOver || this.board[row][col] !== 0) returnlet newBoard = [...this.board]newBoard[row][col] = this.currentPlayerthis.board = newBoardif (this.checkWin(row, col)) {this.gameOver = trueAlertDialog.show({ message: `${this.currentPlayer === 1 ? '黑棋' : '白棋'}获胜!` })} else {this.currentPlayer = this.currentPlayer === 1 ? 2 : 1}}
handleClick
方法处理玩家点击棋盘的动作:- 如果游戏已经结束或该位置已有棋子,则不处理。
- 否则,在指定位置放置当前玩家的棋子。
- 检查是否有玩家获胜,如果有则显示胜利提示并结束游戏。
- 否则切换到下一个玩家。
6. 检查胜利条件
private checkWin(row: number, col: number): boolean {const directions = [[[-1, 0], [1, 0]], // 垂直[[0, -1], [0, 1]], // 水平[[-1, -1], [1, 1]], // 主对角线[[-1, 1], [1, -1]] // 副对角线]for (let direction of directions) {let count = 1for (let i = 0; i < direction.length; i++) {let dx = direction[i][0]let dy = direction[i][1]let x = row + dxlet y = col + dywhile (x >= 0 && x < 15 && y >= 0 && y < 15 &&this.board[x][y] === this.currentPlayer) {count++x += dxy += dy}}if (count >= 5) return true}return false}
checkWin
方法检查当前玩家是否在某个方向上连成五子:- 定义了四个方向:垂直、水平、主对角线和副对角线。
- 对每个方向进行检查,统计连续相同棋子的数量。
- 如果任意方向上有五个或更多相同的棋子,则返回
true
,表示当前玩家获胜。
7. 重置游戏
private resetGame() {this.board = Array(15).fill(null).map(() => Array(15).fill(0))this.currentPlayer = 1this.gameOver = false}
resetGame
方法重置游戏状态:- 清空棋盘。
- 将当前玩家设置为黑棋(1)。
- 设置
gameOver
为false
,表示游戏未结束。
最后小结
这段代码实现了一个完整的五子棋游戏,包括棋盘绘制、玩家交互、胜负判断和游戏重置功能。通过理解每个部分的功能,你可以更好地掌握如何使用ArkTS开发类似的游戏应用。最后需要游戏源码的伙伴,可以到 Gitee 下载,V 哥已经把源代码上传到 Gitee(https://gitee.com/wgjava/GobangGame),欢迎一起交流鸿蒙原生开发。关注威哥爱编程,鸿蒙开发共前行。
相关文章:

开发HarmonyOS NEXT版五子棋游戏实战
大家好,我是 V 哥。首先要公布一个好消息,V 哥原创的《鸿蒙HarmonyOS NEXT 开发之路 卷1:ArkTS 语言篇》图书终于出版了,有正在学习鸿蒙的兄弟可以关注一下,写书真是磨人,耗时半年之久,感概一下…...
AI革命下的多元生态:DeepSeek、ChatGPT、XAI、文心一言与通义千问的行业渗透与场景重构
前言 人工智能技术的爆发式发展催生了多样化的AI模型生态,从通用对话到垂直领域应用,从数据挖掘到创意生成,各模型凭借其独特的技术优势与场景适配性,正在重塑全球产业格局。本文将以DeepSeek、ChatGPT、XAI(可解释人…...

大语言模型(LLM)微调技术笔记
图1:大模型进化树2 大模型微调 在预训练后,大模型可以获得解决各种任务的通用能力。然而,越来越多的研究表明,大语言模型的能力可以根据特定目标进一步调整。 这就是微调技术,目前主要有两种微调大模型的方法1&…...

六十天前端强化训练之第一天HTML5语义化标签深度解析与博客搭建实战
欢迎来到编程星辰海的博客讲解 目录 一、语义化标签的核心价值 1.1 什么是语义化? 1.2 核心优势 二、语义标签详解与使用场景 2.1 布局容器标签 2.2 内容组织标签 三、博客结构搭建实战 3.1 完整HTML结构 3.2 核心结构解析 3.3 实现效果说明 四、学习要点…...

NLP的预处理数据
处理文本数据的主要工具是Tokenizer。Tokenizer根据一组规则将文本拆分为tokens。然后将这些tokens转换为数字,然后转换为张量,成为模型的输入。模型所需的任何附加输入都由Tokenizer添加。 如果您计划使用预训练模型,重要的是使用与之关联的…...
【DeepSeek问答】QProcess::start是异步的吗?会使UI卡顿吗?
好的,我现在需要回答用户关于QProcess::start是否是异步的,以及它是否会导致UI卡顿的问题。用户之前已经询问过如何开发一个调用7-Zip的Qt应用,并且我给出了示例代码。现在用户可能在使用过程中遇到了问题,或者想更深入了解QProce…...

【Java项目】基于Spring Boot的体质测试数据分析及可视化设计
【Java项目】基于Spring Boot的体质测试数据分析及可视化设计 技术简介:采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介:体质测试数据分析及可视化设计是一个基于Web的在线平台,主要分为前台和后台两大功能模块。前台功能模…...

JAVA-如何理解Mysql的索引
一、索引的概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用(指针/地址)。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现。 二、索引是什么,用来干嘛 数据库中的表、数据、索引之间的…...

VUE向外暴露文件,并通过本地接口调用获取,前端自己生成接口获取public目录里面的文件
VUE中,如果我们想对外暴露一个文件,可以在打包之后也能事实对其进行替换,我们只需要把相关文件放置在public目录下即可,可以放置JSON,Excel等文件 比如我在这里放置一个other文件 我们可以直接在VUE中使用axios去获取…...

京准电钟:NTP精密时钟服务器在自动化系统中的作用
京准电钟:NTP精密时钟服务器在自动化系统中的作用 京准电钟:NTP精密时钟服务器在自动化系统中的作用 NTP精密时钟服务器在自动化系统中的作用非常重要,特别是在需要高精度时间同步的场景中。NTP能够提供毫秒级的时间同步精度,这…...

CSDN年度评选揭晓,永洪科技AI技术与智能应用双星闪耀
近日,永洪科技在CSDN(中国专业开发者社区)的年度评选中,凭借在人工智能技术创新与vividime在行业应用中的卓越表现,一举斩获“人工智能企业”及“智能应用”双料大奖。这一荣誉不仅彰显了永洪科技在AI领域的领先地位&a…...

vscode settings(二):文件资源管理器编辑功能主题快捷键
参考资料 Visual Studio Code权威指南 by 韩骏 一. 文件资源管理器 1.1 文件资源管理器隐藏文件夹 默认情况下,Visual Studio Code会在文件资源管理器中隐藏一些文件夹(如.git文件夹)。可以通过files.exclude来配置要被隐藏的文件和文件…...

Ubuntu本地使用AnythingLLM
1.介绍 AnythingLLM是一个全栈应用程序,由Mintplex Labs Inc.开发,旨在将任何文档、资源或内容片段转换为大语言模型(LLM)在聊天中可以利用的相关上下文。 2.在ubuntu本地安装 打开终端并运行: curl -fsSL https:/…...

MybatisPlus-注解
TableName设定表名 1. MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决 定,且默认操作的表名和实体类型的类名一致 2. 若实体类类型的类名和要操作的表的表名不一致,访问数据库表将会报错 3. 在实体类上添加…...

【多模态大模型学习】位置编码的学习记录
【多模态大模型学习】位置编码的学习记录 0.前言1. sinusoidal编码1.0 数学知识——复数1.0.1 复数乘法、共轭复数1.0.2 复数的指数表示 1.1 sinusoidal编码来历1.2 代码实现 2. Rotary Positional Embedding (RoPE) ——旋转位置编码2.1 RoPE来历2.2 代码实现2.2.1 GPT-J风格的…...

在MAC上面通过HomeBrew安装node和npm@指定版本
文章目录 搜索可用的 Node.js 版本安装指定版本的 Node.js将 node22 添加到 PATH验证安装是否成功给npm配置淘宝镜像 搜索可用的 Node.js 版本 liujinglong192 ~ % brew search node > Formulae libbitcoin-node node-build node20 nodeenv linod…...

基于YOLO11深度学习的医学X光骨折检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

HDFS扩缩容及数据迁移
1.黑白名单机制 在HDFS中可以通过黑名单、白名单机制进行节点管理,决定数据可以复制/不可以复制到哪些节点。 黑名单通常是指在HDFS中被标记为不可用或不可访问的节点列表,这些节点可能由于硬件故障、网络问题或其他原因而暂时或永久性地无法使用。当一…...
【2025信息安全软考重点考点归纳】实时更新
重点页:第14章 恶意代码防范技术原理 页码:271 病毒载体及其对应案例 病毒隐秘载体病毒案例Word文档Melissa照片库尔尼科娃电子邮件“求职信”病毒网页NIMDA病毒 重点页:第6章 认证技术原理与应用 页码:125 Kerberos 认证技术 Kerberos是…...
在生产环境中部署和管理 PostgreSQL:实战经验与最佳实践
在生产环境中部署和管理 PostgreSQL:实战经验与最佳实践 大家好,我是Echo_Wish。今天我们来聊一聊如何在生产环境中部署和管理 PostgreSQL。作为一种广泛使用的开源数据库,PostgreSQL 因其强大的功能和灵活性,成为许多开发者和运维人员的首选数据库。无论是在小型应用还是…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...