在鸿蒙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小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
随机推荐
- OpenCascade 开源的三维建模几何造型开发平台
官方文档 https://dev.opencascade.org/doc/overview/html/index.html Open CASCADE(简称OCC)平台是由法国Matra Datavis ...
- Python类型提示完全指南:用类型安全重构你的代码,提升10倍开发效率
title: Python类型提示完全指南:用类型安全重构你的代码,提升10倍开发效率 date: 2025/2/23 updated: 2025/2/23 author: cmdragon exce ...
- Deepseek学习随笔(1)--- 初识 DeepSeek
什么是 DeepSeek? DeepSeek 是一款基于人工智能的对话工具,旨在帮助用户高效完成各种任务,包括文本生成.代码编写.数据分析等.通过自然语言处理技术,DeepSeek 能够理解用户的输入 ...
- 小米13Pro一键ROOT秒杀全版本
小米13p专属 通杀全版本 但是必须解开bl锁 小米13pro一键root使用方法: 解锁bl后,不要设置锁屏密码,有的话就取消掉,打开软件,点击安装驱动(管理员) 手机上打开usb调试和usb安装 ...
- ML树构建简明教程
数据准备 Teamviewer登录实验室服务器,访问http://172.17.128.86:8501/CleanData,按照页面对应的格式要求分别从NCBI和GISAID数据库下载数据,拖拽到对应 ...
- Arduino LED流水灯·基础实验
Arduino初学IO控制,流水灯实验是很好的学习对象.分两个进程学习. 一.假流水灯,即基础效果实现 二.真流水灯,即采用PWM模拟真实流水渐变效果 我们设立5盏灯,正极分别连接数字口(Digita ...
- CUDA时长统计
技术背景 前面的一篇文章中介绍了在CUDA中使用宏来监测CUDA C函数或者Kernel函数的运行报错问题.同样的思路,我们可用写一个用于统计函数运行时长的宏,这样不需要使用额外的工具来对函数体的性能 ...
- [解决方案][docker] Http: server gave HTTP response to HTTPS client
前言 用centos运行docker不支持http,需要在daemon.json 里面配置一下 目录 没有daemon.json 需要添加这个文件 在daemon.json 增添配置 重启即可 一.l ...
- [WinUI 3] 模仿 Visual Studio 的 Docking 控件
WinUI 3 是什么? WinUI 3 是微软前几年推出的一款 UI 框架,它是 UWP 的升级版,支持 Win32 和 WinUI 3 混合开发.并且 WinUI 3 的设计风格更加现代化. 无论 ...
- 使用makefile帮助GO项目开发
使用makefile可以快捷管理和构建自己的go项目, 适用于linux远程开发等环境. 提供一个基础的makefile供开发使用. 大部分是针对常用指令的二次封装 Makefile 先展示文件内容, ...