OpenHarmony分布式五子棋-使用Canvas组件 实现棋盘、棋子的绘制

567 篇文章 5 订阅
555 篇文章 0 订阅

介绍

五子棋是一款比较流行的棋类游戏,此游戏使用分布式数据管理功能开发完成的。

本示例使用Canvas组件 实现棋盘、棋子的绘制,使用分布式数据管理 实现两台设备间数据的同步。

本示例使用分布式设备管理能力接口@ohos.distributedDeviceManager。

分布式数据管理接口@ohos.data.distributedData。

效果预览

首页

使用说明:

1.启动应用,同一个网络下两台设备都确认权限后,一台设备退出。点击右上角流转按钮,选择需要拉起的远程设备,点击后拉起远程设备,第一次拉起设备时,若未进行认证,输入认证码进行认证,认证成功后拉起远程设备。

2.游戏过程中,本地设备的用户可以重开,悔棋,远程设备无此功能。下子时,在棋盘某位置点击第一次时预下子,若确定下在该位置,继续点击该位置,若不确定,点击其他位置即可。若远程设备因特殊原因退出或者掉线,本地设备可重新拉起远程设备,拉起后,本地设备点击棋盘任意位置,数据会同步到远程设备,继续进行未完成的游戏。

工程目录

entry/src/main/ets/
|---pages
|   |---index.ets                           // 五子棋首页
|   |---DeviceDialog.ets                    // 选择设备模块
|   |---TitleBar.ets                        // 标题导航栏
|---model                                  
|   |---DistributedDataModel.ts             // 分布式数据模块
|   |---KvStoreModel.ts                     // KvStore数据模块
|   |---RemoteDeviceModel.ts                // 管理分布式设备模块
|---util                                    
|   |---GobangConst.ts                      // 定义游戏用到的初始值                                                          

具体实现

  • 管理分布式设备(节点)
    1、创建设备管理对象,并指定参数kvstore应用包deviceManager.createDeviceManager("ohos.samples.distributeddatagobang", (error, value) => {})
    2、获取可信设备列表"this.deviceManager.getTrustedDeviceListSync()"。
    3、监听设备状态"this.deviceManager.on('deviceStateChange', (data) => {})"。
  • 分布式数据管理
    1、页面初始化时获取此应用所需能力,引入@ohos.data.distributedData初始化分布式数据库,并使用kvstore.on对数据change进行监听,通过appstorge判断获取相应的key判断是否是分布式节点。
    2、如果是分布式节点,如果数据发生变化处理数据,使用this.kvManager.getKVStore()通过指定Options和storeId,创建并获取KVStore数据库。以及添加键值对到数据库this.kvStore.put(key, value) 
    3、页面通过kvStore对象进行增删改查会触发其他已连接设备的kvStore.on监听。
  • 游戏规则编写
    1、init()函数初始化游戏规则,通过canvas组件绘制棋盘背景和棋子,游戏状态为开始,共计回合为0,并生成棋盘。源码参考 2、触发onClick函数,每click一次,清除一次canvas,数组中添加当前棋子,重绘。 3、当在A盘,且步长是偶数,表示B下的棋子会在A盘显示,绘制确定好的棋子,例如:this.deviceFlag === 'A' && this.distributedData.step % 2 === 0; 4、当在B盘,且步长是奇数,表示A下的棋子会在B盘显示,绘制确定好的棋子,例如:this.deviceFlag === 'B' && this.distributedData.step % 2 !== 0; 5、如果A盘重开(isRestart=true),那B盘就要清空棋子;不重开(isRestart=false)时,B盘正常显示。

相关权限

允许不同设备间的数据交换:ohos.permission.DISTRIBUTED_DATASYNC

允许系统应用获取分布式设备的认证组网能力:ohos.permission.ACCESS_SERVICE_DM

依赖

不涉及。

约束与限制

1.本示例仅支持标准系统上运行,支持设备:RK3568。

2.本示例为Stage模型,支持API10版本SDK,SDK版本号(API Version 10 Release),镜像版本号(4.0 Release)。

3.本示例需要使用DevEco Studio 版本号(4.0 Release)及以上版本才可编译运行。

4.本示例需要使用@ohos.distributedDeviceManager系统权限的系统接口。使用Full SDK时需要手动从镜像站点获取,并在DevEco Studio中替换,具体操作可参考替换指南 。

下载

如需单独下载本工程,执行如下命令:

git init
git config core.sparsecheckout true
echo code/Solutions/Game/DistributedDataGobang/ > .git/info/sparse-checkout
git remote add origin https://gitee.com/openharmony/applications_app_samples.git
git pull origin master

为了帮助大家更深入有效的学习到鸿蒙开发知识点,小编特意给大家准备了一份全套最新版的HarmonyOS NEXT学习资源,获取完整版方式请点击→《HarmonyOS教学视频

HarmonyOS教学视频:语法ArkTS、TypeScript、ArkUI等…视频教程

鸿蒙生态应用开发白皮书V2.0PDF:

获取完整版白皮书方式请点击→《鸿蒙生态应用开发白皮书V2.0PDF (qq.com)

在这里插入图片描述

鸿蒙 (Harmony OS)开发学习手册

一、入门必看

  1. 应用开发导读(ArkTS)
  2. .……

在这里插入图片描述


二、HarmonyOS 概念

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

在这里插入图片描述

三、如何快速入门?

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. .……

在这里插入图片描述


四、开发基础知识

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. .……

在这里插入图片描述


五、基于ArkTS 开发

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 7.网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. .……

在这里插入图片描述


更多了解更多鸿蒙开发的相关知识可以参考:《鸿蒙 (Harmony OS)开发学习手册 (qq.com)

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在uni-app中使用canvas实现五子棋可以按照以下步骤进行: 1. 创建canvas组件 在需要使用canvas的页面中,添加一个canvas组件: ```html <canvas class="chessboard" canvas-id="canvas"></canvas> ``` 2. 获取canvas上下文 在页面的`onLoad`生命周期函数中,获取canvas的上下文: ```js onLoad() { // 获取canvas上下文 this.ctx = uni.createCanvasContext('canvas', this); } ``` 3. 绘制棋盘 绘制棋盘可以使用`ctx`的绘图API,例如`ctx.beginPath()`、`ctx.moveTo()`、`ctx.lineTo()`等。具体的绘制方法可以参考以下代码: ```js drawChessboard() { const cellWidth = this.data.cellWidth; const boardWidth = this.data.boardWidth; const rows = this.data.rows; const cols = this.data.cols; const margin = this.data.margin; // 绘制棋盘背景 this.ctx.fillStyle = '#D1B18F'; this.ctx.fillRect(0, 0, boardWidth, boardWidth); // 绘制棋盘格线 this.ctx.beginPath(); for (let i = 0; i < rows; i++) { this.ctx.moveTo(margin + cellWidth / 2, margin + i * cellWidth + cellWidth / 2); this.ctx.lineTo(boardWidth - margin - cellWidth / 2, margin + i * cellWidth + cellWidth / 2); } for (let i = 0; i < cols; i++) { this.ctx.moveTo(margin + i * cellWidth + cellWidth / 2, margin + cellWidth / 2); this.ctx.lineTo(margin + i * cellWidth + cellWidth / 2, boardWidth - margin - cellWidth / 2); } this.ctx.stroke(); } ``` 4. 绘制棋子 绘制棋子可以使用`ctx.arc()`和`ctx.fill()`方法实现。具体的绘制方法可以参考以下代码: ```js drawChess(x, y, color) { const cellWidth = this.data.cellWidth; const margin = this.data.margin; const radius = cellWidth / 2 - margin; // 计算棋子的坐标 const cx = margin + x * cellWidth; const cy = margin + y * cellWidth; // 绘制棋子 this.ctx.beginPath(); this.ctx.arc(cx, cy, radius, 0, 2 * Math.PI); this.ctx.fillStyle = color; this.ctx.fill(); } ``` 5. 绑定事件 在canvas上绑定事件可以使用`canvas`组件的`@touchstart`、`@touchmove`、`@touchend`等事件。具体的绑定方法可以参考以下代码: ```html <canvas class="chessboard" canvas-id="canvas" @touchstart="onTouchStart" @touchmove="onTouchMove" @touchend="onTouchEnd" ></canvas> ``` 6. 实现游戏逻辑 实现五子棋的游戏逻辑可以在页面的`methods`中进行。例如,判断胜负可以使用一个二维数组来记录棋盘上的棋子,然后通过遍历该数组来判断是否存在连成五个的棋子。具体的实现方法可以参考以下代码: ```js data() { return { // 棋盘格子的宽度 cellWidth: 30, // 棋盘的行数和列数 rows: 15, cols: 15, // 棋盘的宽度 boardWidth: 450, // 棋盘的边缘空白区域 margin: 15, // 棋子的颜色 chessColor: ['white', 'black'], // 当前下棋的玩家 currentPlayer: 0, // 棋盘上的棋子 chessboard: [], // 是否游戏结束 gameOver: false, }; }, onLoad() { this.ctx = uni.createCanvasContext('canvas', this); this.initChessboard(); this.drawChessboard(); }, initChessboard() { // 初始化棋盘 for (let i = 0; i < this.rows; i++) { this.chessboard[i] = []; for (let j = 0; j < this.cols; j++) { this.chessboard[i][j] = -1; } } }, onTouchStart(e) { // 获取触摸点的坐标 const x = e.touches[0].x; const y = e.touches[0].y; // 计算在棋盘中的位置 const i = Math.floor((y - this.data.margin) / this.data.cellWidth); const j = Math.floor((x - this.data.margin) / this.data.cellWidth); // 判断该位置是否为空 if (this.chessboard[i][j] === -1 && !this.gameOver) { // 绘制棋子 this.drawChess(j, i, this.chessColor[this.currentPlayer]); // 记录棋子 this.chessboard[i][j] = this.currentPlayer; // 判断是否胜利 if (this.checkWin(i, j, this.currentPlayer)) { this.gameOver = true; uni.showToast({ title: `玩家${this.currentPlayer + 1}胜利`, icon: 'none' }); return; } // 切换玩家 this.currentPlayer = 1 - this.currentPlayer; } }, checkWin(row, col, player) { const dirs = [[-1, 0], [1, 0], [0, -1], [0, 1], [-1, -1], [1, 1], [-1, 1], [1, -1]]; for (let i = 0; i < dirs.length; i++) { let count = 1; const dx = dirs[i][0]; const dy = dirs[i][1]; for (let j = 1; j < 5; j++) { const x = row + j * dx; const y = col + j * dy; if (x < 0 || x >= this.rows || y < 0 || y >= this.cols || this.chessboard[x][y] !== player) { break; } count++; } if (count === 5) { return true; } } return false; }, ``` 以上就是在uni-app中使用canvas实现五子棋的步骤,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值