游戏规则
本文章中分享了我的鸿蒙移动应用开发课程的期末大作业——2048小游戏,它是我在学习了这一学期的课程之后利用方舟开发框架(简称ArkUI开发框架)所做的一些UI开发成果。本项目通使用DevEco Studio,在移动设备上完成的项目编译。此次项目以手机为例,目标是开发一个比较完整的游戏应用(仅为完成大作业所用)
一共16个单元格,初始时由2或者4构成。
1、手指向一个方向滑动,所有格子会向那个方向运动。
2、相同数字的两个格子,相遇时数字会相加。
3、每次滑动时,空白处会随机出现一个数字。
4、当所有单元格都不可移动时,游戏结束;当界面中最大数字是2048时,游戏胜利
程序中代码注释
主要包含三个包:model、pages以及util
model 包:该包包含应用程序中使用的数据模型,比如说网络请求返回的数据模型、本地存储的数据模型等。这些数据模型用于传递数据,使得应用程序中各个组件之间的数据传递变得更加简单和可靠。
pages 包:该包包含了应用程序中所有的 Activity、Fragment 等 UI 组件。这些组件被组织成不同的模块(module),每个模块都包含了一组相关的 UI 组件。例如,一个包含登录、注册等页面的模块可以被命名为 auth。
util 包:该包包含了应用程序中常用的工具类和辅助函数。例如,日期时间格式化、网络连接状态检查、字符串处理等。这些工具类和辅助函数可以减少代码的冗余,提高代码的可读性和可维护性。
应用中的主要代码解释:
cellArr: number[ ][ ]: 一个二维数组,用于存储游戏单元格的数字。每个单元格可以存储一个数字,数字可以是2或4。
isGameOver: boolean: 表示游戏是否结束。
init(cellArr: number[]): void: 初始化游戏,将一个一维数组转换为二维数组,并生成两个随机数字填充到单元格中。
fillOneEmptyCell(): void: 找到一个空单元格,生成一个随机数字填充到该单元格中。
findOneEmptyCell(): number: 找到一个空单元格的索引。
getRandomValue(): number: 生成随机数字,90%几率生成2,10%几率生成4。
randomVal(): 生成一个随机整数,范围在0(包括)和 max(不包括)之间。
canMove(): boolean: 判断游戏是否可以继续移动,依次检查每个单元格是否为空、是否和右侧单元格相等、是否和下方单元格相等。
horizontalMoveCells(toLeft: boolean): void: 将单元格向左或向右移动,移除0并对相邻相同数进行叠加。
verticalMoveCells(toUp: boolean): void: 将单元格向上或向下移动,移除0并对相邻相同数进行叠加。toUp表示是否是向上
removeZerosAndAdd(arr: number[], toHead: boolean): number[]: 压缩数组并对相邻相同的数进行叠加。
moveUp(): void: 向上移动单元格。
moveDown(): void: 向下移动单元格。
moveLeft(): void: 向左移动单元格。
moveRight(): void: 向右移动单元格。
checkGameOverOrContinue(): void: 检查游戏是否结束,如果可以继续移动,生成一个新数字填充到单元格中,否则标记游戏结束。
getFlatCellArr(): number[]: 将二维数组转换为一维数组。
在数据资源文件中,首先我们定义了一个 GameDataSource 类,实现了 IDataSource 接口的方法。该类有一个 dataArray 属性,用于存储字符串数组类型的数据。constructor 方法接收一个参数 ele,并通过循环将其内容推入 dataArray 数组中。totalCount 方法返回 dataArray 数组的长度,即数据总数。getData 方法接收一个数字类型的参数 index,并返回 dataArray 数组中索引为 index 的元素。registerDataChangeListener 和 unregisterDataChangeListener 方法在接口中定义,但在该类中并未实现任何功能。
通过这段代码,我们实现了一个数据源类,可以用于获取、存储和管理数据。如果需要在数据源中添加数据监听器,可以通过实现 IDataSource 接口来实现该功能。