在鸿蒙NEXT中开发一个2048小游戏

news/2024/11/13 10:12:40/文章来源:https://www.cnblogs.com/youlanjihua/p/18537968

本项目是基于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) //去掉所有的0if (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] = 0newArr[2 - i] *= 2this.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()

这就是游戏的基本逻辑,比较简单,适合初学者学习。本文完整代码可以主页发送‘2048’获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/830653.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx 整体架构

Nginx 是什么 Nginx 是一款 C 语言编写高性能 Web 服务器,反向代理服务器。占用内存少、并发能力强 使用场景 nginx主要有以下 4 个使用场景作为 Http 服务器,可以提供静态网页和静态资源的访问 HTTP代理缓存,缓存服务端请求数据 作为反向代理服务器,将请求代理转发 作为负…

[CISCN2019 华北赛区 Day2 Web1]Hack World 1

[CISCN2019 华北赛区 Day2 Web1]Hack World 1 打开实例发现是个POST注入框盲猜SQL注入,万能密码检测无果,而且经过测试存在大量sql关键字过滤尝试使用(),出现了bool(false),确定这是一道布尔注入题and被禁用,决定采用异或^注入 构建payload脚本梭哈:成功获得flag:flag{a2…

2024 AH CSP-S 迷惑行为大赏

洛谷专栏阅读:https://www.luogu.com.cn/article/0atx674s 一、概述 观前提示:本届CSP-S安徽省整活相较于其他省份不是那么“群英荟萃”,观看前请不要小零食(?) 本届CSP-S安徽共有1013人参赛,其中有效准考证号源文件夹共有1006个,7人因为种种原因最终没有留下任何参赛痕…

LeNet-5卷积神经网络的实现与改进-实验报告

摘要 在本次实验中,我实现了LeNet-5卷积神经网络模型的构建与训练,以实现图像分类任务。主模型采用Pytorch框架搭建,模型识别准确率达到了87%,体现了较好的分类效果。除此之外,我还尝试使用C++实现模型的底层核心操作,包括卷积、池化及全连接等,但最终准确率较低,未达预…

【Mplus 8.7软件下载与安装教程】

1、安装包 Mplus 8.7: 链接:https://pan.quark.cn/s/128e81c51dbe 提取码:1X7B Mplus 8.3: 链接:https://pan.quark.cn/s/5ea5ff583480 提取码:Vdjt Mplus 7.4: 链接:https://pan.quark.cn/s/414ec0c8cb14 提取码:8jhm 2、安装教程 1) 双击Mplus8.7 Demo(64-bi…

Day13 备战CCF-CSP练习

202312-3Day 13 题目描述 题目分析 大模拟,用栈储存每一个多项式,最后根据导数的加法原则依次求导相加,注意取模。 C++代码 #pragma GCC optimize(3, "Ofast", "inline") #include <bits/stdc++.h> #define int long longusing namespace std; co…

OOP实验三

任务1: 源码:1 #pragma once2 3 #include <iostream>4 #include <string>5 6 using std::string;7 using std::cout;8 9 // 按钮类 10 class Button { 11 public: 12 Button(const string &text); 13 string get_label() const; 14 void click()…

鸿蒙NEXT开发案例:转盘1W

【1】引言(完整代码在最后面) 在鸿蒙NEXT系统中,开发一个有趣且实用的转盘应用不仅可以提升用户体验,还能展示鸿蒙系统的强大功能。本文将详细介绍如何使用鸿蒙NEXT系统开发一个转盘应用,涵盖从组件定义到用户交互的完整过程。 【2】环境准备 电脑系统:windows 10 开发工…

开源 - Ideal库 - 常用时间转换扩展方法(二)Qv

合集 - Ideal库 - Common库(2)1.开源 - Ideal库 - 常用时间转换扩展方法(一)11-07:悠兔机场2.开源 - Ideal库 - 常用时间转换扩展方法(二)11-09收起 书接上回,我们继续来分享一些关于时间转换的常用扩展方法。01、时间转日期时间 TimeOnly 该方式是把TimeOnly类型转为Date…

存储器的知识

以W25Q256为例子(外部Flash),结构如下:扇区的内部结构以F10系列为例子 64位代表的是8个字节的数据,一个地址最多可以存储8个字节的数据(double数据类型就是8个字节),4k,16k,64k,32k代表的是地址的总数,主存储块又可以分为很多个页,页里面也有存储的空间大小嵌入式闪存的组成

什么是git,什么是github,git和github的使用

Git实战注意:本项目是学习笔记,来自于哔哩哔哩武沛齐老师的Git实战视频, 网址:【武沛齐老师讲git,看完绝对上瘾!!!】 https://www.bilibili.com/video/BV1ne4y1E7np/?share_source=copy_web&vd_source=2c9a5d5590d3759367594e264ff079c4另外,因为这个博客是我直接…

law Intermediate walkthrough pg

靶场很简单分数只有10分跟平常做的20分的中级靶场比确实简单 我拿来放松的 算下来30分钟解决战斗 nmap 扫到80端口web界面 是个框架 搜exp https://www.exploit-db.com/exploits/52023 他的脚本可能有点问题看不到回显 我们审脚本直接看到漏洞点所在 命令执行 curl -s -d "…