微信小程序|使用小程序制作一个2048小游戏

news/2024/7/20 3:39:58 标签: 微信小程序, 小程序, 前端

文章目录

    • 一、文章前言
    • 二、创建小程序
    • 三、功能开发

一、文章前言

此文主要通过小程序实现2048游戏,游戏操作简单,容易上手。
规则:正常打开游戏的界面,会只有两个2,每次移动后都会出现一个2,数字大了之后会出现4和8。
只有数字相同,才能够相加,每次相加之后都会变成原本的二倍,比如两个2相加变成4,两个4相加变成8。
使大数在一边,小数在一边,这样相同的数才能更好的结合在一起。

二、创建小程序

  1. 访问微信公众平台,点击账号注册。

在这里插入图片描述

  1. 选择小程序,并在表单填写所需的各项信息进行注册。

在这里插入图片描述
在这里插入图片描述

  1. 在开发管理选择开发设置,将AppID及AppSecret复制出来进行存储。

在这里插入图片描述

  1. 下载安装微信web开发者工具并创建一个新的项目,填入上图所复制的AppId。

在这里插入图片描述
在这里插入图片描述

三、功能开发

  1. 在创建的index这个page中,实现一个4*4的矩阵。

在这里插入图片描述

在这里插入图片描述

	    <view class="grid-container" >
			<view  class="grid-row">
			  	<view class="grid-cell">
			  		<view class="tile tile">
			  		</view>
			  	</view>
			</view>
	    </view>
  1. 初始化矩阵数据,让其在页面加载时随机在两个方格上显示两个2。

在这里插入图片描述

在这里插入图片描述

  <view class="grid-container">
		<view wx:for="{{grids}}" wx:for-index="rowIdx" wx:for-item="row" class="grid-row">
		  	<view wx:for="{{row}}" wx:for-index="colIdx" wx:for-item="cell" class="grid-cell">
		  		<view class="tile tile-{{cell.value}}">
		  			<view wx:if="{{cell}}" class="tile-inner">
		      			{{cell.value}}
		      		</view>
		  		</view>
		  	</view>
		</view>
    </view>
  • 外部JS
function Grid(size) {
    this.size = size;
    this.cells = this.empty();
}

Grid.prototype = {
    // 构造一个空的矩阵[[null,..,size.length],[]]
    empty: function() {
        var cells = [];

        for (var x = 0; x < this.size; x++) {
            var row = cells[x] = [];

            for (var y = 0; y < this.size; y++) {
                row.push(null);
            }
        }
        // [[{x:0,y:0},{x:0,y:1}],[]]
        return cells;
    },

    // 在空格子中随机挑选出一个格子
    randomAvailableCell: function() {
        var cells = this.availableCells();
        // 存在可填充的格子
        if (cells.length) {
            return cells[Math.floor(Math.random() * cells.length)];
        }
    },

    // 获取可填充的格子坐标
    availableCells: function() {
        var cells = [];
        for (var i = 0; i < this.size; i++) {
            for (var j = 0; j < this.size; j++) {
                // 当前格子无内容
                if (!this.cells[i][j]) {
                    cells.push({
                        x: i,
                        y: j
                    });
                }
            }
        }
        return cells;
    },

    // 是否存在空单元格
    cellsAvailable: function() {
        return !!this.availableCells().length;
    },

    cellAvailable: function(cell) {
        return !this.cellContent(cell);
    },

    insertTile: function(tile) {
        this.cells[tile.x][tile.y] = tile;
    },

    removeTile: function(tile) {
        this.cells[tile.x][tile.y] = null;
    },

    /* 
     * 获取单元格内容
     * @param {object} cell {x:0,y:0} 单元格坐标
     */
    cellContent: function(cell) {
        if (this.withinBounds(cell)) {
            return this.cells[cell.x][cell.y] || null;
        } else {
            return null;
        }
    },

    /*
     * 空单元格,格子还未填充数字
     */
    emptyCell: function(cell) {
        return !this.cellContent(cell);
    },

    withinBounds: function(cell) {
        return cell.x >= 0 && cell.x < this.size && cell.y >= 0 && cell.y < this.size;
    },

    eachCell: function(callback) {
        for (var x = 0; x < this.size; x++) {
            for (var y = 0; y < this.size; y++) {
                callback(x, y, this.cells[x][y]);
            }
        }
    }
}

module.exports = Grid;

  1. 给遍历出来的矩阵方块增加bindtouchstart,bindtouchmove,bindtouchend等手指触摸响应事件。

在这里插入图片描述

  touchStart: function (events) {
    // 多指操作
    this.isMultiple = events.touches.length > 1;
    if (this.isMultiple) {
      return;
    }
    var touch = events.touches[0];
    this.touchStartClientX = touch.clientX;
    this.touchStartClientY = touch.clientY;
  },

  touchMove: function (events) {
    var touch = events.touches[0];
    this.touchEndClientX = touch.clientX;
    this.touchEndClientY = touch.clientY;
  },
  1. 在事件响应的同时记录分数。

在这里插入图片描述

      var highscore44 = wx.getStorageSync('highscore44') || 0;
      if (data.score > highscore44) {
        wx.setStorageSync('highscore44', data.score);
      }
   <view class="heading">
     	<view class="scores-container">
       	<view class="score-container">{{score}}</view>
     		<view class="best-container">{{highscore44}}</view>
     	</view>
   </view>
  1. 在游戏结束的时候将分数存入小程序缓存,并获取之前的分数进行比对,判断是否最高分。

在这里插入图片描述

//-----------储存最高分-------------------------------------
      wx.getStorage({
        key: 'highscore44',
        success: function (res) {
          let highscore44 = res.data
          wx.setStorage({
            key: 'highscore44',
            data: highscore44,
          })
        },
        fail: () => {
          let highscore44 = []
          wx.setStorage({
            key: 'highscore44',
            data: highscore44,
          })
        }
      })
  1. 在页面增加重新开始按钮,并绑定对应的事件。

在这里插入图片描述

 <view class="above-game">
   	<text class="restart-button" bindtap="restart">重新开始</text>
 </view>
  // 重新开始
  restart: function () {
    this.updateView({
      grids: this.GameManager.restart(),
      over: false,
      won: false,
      score: 0
    });
  },
  1. 可以将分数通过云开发或者数据库的方式进行存储,将分数进行排行展示。

在这里插入图片描述

 rankInfo4x4: [
          {  name: '摔跤猫子', score: 180000, img: 'rank1.png' }, 
          { name: 'siri', score: 163148, img: 'rank2.png' }, 
          { name: 'kitten', score: 146088, img: 'rank3.png' },
          { name: 'admin', score: 136024, img: 'rank4.png' },
          { name: '无语小咪', score: 122908, img: 'rank5.png' },
          {  name: '汤姆', score: 115283, img: 'rank6.png' }
          ],
  1. 实现分享功能,邀请好友一起玩。
//---------------
  /**
 * 用户点击右上角分享
 */
    onShareAppMessage: function () {
      return {
        title: '诚邀你一起来挑战2048排行!',
        path: '/pages/index/index',
      }
    }
}

http://www.niftyadmin.cn/n/10449.html

相关文章

若依框架字典配置以及使用(结合vue和emelent)

一&#xff1a;字典数据创建&#xff08;我们公司是后端做的&#xff0c;前端不用管&#xff09; 1.首先新建要指定的默认角色 &#xff08;1&#xff09;必须用管理员账号登录才能看到角色管理 &#xff08;2&#xff09;具体怎写&#xff0c;可以参考已有的数据&#xff08…

c++编程实例

26&#xff0c;一个数介入恰好等于它的因子之和&#xff0c;那个数就称为完数.例似&#xff0c;6的因子为2&#xff0c;2&#xff0c;3&#xff0c;而6223&#xff0c;是以6是完数.编程求2000以内全部完数. #define M 2000 #include <stdio.h> int main&#xff08;) { i…

黑马点评--分布式锁

黑马点评–分布式锁 基本原理与不同实现方式对比&#xff1a; 什么是分布式锁&#xff1a; ​ 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心是实现多进程之间互斥&#xff0c;而满足这一点的方式有很多&#xff0c;常见的有三种…

博客资源汇总

资源汇总 前言 各位小伙伴大家好&#xff0c;很久没有更新博客了。鄙人由于自己的事务很久没有进行创作&#xff0c;再加上经验和技术不足需要进行深刻的学习&#xff0c;停更了较长时间。首先给一直给予关注的小伙伴们致歉&#xff0c;开了很多坑但是还没完成。这顿时间忙着…

Oracle Primavera Unifier组合管理器(Portfolio Manager)

目录 一&#xff1a;前言 二&#xff1a;介绍​​​​​​​ 一&#xff1a;前言 Oracle Primavera Unifier uDesigner Portfolio Manager 项目组合管理器是公司的预算员/计划工程师可以收集项目&#xff08;计划和执行中&#xff09;的成本和进度信息&#xff0c;并对“假设…

【Kafka从成神到升仙系列 四】你真的了解 Kafka 的缓存池机制嘛

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;Java领域新星创作者&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到…

实验四 软中断信号及处理

1.利用sleep、pause、alarm函数设定闹钟&#xff0c;定时显示信息。 #include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<signal.h> int main(){int ret;alarm(50);sleep(30);retalarm(10);printf("%d\n",ret);pause();pri…

ASO优化含义篇:积分墙是什么?

前面我们提到了标题和关键词&#xff0c;那在我们优化好主标题&#xff0c;副标题&#xff0c;关键词和图标这些数据之后&#xff0c;还可以通过积分墙来优化关键词排名&#xff0c;来获取新的用户。 那什么是积分墙呢&#xff1f; 都玩过双十一淘宝主页的“喵糖总动员”吧&am…