首页 > 其他分享 >【江鸟中原】——实现简单的2048

【江鸟中原】——实现简单的2048

时间:2023-12-23 18:32:26浏览次数:31  
标签:江鸟 direction Grids column 2048 let 中原 array row

一、引言

经过一学期的学习,运用自己学习的知识,自己实践完成了一个简单的小游戏。

二、游戏介绍

完成一个2048小游戏,在一个4×4的空间中,可以实现上下左右移动,相同块消除形成倍数块,如果没有可移动块,则游戏结束。否则游戏可一直进行。

三、程序设计

(1)页面实现

在4×4的表格中随机生成2或者4的数块,通过移动数块来完成游戏运行,如果数块沾满16个格游戏则结束。

生成表格。
@Component
struct setText {
  @Link grids: number[]

  build() {
    Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, direction: FlexDirection.Row }) {
      ForEach(this.grids,
        (item: number) => Text(item == 0 ? '' : item.toString())
          .width(70)
          .height(70)
          .textAlign(TextAlign.Center)
          .fontSize(30)
          .margin({ left: 5, top: 5, right: 5, bottom: 5 })
          .backgroundColor(colors[item.toString()])
          .fontColor((item == 2 || item == 4) ? '#645B52' : '#FFFFFF'),
        (item: number) => (number++) + item.toString())
    }
  }
}

使用装饰器@Component,自定义一个每一行的组件,用装饰器@Link定义一个数组grids。在build()里面添加弹性布局Flex,使用循环渲染ForEach来绘制组件Text。对于每一个Text组件,文本判断是否为0,如果值为0,则不显示,背景颜色采用刚才定义好的背景颜色字典colors对应的背景颜色,文本颜色判断其值是否为2或4,如果为2或4,则采用颜色#645B52,否则采用背景颜色白色。

【江鸟中原】——实现简单的2048_鸿蒙

同理,使用装饰器@Component,自定义一个按钮Button组件,用以绘制上下左右四个按钮。

@Component
struct setButton {
  private dirtext: string
  private dir: string
  @Link Grids: number[][]
  @Link grid1: number[]
  @Link grid2: number[]
  @Link grid3: number[]
  @Link grid4: number[]

  build() {
    Button(this.dirtext)
      .width(60)
      .height(60)
      .fontSize(30)
      .fontWeight(FontWeight.Bold)
      .align(Alignment.Center)
      .backgroundColor('#974B31')
      .fontColor('#FFFFFF')
      .margin({ left: 5, top: 3, right: 5, bottom: 3 })
  }
}

(2)逻辑代码

在结构体setButton中添加四个函数:

addTwoOrFourToGrids():用以随机生成一个新的方格数字,数字为2或4。

addTwoOrFourToGrids() {
  let array = [];
  for (let row = 0; row < 4; row++)
    for (let column = 0;column < 4; column++)
      if (this.Grids[row][column] == 0)
        array.push([row, column]);

  let randomIndes = Math.floor(Math.random() * array.length);
  let row = array[randomIndes][0];
  let column = array[randomIndes][1];
  if (Math.random() < 0.8) {
    this.Grids[row][column] = 2;
  } else {
    this.Grids[row][column] = 4;
  }
}

swipeGrids(direction):用以实现方格的重新生成。

swipeGrids(direction) {
  let newGrids = this.changeGrids(direction);
  if (newGrids.toString() != this.Grids.toString()) {
    this.Grids = newGrids;
  }
}

changeGrids(direction):用以实现方格的上下左右移动。

changeGrids(direction) {
  let newGrids = [[0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]];
  if (direction == 'left' || direction == 'right') {
    let step = 1;
    if (direction == 'right') {
      step = -1;//step作为循环时数组下标改变的方向
    }
    for (let row = 0; row < 4; row++) {//每一层
      let array = [];
      let column = 0;//如果为left则从0开始right从3开始,
      if (direction == 'right') {
        column = 3;
      }
      for (let i = 0; i < 4; i++) {
        if (this.Grids[row][column] != 0) {//把所有非零元依次放入数组中
          array.push(this.Grids[row][column]);
        }
        column += step;//当direction为left时则从0向3递增,为right时则从3向0递减
      }
      for (let i = 0; i < array.length - 1; i++) {//访问当前元素及他的下一个元素,所有循环次数为length-1
        if (array[i] == array[i + 1]) {//判断是否可合并,
          array[i] += array[i + 1];//合并,
          array[i + 1] = 0;//合并后参与合并的第二个元素消失
          i++;
        }
      }
      column = 0;
      if (direction == 'right') {
        column = 3;
      }
      for (const elem of array) {
        if (elem != 0) {//跳过array里的空元素
          newGrids[row][column] = elem;//把合并后的状态赋给新数组grids,
          column += step;
        }
      }
    }
  } else if (direction == 'up' || direction == 'down') {//同理
    let step = 1;
    if (direction == 'down') {
      step = -1;
    }
    for (let column = 0; column < 4; column++) {
      let array = [];
      let row = 0;
      if (direction == 'down') {
        row = 3;
      }
      for (let i = 0; i < 4; i++) {
        if (this.Grids[row][column] != 0) {
          array.push(this.Grids[row][column]);
        }
        row += step;
      }
      for (let i = 0; i < array.length - 1; i++) {
        if (array[i] == array[i + 1]) {
          array[i] += array[i + 1];
          array[i + 1] = 0;
          i++;
        }
      }
      row = 0;
      if (direction == 'down') {
        row = 3;
      }
      for (const elem of array) {
        if (elem != 0) {
          newGrids[row][column] = elem;
          row += step;
        }
      }
    }
  }
  return newGrids;
}

changeString():用以将二维数组分成四个一维数组。

changeString() {
  this.grid1 = [this.Grids[0][0], this.Grids[0][1], this.Grids[0][2], this.Grids[0][3]]
  this.grid2 = [this.Grids[1][0], this.Grids[1][1], this.Grids[1][2], this.Grids[1][3]]
  this.grid3 = [this.Grids[2][0], this.Grids[2][1], this.Grids[2][2], this.Grids[2][3]]
  this.grid4 = [this.Grids[3][0], this.Grids[3][1], this.Grids[3][2], this.Grids[3][3]]
}

最后在Button组件的属性里添加一个点击事件,依次调用函数swipeGrids(direction)、addTwoOrFourToGrids()和changeString()。

四、总结

通过上半学期的学习,也算给鸿蒙课画上一个圆满的句号,能够完成这次作业,少不了老师3个月的指导和学习,网上学习一些课外知识,找了一些课外优秀作品,参考了一些其他博客的优秀作品,突发灵感,选择了这个选题,代码量适中,中间也遇到了一些困难,但是通过参考一些文献也是修改出来。老师也说过,想要深入学习,这三个月也是不够的,这仅仅只是基础,我也会继续努力,刻苦学习编程。



标签:江鸟,direction,Grids,column,2048,let,中原,array,row
From: https://blog.51cto.com/u_16319079/8945737

相关文章

  • 【江鸟中原】ArkUI组件示例
    学习了一段鸿蒙课,觉得有必要晒一晒自己的进步。通过对ArkUI的学习,我学会了它主要分为基础组件、容器和弹窗。下面我主要对基础组件的按钮和文本进行分析,希望对学习鸿蒙开发的同学有帮助。1.在DevEcoStudio中创建一个新项目2.在main下面的pages文件夹下建立ButtonPage.ets项目项目......
  • 【江鸟中原】————简单小游戏
    一、引言 经过一段实践学习之后,我开始运用学习过的知识,自己实践创作了一个鸿蒙小型游戏。二、游戏介绍 我所创作的是一个贪吃蛇的小游戏,这个游戏主要思路是在一个1010方格上随机出现一个格子,当贪吃蛇的头出现在格子上时,则贪吃蛇整体长度加1。当贪吃蛇的头部在1010方格之外时,则......
  • 江鸟中原——鸿蒙App应用-《校园通》
        我是中原工学院软工金学生黄晓雨。以下是我的实践报告。   《校园通》软件很多系统中都有,android,ios,平板电脑等,该软件主要用于学校里的环境,学生,老师之间的沟通,方便学生的行动。实现思路:创建一个Java语言的鸿蒙项目创建主界面,包含:学校生活,出行指南,游玩南昌,号码百......
  • 『江鸟中原』基于鸿蒙的抽奖小程序
    通过对鸿蒙的学习,我做了一个基于鸿蒙开发的小项目。中原工学院RB软工移211班王梦茹202119144101案例介绍开始时间,点击抽奖,Web页面的抽奖转盘会开始转动,结束抽奖后,原生页面会弹出一个提示弹窗,这个页面就涉及到Web页面和原生页面的双向交互具体实现步骤以上就是这个案例的开发流程,......
  • 『江鸟中原』手表实现投骰子
    我是中工的葛腾辉,这是我的鸿蒙结课大作业,以下是我的作业报告。前言在日常的兵棋游戏中,投骰子是一个必不可少的环节,用来模拟各种概率,为了更方便的使用这个工具,我准备把投骰子功能移植到华为手表上。最终效果图创建项目DevEcoStudio下载安装成功后,打开DevEcoStudio,点击左上角的File......
  • 『江鸟中原』鸿蒙应用开发:实现新闻app
    大家好,我是中原工学院的张迅,以下是我的作业报告:   已知app主要为用户提供信息,使其能够实现信息流展示、页面跳转、搜索、评论等功能   这里主要以一款新闻类app为例,展开讲解,如图:一、观察页面所需要实现的效果:1.从本地后端获取新闻资讯Feed流 2.切换Teb页签 3.下拉......
  • 『江鸟中原』鸿蒙——设计聊天软件界面并实现登录跳转
    环境搭建软件要求 DevEcoStudio版本:DevEcoStudio4.0Beta1BuildVersion:4.0.0.201,builtonJune10,2023。 HarmonyOSSDK版本:APIversion9。硬件要求设备类型:华为手机或运行在DevEcoStudio上的华为手机设备模拟器。HarmonyOS系统:3.1.0DeveloperRelease。简要介......
  • 『江鸟中原』鸿蒙仿汽水音乐应用
    1.引言 在短视频火爆的今天,“刷”成为了老少皆宜的一项消遣娱乐的活动。那音乐能不能刷呢,答案当然是可以的。汽水音乐就实现了这个想法。汽水音乐也是抖音推出的一款音乐软件,因为我平时比较喜欢使用这款软件,这也是我做这个项目主要灵感来源。2.项目背景 自从短视频平台成为音乐......
  • 『江鸟中原』鸿蒙云函数开发
    概括CloudFunctions,是一项Serverless计算服务,提供FaaS(FunctionasaService)能力,一方面云函数将开发测试的对象聚焦到函数级别,可以帮助大幅简化应用开发与运维相关的事务,另一方面可以通过在应用中集成云函数SDK,便捷操作云数据库、云存储等,提升业务功能构建的便利性。云函数可......
  • 『江鸟中原』鸿蒙---CustomDialog
    我是中工的陈金灿,这是我的鸿蒙结课大作业,以下是我的作业报告。自定义弹窗(CustomDialog)可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹窗。具体用法请参考自定义弹窗。一、创建自己第一个自定义弹窗1.1创建自定义弹......