微信小程序实现的贪吃蛇游戏【附源码下载】


Posted in Javascript onJanuary 03, 2018

本文实例讲述了微信小程序实现的贪吃蛇游戏。分享给大家供大家参考,具体如下:

先来看看运行效果:

微信小程序实现的贪吃蛇游戏【附源码下载】

具体代码如下:

界面布局 pages/snake/snake/snake.wxml:

<!--snake.wxml-->
<view class="control" bindtouchstart="tapStart" bindtouchmove="tapMove" bindtouchend="tapEnd">
<view class="score">
  <view class="title">snake</view>
  <view class="scoredetail">
    <view class="scoredesc">得分</view>
    <view class="scorenumber">{{score}}</view>
  </view>
  <view class="scoredetail">
    <view class="scoredesc">历史最高</view>
    <view class="scorenumber">{{maxscore}}</view>
  </view>
</view>
<view class="ground">
  <view wx:for="{{ground}}" class="rows" wx:for-item="cols">
    <view wx:for="{{cols}}" class="block block_{{item}}" >
    </view>
  </view>
</view>
<modal class="modal" hidden="{{modalHidden}}" no-cancel bindconfirm="modalChange">
 <view> 游戏结束,重新开始吗? </view>
</modal>
</view>

逻辑功能 pages/snake/snake/snake.js:

//snake.js
var app = getApp();
Page({
  data:{
    score: 0,//比分
    maxscore: 0,//最高分
    startx: 0,
    starty: 0,
    endx:0,
    endy:0,//以上四个做方向判断来用
    ground:[],//存储操场每个方块
    rows:28,
    cols:22,//操场大小
    snake:[],//存蛇
    food:[],//存食物
    direction:'',//方向
    modalHidden: true,
    timer:''
  } ,
  onLoad:function(){
    var maxscore = wx.getStorageSync('maxscore');
    if(!maxscore) maxscore = 0
    this.setData({
    maxscore:maxscore
    });
    this.initGround(this.data.rows,this.data.cols);//初始化操场
    this.initSnake(3);//初始化蛇
    this.creatFood();//初始化食物
    this.move();//蛇移动
  },
  //计分器
  storeScore:function(){
   if(this.data.maxscore < this.data.score){
   this.setData({
    maxscore:this.data.score
    })
    wx.setStorageSync('maxscore', this.data.maxscore)
   }
 },
 //操场
  initGround:function(rows,cols){
    for(var i=0;i<rows;i++){
      var arr=[];
      this.data.ground.push(arr);
      for(var j=0;j<cols;j++){
        this.data.ground[i].push(0);
      }
    }
  },
  //蛇
  initSnake:function(len){
    for(var i=0;i<len;i++){
      this.data.ground[0][i]=1;
      this.data.snake.push([0,i]);
    }
  },
  //移动函数
  move:function(){
    var that=this;
    this.data.timer=setInterval(function(){
      that.changeDirection(that.data.direction);
      that.setData({
        ground:that.data.ground
      });
    },400);
  },
  tapStart: function(event){
    this.setData({
      startx: event.touches[0].pageX,
      starty: event.touches[0].pageY
      })
  },
  tapMove: function(event){
    this.setData({
      endx: event.touches[0].pageX,
      endy: event.touches[0].pageY
      })
  },
  tapEnd: function(event){
    var heng = (this.data.endx) ? (this.data.endx - this.data.startx) : 0;
    var shu = (this.data.endy) ? (this.data.endy - this.data.starty) : 0;
    if(Math.abs(heng) > 5 || Math.abs(shu) > 5){
      var direction = (Math.abs(heng) > Math.abs(shu)) ? this.computeDir(1, heng):this.computeDir(0, shu);
      switch(direction){
      case 'left':
        if(this.data.direction=='right')return;
        break;
      case 'right':
        if(this.data.direction=='left')return;
        break;
      case 'top':
        if(this.data.direction=='bottom')return;
        break;
      case 'bottom':
        if(this.data.direction=='top')return;
        break;
      default:
    }
    this.setData({
    startx:0,
    starty:0,
    endx:0,
    endy:0,
    direction:direction
    })
  }
  },
  computeDir: function(heng, num){
  if(heng) return (num > 0) ? 'right' : 'left';
  return (num > 0) ? 'bottom' : 'top';
  },
  creatFood:function(){
    var x=Math.floor(Math.random()*this.data.rows);
    var y=Math.floor(Math.random()*this.data.cols);
    var ground= this.data.ground;
    ground[x][y]=2;
    this.setData({
      ground:ground,
      food:[x,y]
    });
  },
  changeDirection:function(dir){
    switch(dir){
    case 'left':
      return this.changeLeft();
      break;
    case 'right':
      return this.changeRight();
      break;
    case 'top':
      return this.changeTop();
      break;
    case 'bottom':
      return this.changeBottom();
      break;
    default:
    }
  },
  changeLeft:function(){
    var arr=this.data.snake;
    var len=this.data.snake.length;
    var snakeHEAD=arr[len-1][1];
    var snakeTAIL=arr[0];
    var ground=this.data.ground;
    ground[snakeTAIL[0]][snakeTAIL[1]]=0; 
    for(var i=0;i<len-1;i++){
        arr[i]=arr[i+1];  
    };
    var x=arr[len-1][0];
    var y=arr[len-1][1]-1;
    arr[len-1]=[x,y];
      this.checkGame(snakeTAIL);
    for(var i=1;i<len;i++){
      ground[arr[i][0]][arr[i][1]]=1;
    } 
  this.setData({
        ground:ground,
      snake:arr
    });
    return true;
  },
  changeRight:function(){
    var arr=this.data.snake;
    var len=this.data.snake.length;
    var snakeHEAD=arr[len-1][1];
    var snakeTAIL=arr[0];
    var ground=this.data.ground;
    ground[snakeTAIL[0]][snakeTAIL[1]]=0; 
    for(var i=0;i<len-1;i++){
        arr[i]=arr[i+1];  
    };
    var x=arr[len-1][0];
    var y=arr[len-1][1]+1;
    arr[len-1]=[x,y];
    this.checkGame(snakeTAIL);
    for(var i=1;i<len;i++){
      ground[arr[i][0]][arr[i][1]]=1;
    } 
    this.setData({
        ground:ground,
      snake:arr
    });
  //  var y=this.data.snake[0][1];
  //  var x=this.data.snake[0][0];
  //   this.data.ground[x][y]=0;
  //   console.log(this.data.ground[x]);
  //   console.log(this.data.snake);
  //   for(var i=0;i<this.data.snake.length-1;i++){
  //     this.data.snake[i]=this.data.snake[i+1];
  //   }
  //   this.data.snake[this.data.snake.length-1][1]++;
  //   for(var j=1;j<this.data.snake.length;j++){
  //     this.data.ground[this.data.snake[j][0]][this.data.snake[j][1]]=1;
  //   }
    return true;
  },
  changeTop:function(){
    var arr=this.data.snake;
    var len=this.data.snake.length;
    var snakeHEAD=arr[len-1][1];
    var snakeTAIL=arr[0];
    var ground=this.data.ground;
    ground[snakeTAIL[0]][snakeTAIL[1]]=0; 
    for(var i=0;i<len-1;i++){
        arr[i]=arr[i+1];  
    };
    var x=arr[len-1][0]-1;
    var y=arr[len-1][1];
    arr[len-1]=[x,y];
      this.checkGame(snakeTAIL);
    for(var i=1;i<len;i++){
      ground[arr[i][0]][arr[i][1]]=1;
    } 
    this.setData({
      ground:ground,
      snake:arr
    });
    return true;
  },
  changeBottom:function(){
    var arr=this.data.snake;
    var len=this.data.snake.length;
    var snakeHEAD=arr[len-1];
    var snakeTAIL=arr[0];
    var ground=this.data.ground;
    ground[snakeTAIL[0]][snakeTAIL[1]]=0; 
    for(var i=0;i<len-1;i++){
        arr[i]=arr[i+1];  
    };
    var x=arr[len-1][0]+1;
    var y=arr[len-1][1];
    arr[len-1]=[x,y];
    this.checkGame(snakeTAIL);
    for(var i=1;i<len;i++){
      ground[arr[i][0]][arr[i][1]]=1;
    } 
    this.setData({
      ground:ground,
      snake:arr
    });
    return true;
  },
  checkGame:function(snakeTAIL){
    var arr=this.data.snake;
    var len=this.data.snake.length;
    var snakeHEAD=arr[len-1];
    if(snakeHEAD[0]<0||snakeHEAD[0]>=this.data.rows||snakeHEAD[1]>=this.data.cols||snakeHEAD[1]<0){
        clearInterval(this.data.timer);
          this.setData({
          modalHidden: false,
            }) 
    }
    for(var i=0;i<len-1;i++){
      if(arr[i][0]==snakeHEAD[0]&&arr[i][1]==snakeHEAD[1]){
        clearInterval(this.data.timer);
          this.setData({
            modalHidden: false,
          })
      }
    }
    if(snakeHEAD[0]==this.data.food[0]&&snakeHEAD[1]==this.data.food[1]){
      arr.unshift(snakeTAIL);
      this.setData({
        score:this.data.score+10
      });
      this.storeScore();
      this.creatFood();
    }
  },
  modalChange:function(){
  this.setData({
      score: 0,
    ground:[],
    snake:[],
      food:[],
      modalHidden: true,
      direction:''
  })
  this.onLoad();
  }
});

附:完整实例源码点击此处本站下载

希望本文所述对大家微信小程序开发有所帮助。

Javascript 相关文章推荐
jQuery对象[0]是什么含义?
Jul 31 Javascript
javascript中的注释使用与注意事项小结
Sep 20 Javascript
$.extend 的一个小问题
Jun 18 Javascript
js实现表单检测及表单提示的方法
Aug 14 Javascript
第三章之Bootstrap 表格与按钮功能
Apr 25 Javascript
JS实现漂亮的时间选择框效果
Aug 20 Javascript
JavaScript和jQuery制作光棒效果
Feb 24 Javascript
JS实现新建文件夹功能
Jun 17 Javascript
详解vue.js的事件处理器v-on:click
Jun 27 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
Oct 30 Javascript
基于JavaScript实现贪吃蛇游戏
Mar 16 Javascript
react基本安装与测试示例
Apr 27 Javascript
详解Angular2学习笔记之Html属性绑定
Jan 03 #Javascript
Angular2学习笔记之数据绑定的示例代码
Jan 03 #Javascript
vue、react等单页面项目应该这样子部署到服务器
Jan 03 #Javascript
AngularJS实现的2048小游戏功能【附源码下载】
Jan 03 #Javascript
浅谈node模块与npm包管理工具
Jan 03 #Javascript
JavaScript基于面向对象实现的猜拳游戏
Jan 03 #Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
Jan 03 #Javascript
You might like
php cookie使用方法学习笔记分享
2013/11/07 PHP
php curl模拟post请求小实例
2013/11/13 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
一个高效的JavaScript压缩工具下载集合
2007/03/06 Javascript
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
JavaScript 的继承
2011/10/01 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
[02:33]DOTA2英雄基础教程 司夜刺客
2013/12/04 DOTA
python实现DES加密解密方法实例详解
2015/06/30 Python
Python 变量类型详解
2018/10/10 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
HTML5+CSS3绘制锯齿状的矩形
2016/03/01 HTML / CSS
2015年政务公开工作总结
2015/05/19 职场文书
2015年度企业工作总结
2015/05/21 职场文书
运动会主持人开幕词
2016/03/04 职场文书
MySQL 全文索引使用指南
2021/05/25 MySQL
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
2022/04/13 Java/Android