Vue 入门:2048

前言

最近在入门 VueJS ,就顺便把上次从家坐大巴去无锡时,为了转移注意力克服晕车想的 2048 思路给实现了。但 2048 一下子就想完了,车程却有 4 个多小时,后来我就开始想毕业,想错过的班级合照,想 406 的倒霉蛋们……扯远了,但前言不就是这些有的没的。

如下

<template>
  <a-layout style="width: 200px">
    <a-input v-model="size"></a-input>
    <a-row v-for="(d, i) in data" :key="i">
      <a-col :span="6" v-for="(i, idx) in d" :key="idx" style="background: #ffaa55; text-align: center; cursor: default">
        {{ i }}
      </a-col>
    </a-row>
    <a-button-group>
      <a-button @click="react('left')"><a-icon type="left"></a-icon></a-button>
      <a-button @click="react('right')"><a-icon type="right"></a-icon></a-button>
      <a-button @click="react('up')"><a-icon type="up"></a-icon></a-button>
      <a-button @click="react('down')"><a-icon type="down"></a-icon></a-button>
    </a-button-group>
  </a-layout>
</template>
<script lang="ts">
import Vue from 'vue'
import Component from 'vue-class-component'
import { Watch } from 'vue-property-decorator'

@Component
export default class extends Vue {
  size = 4
  data: number[][] = []

  @Watch('size')
  init() {
    this.data = []
    for (let row = 0; row < this.size; row++) {
      const rowArr = []
      for (let col = 0; col < this.size; col++) {
        rowArr.push(0)
      }
      this.data.push(rowArr)
    }
    this.add()
  }

  add() {
    const [row, col] = [Math.floor(Math.random() * this.size), Math.floor(Math.random() * this.size)]
    const data = [...this.data]
    if (data[row][col]) this.add()
    else {
      data[row][col] = Math.random() > 0.5 ? 2 : 4
      this.data = [...data]
    }
  }

  move(rowArr: number[]) {
    const validArr = rowArr.filter((a) => a !== 0)
    rowArr.forEach((_, i) => (validArr[i] && (rowArr[i] = validArr[i])) || (rowArr[i] = 0))
  }

  merge(rowArr: number[]) {
    rowArr.forEach((r, i) => {
      if (i + 1 < rowArr.length && r === rowArr[i + 1] && r !== 0) {
        rowArr[i] *= 2
        rowArr[i + 1] = 0
        this.merge([...rowArr])
        return
      }
    })
  }

  act(rowArr: number[]) {
    this.move(rowArr)
    this.merge(rowArr)
    if (JSON.stringify(rowArr) !== JSON.stringify(rowArr)) {
      this.move(rowArr)
    }
  }

  react(direction: string) {
    this.update(direction)
    this.add()
  }

  update(direction: string) {
    let rowArr
    const data = [...this.data]
    for (let row = 0; row < this.size; row++) {
      switch (direction) {
        case 'left':
          this.act(data[row])
          break
        case 'right':
          this.act(data[row].reverse())
          data[row].reverse()
          break
        case 'up':
          rowArr = []
          for (let i = 0; i < this.size; i++) {
            rowArr.push(data[i][row])
          }
          this.act(rowArr)
          for (let i = 0; i < this.size; i++) {
            data[i][row] = rowArr[i]
          }
          break
        case 'down':
          rowArr = []
          for (let i = this.size - 1; i >= 0; i--) {
            rowArr.push(data[i][row])
          }
          this.act(rowArr)
          for (let i = 0; i < this.size; i++) {
            data[i][row] = rowArr[this.size - i - 1]
          }
          break
        default:
          break
      }
    }

    this.data = [...data]
  }

  created() {
    this.init()
  }
}
</script>

掉落

  • 引起视图中 data 的更新,需要(或者关系):

    • 1.改变对象的引用(push,pop,shift,unshift,splice,sort,reverse)

    • 2.Vue 的 set 方法

后语

就这。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kang Tao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值