在鸿蒙NEXT中开发一个2048小游戏
本项目是基于api12开发的2048游戏,游戏的逻辑是当用户向某个方向滑动时,将该方向相邻且相等的数字相加,同时在空白区域的随机位置生成一个随机数字。游戏中的数字越大,分数越高。

首先,游戏的界面布局分别采用两个网格组件Grid来实现,难点在于上方的菜单栏是不均等的三种尺寸的组件,可以使用Grid的rowsTemplate和columnsTemplate属性来实现:

Grid(){
GridItem(){
Column(){
Text('2048')
.fontColor('rgb(249,249,249)')
.fontSize(35)
.fontWeight(FontWeight.Bold)
Text('4*4')
.fontColor('rgb(249,249,249)')
.fontSize(22)
.fontWeight(FontWeight.Bold)
}
}
.backgroundColor('rgb(239,202,26)')
.borderRadius(10)
.rowStart(1)
.rowEnd(2)
GridItem(){
Column(){
Text('分数')
.fontColor('rgb(232,232,232)')
.fontSize(15)
.fontWeight(FontWeight.Bold)
Text(this.currentScore.toString())
.fontColor('rgb(249,249,249)')
.fontSize(25)
.fontWeight(FontWeight.Bold)
.margin({top:3})
}
}
.backgroundColor('rgb(188,172,162)')
.borderRadius(10)
GridItem(){
Column(){
Text('最高分')
.fontColor('rgb(232,232,232)')
.fontSize(15)
.fontWeight(FontWeight.Bold)
Text(this.highestScore.toString())
.fontColor('rgb(249,249,249)')
.fontSize(25)
.fontWeight(FontWeight.Bold)
.margin({top:3})
}
}
.backgroundColor('rgb(188,172,162)')
.borderRadius(10)
GridItem(){
Text('重新开始')
.fontColor('rgb(249,249,249)')
.fontSize(20)
.fontWeight(FontWeight.Bold)
}
.backgroundColor('rgb(254,156,62)')
.borderRadius(10)
.onClick(()=>{
this.startGame()
})
GridItem(){
Text('返回菜单')
.fontColor('rgb(249,249,249)')
.fontSize(20)
.fontWeight(FontWeight.Bold)
}
.backgroundColor('rgb(254,156,62)')
.borderRadius(10)
}
.columnsTemplate('1fr 1fr 1fr')
.rowsTemplate('2fr 1fr 1fr')
.rowsGap(8)
.columnsGap(8)
.width('100%')
.height(170)
在游戏逻辑的实现中,关键在于检测游戏中的空白格和相邻数字的相加操作,以及将它们放置到数组中对应的位置。
比如此时游戏中有4个数字:
//0代表空白
let arr:number[] = [0,0,2,2,0,0,4,0,0,8,0,0,0,0,0,0]
以向左滑动为例,将所有数字向左滑动,并将相同的数字相加:
let newArr:number[] = Array(4).fill(0)
let arrWithoutZero = arr.filter((x) => x !== 0) //去掉所有的0
if (arrWithoutZero.length == 0) {
return newArr
}
if (toHead) {
for (let i = 0; i < arrWithoutZero.length; i++) {
newArr[i] = arrWithoutZero[i]
}
for (let i = 0; i < newArr.length - 1; i++) {
if (newArr[3 - i] === newArr[2 - i] && newArr[3 - i] !== 0) {
newArr[3 - i] = 0
newArr[2 - i] *= 2
this.score = this.score + newArr[2 - i]
console.log("得分:",this.score)
}
}
}
随后,在随机的空白位置添加一个数字:
let cells:number[] = []
for (let i = 0; i < 4; i++) {
for (let j = 0; j < 4; j++) {
if (!this.itemList[i][j]) {
cells.push(i * 4 + j)
}
}
}
let row = Math.floor(cellIndex / 4)
let col = cellIndex % 4
this.itemList[row][col] = this.getRandomValue()
这就是游戏的基本逻辑,比较简单,适合初学者学习。
在鸿蒙NEXT中开发一个2048小游戏的更多相关文章
- 如何在CentOS上安装一个2048小游戏
如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...
- 使用C#控制台应用程序完成一个2048小游戏
曾经使用C#控制台应用程序写的一个2048,现在翻出来回顾一下 Box类是2048中每一个小格子的相关信息,包括格子的横纵坐标.格子的值和格子是否刚合并这些信息. Grid类是网格的相关信息,包括网格 ...
- Swift实战之2048小游戏
上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...
- 基于jQuery的2048小游戏设计(网页版)
上周模仿一个2048小游戏,总结一下自己在编写代码的时候遇到的一些坑. 游戏规则:省略,我想大部分人都玩过,不写了 源码地址:https://github.com/xinhua6/2048game.g ...
- c#撸的控制台版2048小游戏
1.分析 最近心血来潮,突然想写一个2048小游戏.于是搜索了一个在线2048玩玩,熟悉熟悉规则. 只谈核心规则:(以左移为例) 1.1合并 以行为单位,忽略0位,每列依次向左进行合并,且每列只能合并 ...
- C# 开发2048小游戏
这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的 ...
- 如何快速地开发一个微信小程序
如何快速地开发一个微信小程序呢?我觉得作为初学者,最好能有一个模板,然后改这个模板. 同样作为初学者,刚开始的时候我有下面的几个问题,后来通过问同学,我弄清楚了. 微信小程序可以连接MySQL或者Sq ...
- 业余时间正在开发一个REACT小视频站点
业余时间正在开发一个REACT小视频站点,数据接口来源于吐槽弹幕网(C站),供C站用户移动端的观看.因现存在移动网络屏蔽C站的关系,最好使用非移动网络进行观看.否则会比较卡,影响用户体验. 站点测试入 ...
- FFT中的一个常见小问题(递推式)
FFT中的一个常见小问题这里不细说FFT的内容,详细内容看这些就足以了解大概了小学生都能看懂的FFT!!!FFT详解补充——FFT中的二进制翻转问题主要是对学习过程中一个容易困扰的小问题进行解释,以便 ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
随机推荐
- flutter-使用flutter_app_upgrade进行版本更新要点
- [CF1981E] Turtle and Intersected Segments 题解
好题好题. 难点在建图,因为图的边数将会决定最小生成树的时间复杂度.我们肯定希望能够只建 \(O(n)\) 级别的边,这样时间复杂度就可以做到 \(O(n\log n)\). 观察到当 \(i,j,k ...
- 库卡KUKA机器人KRC4伺服马达维修指导分析
通常情况下,库卡机器人伺服电机是实现机器人的关键组件,它提供了动力.位置和速度控制力和扭矩控制以及闭环控制等功能,使得库卡机器人能够在各种应用场景中发挥机器本身的性能. 一. 如果KUKA库卡机器人K ...
- 爱快路由-宽带刷下行流量docker版教程
疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 一天天看直播上行流量太高,给你下行加加速吧,让你下行 ...
- MySQL - [18] mysql中关于cascade的用法
drop database语句用于删除数据库.但如果想要删除一个数据库并且还要删除所有依赖于该数据库的存储过程.函数等,可以使用cascade关键字.drop database test cascad ...
- 基于 Flink+Iceberg 构建企业级实时数据湖
Apache Flink 是大数据领域非常流行的流批统一的计算引擎,数据湖是顺应云时代发展潮流的新型技术架构.那么当 Apache Flink 遇见数据湖时,会碰撞出什么样的火花呢?本次分享主要包括以 ...
- 3. Nginx 命令行参数 & nginx.conf 配置文件的详细说明(附有截图说明)
3. Nginx 命令行参数 & nginx.conf 配置文件的详细说明(附有截图说明) @ 目录 3. Nginx 命令行参数 & nginx.conf 配置文件的详细说明(附有截 ...
- 解密prompt系列50. RL用于优化Agent行为路径的一些思路
OpenAI新推出的Deep Research功能,属实有些惊艳,也验证了去年的一些观点,之后的大模型工作流会呈现一些截然不同的形态,有敏捷型的例如语音端到端的及时对话,也会有异步长流程的复杂任务,去 ...
- Ubuntu22.04 搭建Kubernetes 1.28版本集群
依赖安装 准备工作需要在所有节点上进行. 安装 ssh 服务 安装 openssh-server sudo apt-get install openssh-server 修改配置文件 vim /etc ...
- SSH远程神器—Termius
简介 Termius是一款非常好用而且漂亮的SSH客户端,能快速远程控制服务器,可以定制自己喜欢的主题.Termius不仅涵盖了PC端的Windows.Linux.Mac,还支持手机端的Android ...