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

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

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小游戏的更多相关文章

  1. 如何在CentOS上安装一个2048小游戏

    如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...

  2. 使用C#控制台应用程序完成一个2048小游戏

    曾经使用C#控制台应用程序写的一个2048,现在翻出来回顾一下 Box类是2048中每一个小格子的相关信息,包括格子的横纵坐标.格子的值和格子是否刚合并这些信息. Grid类是网格的相关信息,包括网格 ...

  3. Swift实战之2048小游戏

    上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...

  4. 基于jQuery的2048小游戏设计(网页版)

    上周模仿一个2048小游戏,总结一下自己在编写代码的时候遇到的一些坑. 游戏规则:省略,我想大部分人都玩过,不写了 源码地址:https://github.com/xinhua6/2048game.g ...

  5. c#撸的控制台版2048小游戏

    1.分析 最近心血来潮,突然想写一个2048小游戏.于是搜索了一个在线2048玩玩,熟悉熟悉规则. 只谈核心规则:(以左移为例) 1.1合并 以行为单位,忽略0位,每列依次向左进行合并,且每列只能合并 ...

  6. C# 开发2048小游戏

    这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的 ...

  7. 如何快速地开发一个微信小程序

    如何快速地开发一个微信小程序呢?我觉得作为初学者,最好能有一个模板,然后改这个模板. 同样作为初学者,刚开始的时候我有下面的几个问题,后来通过问同学,我弄清楚了. 微信小程序可以连接MySQL或者Sq ...

  8. 业余时间正在开发一个REACT小视频站点

    业余时间正在开发一个REACT小视频站点,数据接口来源于吐槽弹幕网(C站),供C站用户移动端的观看.因现存在移动网络屏蔽C站的关系,最好使用非移动网络进行观看.否则会比较卡,影响用户体验. 站点测试入 ...

  9. FFT中的一个常见小问题(递推式)

    FFT中的一个常见小问题这里不细说FFT的内容,详细内容看这些就足以了解大概了小学生都能看懂的FFT!!!FFT详解补充——FFT中的二进制翻转问题主要是对学习过程中一个容易困扰的小问题进行解释,以便 ...

  10. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

随机推荐

  1. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-15- iframe操作--番外篇 (详细教程)

    1.简介 通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位.监听事件和执行js脚本三个方面进行展开 ...

  2. Common.Logging+log4net搭建项目日志框架

    原文参考链接:https://www.cnblogs.com/heys/p/5787123.html   Common.Logging+(log4net/NLog/) common logging是一 ...

  3. WPF中实现PropertyGrid的三种方式

    原文地址: https://www.cnblogs.com/zhuqil/archive/2010/09/02/Wpf-PropertyGrid-Demo.html 第一种方式:使用WindowsFo ...

  4. 当懒惰遇上AI:我如何用Coze让大模型帮我整理2.5万字课程笔记

    能写代码绝不动手,能用AI绝不写代码 -- AI粉嫩特攻队信条 通过本文学会打造这个AI工具,只有一个要求:识字且会上网! 一个小困扰 有朋友最近在上一位大佬的线上直播课程,感叹道: "老师 ...

  5. 北京大学DeepSeek系列教程:《DeepSeek与AIGC应用》

    前言 今天大姚分享一个由北京大学推出的DeepSeek系列学习教程<DeepSeek与AIGC应用>,该文档全面介绍了DeepSeek-R1模型的技术特性.应用场景及其在AIGC领域的重要 ...

  6. 获取当前电脑屏幕的dpi

    <div id="test" style="width:1in;height:1in;overflow:hidden;"></div> ...

  7. Ubuntu安装配置redis

    更新安装相关依赖库 下面步骤一步一步来 sudo apt update sudo apt install build-essential sudo apt-get install manpages-d ...

  8. [SDR] GNU Radio 系列教程 —— GNU Radio RX PDU (接收据包操作)的基础知识(超全)

    目录 1 接收概述 2 相关块介绍 2.1 相关性估计器(Correlation Estimator) 2.2 多相时钟同步(Polyphase Clock Sync) 2.3 线性均衡器(Linea ...

  9. 如何学习 ROS+PX4

    博客地址:https://www.cnblogs.com/zylyehuo/ 参考 https://www.bilibili.com/video/BV1vx4y1Y7Tu?spm_id_from=33 ...

  10. 前后端不分离中使用 Ajax 请求(Django3.2)

    博客地址:https://www.cnblogs.com/zylyehuo/ view.py def get_tokens(request): token = get_token(request) r ...