在鸿蒙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()

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

posted @ 2024-11-10 15:13  幽蓝计划  阅读(4)  评论(0编辑  收藏  举报