当前位置: 首页 > news >正文

开发HarmonyOS NEXT版五子棋游戏实战

大家好,我是 V 哥。首先要公布一个好消息,V 哥原创的《鸿蒙HarmonyOS NEXT 开发之路 卷1:ArkTS 语言篇》图书终于出版了,有正在学习鸿蒙的兄弟可以关注一下,写书真是磨人,耗时半年之久,感概一下,希望可以帮助到正在入门鸿蒙开发的小伙伴,一书在手 ArkTS无优。

今天要给大家分享一个 ArkTS小游戏的开发,五子棋游戏,通过这个小游戏的学习,可以帮助小伙伴们快速开发出自己的第一款纯血鸿蒙应用,先上图:

五子棋游戏介绍

1. 这个五子棋游戏包含以下功能:

  1. 使用15x15的标准棋盘
  2. 支持双人轮流下棋(黑棋先手)
  3. 自动判断胜负(任意方向五连即胜)
  4. 游戏结束提示
  5. 重新开始功能
  6. 触摸交互支持

2. 视觉反馈:

  1. 黑色棋子代表玩家1
  2. 白色棋子代表玩家2
  3. 棕色(#CBA)棋盘背景

3. 使用方法:

  1. 点击棋盘格子下棋
  2. 当一方达成五连时弹出胜利提示
  3. 点击"重新开始"按钮重置游戏

4. 游戏规则:

  1. 黑棋先手,白棋后手,轮流下棋
  2. 棋子只能下在空白处
  3. 率先在横、竖、斜任意方向形成五连者获胜
  4. 游戏结束后需要点击重新开始才能开始新游戏

5. 该代码使用了HarmonyOS的ArkUI框架,主要特性包括:

  1. 使用Grid布局实现棋盘
  2. @State管理游戏状态
  3. TouchTarget处理触摸事件
  4. AlertDialog显示胜利提示
  5. Flex布局实现整体界面
  6. 二维数组存储棋盘状态

注意: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。
  • 使用 ColumnRow 布局容器来排列元素。
  • 显示当前玩家或游戏结束信息。
  • 提供一个“重新开始”按钮,点击后调用 resetGame() 方法重置游戏。
  • 使用 ForEach 循环渲染棋盘,每个单元格是一个 Column,设置了宽度、高度、边框和背景颜色,并绑定了触摸事件。

4. 获取单元格颜色

  private getCellColor(value: number): ResourceColor {return value === 1 ? '#000' : value === 2 ? '#fff' : '#CBA'}
  • getCellColor 方法根据单元格的值返回相应的颜色:
    • 1(黑棋)返回黑色 (#000)
    • 2(白棋)返回白色 (#fff)
    • 0(空位)返回浅灰色 (#CBA)

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)。
    • 设置 gameOverfalse,表示游戏未结束。

最后小结

这段代码实现了一个完整的五子棋游戏,包括棋盘绘制、玩家交互、胜负判断和游戏重置功能。通过理解每个部分的功能,你可以更好地掌握如何使用ArkTS开发类似的游戏应用。最后需要游戏源码的伙伴,可以到 Gitee 下载,V 哥已经把源代码上传到 Gitee(https://gitee.com/wgjava/GobangGame),欢迎一起交流鸿蒙原生开发。关注威哥爱编程,鸿蒙开发共前行。

相关文章:

开发HarmonyOS NEXT版五子棋游戏实战

大家好&#xff0c;我是 V 哥。首先要公布一个好消息&#xff0c;V 哥原创的《鸿蒙HarmonyOS NEXT 开发之路 卷1&#xff1a;ArkTS 语言篇》图书终于出版了&#xff0c;有正在学习鸿蒙的兄弟可以关注一下&#xff0c;写书真是磨人&#xff0c;耗时半年之久&#xff0c;感概一下…...

AI革命下的多元生态:DeepSeek、ChatGPT、XAI、文心一言与通义千问的行业渗透与场景重构

前言 人工智能技术的爆发式发展催生了多样化的AI模型生态&#xff0c;从通用对话到垂直领域应用&#xff0c;从数据挖掘到创意生成&#xff0c;各模型凭借其独特的技术优势与场景适配性&#xff0c;正在重塑全球产业格局。本文将以DeepSeek、ChatGPT、XAI&#xff08;可解释人…...

大语言模型(LLM)微调技术笔记

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

六十天前端强化训练之第一天HTML5语义化标签深度解析与博客搭建实战

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

NLP的预处理数据

处理文本数据的主要工具是Tokenizer。Tokenizer根据一组规则将文本拆分为tokens。然后将这些tokens转换为数字&#xff0c;然后转换为张量&#xff0c;成为模型的输入。模型所需的任何附加输入都由Tokenizer添加。 如果您计划使用预训练模型&#xff0c;重要的是使用与之关联的…...

【DeepSeek问答】QProcess::start是异步的吗?会使UI卡顿吗?

好的&#xff0c;我现在需要回答用户关于QProcess::start是否是异步的&#xff0c;以及它是否会导致UI卡顿的问题。用户之前已经询问过如何开发一个调用7-Zip的Qt应用&#xff0c;并且我给出了示例代码。现在用户可能在使用过程中遇到了问题&#xff0c;或者想更深入了解QProce…...

【Java项目】基于Spring Boot的体质测试数据分析及可视化设计

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

JAVA-如何理解Mysql的索引

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

VUE向外暴露文件,并通过本地接口调用获取,前端自己生成接口获取public目录里面的文件

VUE中&#xff0c;如果我们想对外暴露一个文件&#xff0c;可以在打包之后也能事实对其进行替换&#xff0c;我们只需要把相关文件放置在public目录下即可&#xff0c;可以放置JSON&#xff0c;Excel等文件 比如我在这里放置一个other文件 我们可以直接在VUE中使用axios去获取…...

京准电钟:NTP精密时钟服务器在自动化系统中的作用

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

CSDN年度评选揭晓,永洪科技AI技术与智能应用双星闪耀

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

vscode settings(二):文件资源管理器编辑功能主题快捷键

参考资料 Visual Studio Code权威指南 by 韩骏 一. 文件资源管理器 1.1 文件资源管理器隐藏文件夹 默认情况下&#xff0c;Visual Studio Code会在文件资源管理器中隐藏一些文件夹&#xff08;如.git文件夹&#xff09;​。可以通过files.exclude来配置要被隐藏的文件和文件…...

Ubuntu本地使用AnythingLLM

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

MybatisPlus-注解

TableName设定表名 1. MyBatis-Plus在确定操作的表时&#xff0c;由BaseMapper的泛型决定&#xff0c;即实体类型决 定&#xff0c;且默认操作的表名和实体类型的类名一致 2. 若实体类类型的类名和要操作的表的表名不一致&#xff0c;访问数据库表将会报错 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中可以通过黑名单、白名单机制进行节点管理&#xff0c;决定数据可以复制/不可以复制到哪些节点。 黑名单通常是指在HDFS中被标记为不可用或不可访问的节点列表&#xff0c;这些节点可能由于硬件故障、网络问题或其他原因而暂时或永久性地无法使用。当一…...

【2025信息安全软考重点考点归纳】实时更新

重点页:第14章 恶意代码防范技术原理 页码&#xff1a;271 病毒载体及其对应案例 病毒隐秘载体病毒案例Word文档Melissa照片库尔尼科娃电子邮件“求职信”病毒网页NIMDA病毒 重点页&#xff1a;第6章 认证技术原理与应用 页码&#xff1a;125 Kerberos 认证技术 Kerberos是…...

在生产环境中部署和管理 PostgreSQL:实战经验与最佳实践

在生产环境中部署和管理 PostgreSQL:实战经验与最佳实践 大家好,我是Echo_Wish。今天我们来聊一聊如何在生产环境中部署和管理 PostgreSQL。作为一种广泛使用的开源数据库,PostgreSQL 因其强大的功能和灵活性,成为许多开发者和运维人员的首选数据库。无论是在小型应用还是…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...