为什么80%的码农都做不了架构师?>>>   

我自己也写过一个贪食蛇的小游戏,不过是对dom的操作,微信小游戏是采用js语法基于canvas的开发。为了省事在网上直接搜了一个基于canvas的贪食蛇实现。

非常感谢作者: 不是加多宝的宝 (来自简书)

文章地址:https://www.jianshu.com/p/ba5031c20cde

不过作者的代码如果想完全在小游戏中使用需要做一些修改,比如eval的支持问题,alert的支持问题,还有就是源代码的事件是键盘事件,蛇的宽高太小等。我对源代码做了上述部分的修改,下面是目录结构和代码,大家可以创建项目,复制代码演示:

根目录:

js目录:

libs目录保持不变,采用快速生成会自动生成这个目录;

libs目录:

game.js

import './js/libs/weapp-adapter'
import './js/libs/symbol'import Main from './js/main'

js/main.js

var c = canvas.getContext('2d')
console.log(canvas)var mWidth = canvas.width; //当前可视区域的宽,即canvas的宽
var mHeight = canvas.height; //当前可视区域的高,即canvas的高
var unit = 15; //设定每个格子的边长
var mwid = mWidth / unit; //计算当前横向格子数量
var mhei = mHeight / unit; //计算当前竖向格子数量
var point = point = {x : 0 , y : 0}; //记录食物的坐标的变量初始化
var score = 0; //记录成绩的变量初始化//注意本对象,并不改变其在画布上的样子,只是负责改变状态,改变样子的另有方法
//蛇对象
var shake = {startX: 3,//开始头x坐标startY: 0,//开始头y坐标currOri: 'right',//初始化方向ori: [['left', 'right'], ['up', 'down']],//相逆方向数组oriss: ['left', 'right', 'up', 'down'],//所有允许的方向,用来判断方向合法性,在canChangeOri方法mes: [{x: 3,y: 0},{x: 2,y: 0},{x: 1,y: 0}],//初始化蛇的身体坐标,初始长度3//坐标为格子坐标非像素坐标//添加一个身体的方法add: function () {//判断当前尾部方向var last = this.mes[this.mes.length - 1]; //获取最后一个身体var plast = this.mes[this.mes.length - 2]; //获取倒数第二个身体var px = last.x - plast.x;var py = last.y - plast.y; //根据计算最后两个身体的坐标差,来计算添加身体应在的方向//计算新加元素位置var newEle = {x: last.x + px,y: last.y + py}; //创建一个新身体this.mes.push(newEle); //将新身体假如身体数组},//移动方向方法,下面几个方法类似,只是方向不同moveup: function () {var pre = this.mes[0]; //记录第一个身体,即头部的坐标this.mes[0] = {x: pre.x,y: pre.y - 1}; //让头部的坐标像上移动一格this.move(pre); //调用移动身体的方法},movedown: function () {var pre = this.mes[0];this.mes[0] = {x: pre.x,y: pre.y + 1};this.move(pre);},moveleft: function () {var pre = this.mes[0];this.mes[0] = {x: pre.x - 1,y: pre.y};this.move(pre);},moveright: function () {var pre = this.mes[0];this.mes[0] = {x: pre.x + 1,y: pre.y};this.move(pre);},//移动身体move: function (pre) { //参数为之前第一个身体,即头部的位置对象var tmp;for (var i = 1; i < this.mes.length; i++) { //遍历每一个身体节点tmp = this.mes[i];this.mes[i] = pre;pre = tmp;} //并且把每个节点的左边变化成前一个节点的坐标,达到依次向前的目的},//改变方向changeOri: function (ori) {if (this.oriss.indexOf(ori) == -1) { //判断方向是否在允许方向内return;}if (!this.canChangeOri(ori)) { //判断改变方向是否合法return;}this.currOri = ori; //如果上面两个都通过,改变方向},//判断改变的方向是否合法canChangeOri: function (ori) { //参数为方向字符串 例如:leftif (ori == this.currOri) { //判断方向是否为当前方向,如果是则无需操作return false;}var oris = null;for (var i in this.ori) { //判断是否改变方向为当前方向的逆方向if (this.ori[i].indexOf(this.currOri) != -1) {oris = this.ori[i];break;}}if (oris.indexOf(ori) != -1) {return false;}return true;},//判断是否碰撞到了自己isCrashSelf: function () {var head = this.mes[0]; //获取头节点for (var i = 1; i < this.mes.length; i++) { //遍历身体节点if (this.mes[i].x == head.x && this.mes[i].y == head.y) { //判断头结点是否碰撞身体return true;}}return false;},//判断是否撞墙isCrashWell: function (width, height) { //参数为横竖的格子数量var head = this.mes[0]; //获取头节点if (head.x < 0 || head.y < 0) { //判断是否撞左上墙return true;}if (head.x > (width - 1) || head.y > (height - 1)) { //判断是否撞右下墙return true;}return false;},//处理吃东西handleAdd: function () {var head = this.mes[0]; //获取头节点if (head.x == point.x && head.y == point.y) { //判断头节点是否碰撞食物节点,食物在外定义this.add(); //调用添加身体getPoint(); //生成一个节点setPoint(); //画一个节点score++; //加分//s.innerHTML = score; //显示分数}}
}//生成点
function getPoint() {point.x = Math.floor(Math.random( ) * mwid);point.y = Math.floor(Math.random( ) * mhei);
}//画点
function setPoint() {c.rect(point.x * unit, point.y * unit, unit, unit);
}//画蛇
function setShake() {for (var i = 0; i < shake.mes.length; i++) {//c.fullStyle = '#ffffff';c.strokeStyle = 'red';c.rect(shake.mes[i].x * unit, shake.mes[i].y * unit, unit, unit);}c.stroke();
}//清屏
function clear() {c.clearRect(0, 0, mWidth, mHeight);
}//开始游戏
var looper=null;
function startGame() {clearInterval(looper); //终止游戏主循环//初始化状态shake.mes = [{x: 3,y: 0},{x: 2,y: 0},{x: 1,y: 0}];shake.currOri = 'right';c.beginPath(); //开始画笔getPoint(); //设置点setPoint();setShake(); //话蛇//画c.stroke();//游戏主循环looper = setInterval(function () {//var method = 'move' + shake.currOri + '()'; //调用方向函数//eval('shake.' + method); //执行方向方法/*移动*///ori: [['left', 'right'], ['up', 'down']],if (shake.currOri =="left"){shake.moveleft();} else if (shake.currOri == "right"){shake.moveright();} else if (shake.currOri == "up"){shake.moveup();} else if (shake.currOri == "down"){shake.movedown();}clear(); //清理屏幕c.beginPath(); //开始绘制shake.handleAdd(); //处理吃东西setPoint(point); //设置点setShake(); //画蛇if (shake.isCrashWell(mwid, mhei)) { //是否撞墙,未使用是否吃自己。想用调用shake.isCrashSelf方法。clearInterval(looper);//console.log('you die');//console.log('you die , and your score is ' + score);/*提示*/wx.showModal({title: '提示',content: '游戏结束 , 你的分数是 ' + score,success: function (res) {if (res.confirm) {console.log('用户点击确定')startGame()} else if (res.cancel) {console.log('用户点击取消')}}})}},200);
}
/*
启动
*/
wx.showModal({title: '提示',content: '是否开始游戏 ',success: function (res) {if (res.confirm) {console.log('用户点击确定')startGame()} else if (res.cancel) {console.log('用户点击取消')}}
})//键盘监听
// window.onkeyup = function (key) {
//   var ori = '';
//   switch (key.keyCode) {
//     case 65:
//       ori = 'left';
//       break;
//     case 68:
//       ori = 'right';
//       break;
//     case 87:
//       ori = 'up';
//       break;
//     case 83:
//       ori = 'down';
//       break;
//   }
//   if (ori == '') {
//     return;
//   }
//   //改变蛇走向
//   shake.changeOri(ori);
// }
/*
方向
*/
var startX=0;
var startY = 0;
var moveEndX  = 0;
var moveEndY  = 0;
wx.onTouchStart(function (e) {//pageX//pageY//console.log(e.touches[0])startX = e.changedTouches[0].pageX;startY = e.changedTouches[0].pageY;
})wx.onTouchMove(function (e) {// console.log(e.touches[0])
})wx.onTouchEnd(function (e) {//console.log(e.changedTouches[0])moveEndX = e.changedTouches[0].pageX;moveEndY = e.changedTouches[0].pageY;var X = moveEndX - startX;var Y = moveEndY - startY;if (Math.abs(X) > Math.abs(Y) && X > 0) {console.log("right");shake.changeOri("right");}else if (Math.abs(X) > Math.abs(Y) && X < 0) {console.log(" left");shake.changeOri("left");}else if (Math.abs(Y) > Math.abs(X) && Y > 0) {console.log("down");shake.changeOri("down");}else if (Math.abs(Y) > Math.abs(X) && Y < 0) {console.log("up");shake.changeOri("up");}else {console.log("just touch");}
})wx.onTouchCancel(function (e) {console.log(e.touches)
})

模拟器中效果:

也可以点击编辑器预览按钮扫描二维码真机试玩。

转载于:https://my.oschina.net/tbd/blog/1649337

在微信小游戏中开发一个贪食蛇相关推荐

  1. 微信小游戏云开发在cocos creator中的设置

    之前用three.js手撸了一个微信小游戏半成品,但是因为这种手撸的方式,程序和美术很难配合,而且开发难度和时间成本太大,最终决定还是用cocos creator进行微信小游戏的开发. 微信小程序早已 ...

  2. 微信小游戏客户端开发环境搭建

    微信小游戏客户端开发环境搭建 开发工具 环境配置 发布小游戏 一直以来,弄App形式的游戏比较多,近年来,微信小游戏火了起来.出于好奇,研究了一番,觉得还是挺有意思的,想和大家分享下. 官方手册网址: ...

  3. 在微信小游戏中实现语音互动

    之前在unity里尝试用过语音控制,当时的想法是实时控制游戏角色的移动与攻击,这在通过在线api解析语义的方式下体验一般,不过也想到在实时性要求不那么高的互动场景应该可以用起来.这里就在微信小游戏中尝 ...

  4. 微信小游戏云开发数据库

    关于微信小游戏云开发数据库的使用 初始化云开发 // 可以传入一个默认使用的环境名称 wx.cloud.init() 初始化数据库 // 这里的环境参数应传入云开发数据库中对应环境id const d ...

  5. 对于微信小游戏JS开发的一点整理

    对于微信小游戏JS开发的一点整理 我像大家一样,遇到了不懂的喜欢在csdn上搜索解决问题,这篇文章参考了csdn上一些博主的文章,故标为转载,主要是参考博主:陈田田. tips 代码包大小上限为4MB ...

  6. CocosCreator微信小游戏排行榜开发

    CocosCreator微信小游戏排行榜开发 开发前言 步骤1 开发前言 第一次接触微信小游戏开发的小伙伴,可以看看排行榜的开发和注意事项: 一.开发微信排行榜的话,用户的信息需要从微信提供的API获 ...

  7. h5小游戏嵌入到微信小游戏中(以egret为例)

    H5小游戏源代码不能直接转换为微信小游戏发布,但是可以把现有的h5小游戏嵌入到微信小游戏中,这里使用egret举例.使用egret创建一个空的微信小游戏,在main.ts中资源加载完成后执行Webvi ...

  8. 解决CocosCreator 在微信小游戏中使用Socket.io 报错的问题

    解决CocosCreator 在微信小游戏中使用Socket.io 报错的问题 参考文章: (1)解决CocosCreator 在微信小游戏中使用Socket.io 报错的问题 (2)https:// ...

  9. 微信小程序中开发的小坑

    微信小程序中开发的小坑 本文随时更新微信小程序开发过程中遇到的小坑.现已收集如下. 微信小程序编译后的大小不能超过1MB. 微信小程序不能建立两个(含)以上的WebStock连接.

最新文章

  1. LightSpeed 的Left Join Bug解决方案
  2. 在DNN中如何使FriendlyURL使用PageName作为页面名称
  3. double小数点后最多几位_30年前很火的零食,00后最多吃过2种,全吃过的至少是“叔叔辈”...
  4. 最长公共子序列和追踪解
  5. 割点和桥算法——摘自《算法艺术与信息学竞赛》
  6. 使用Spock 1.2简化对遗留应用程序的集成测试
  7. 来吧~不要互相伤害,ssh之间要互相信任
  8. java导_java——导入功能
  9. VBA—EXCEL操作集合—05
  10. 关于材料设计vector矢量图形
  11. easydarwin 安装_win10安装EasyDarwin并作为流媒体服务器的推流和拉流实例
  12. 2021中国开源年报发布!一篇报告带你读懂中国开源的2021~
  13. 生物信息中的Python 01 | 从零开始处理基因序列
  14. 运维工程师是桥的护栏_海沧大桥护栏救过不少车 海沧大桥护栏如何养护
  15. 深度解析CentOS通过日志反查***
  16. python:for循环和range()函数用法
  17. amazon - sellercentral 之 sellercentral report - monthly storage fee report
  18. 景安服务器怎么重装系统,怎么全盘重装系统|全盘重装系统步骤
  19. 为什么协程比线程的执行效率更高?
  20. 【hash使用场景之房间号创建】

热门文章

  1. 台式计算机的主流配置,目前, 台式电脑的主流配置是什么样的?
  2. Typora的崩溃导致文件丢失
  3. 通过teamviewer访问内网
  4. SQL 语法查询手册
  5. 山东省计算机应用能力等级考试,山东省2017年9月全国计算机等级考试报名时间...
  6. OSAL(操作系统抽象层)
  7. 《花雕学AI》07:AI脑洞大开-盘点最火爆人工智能ChatGPT的23种新颖用法
  8. 人脸检测卷积神经网络_卷积神经网络和计算机视觉的人脸面具检测算法
  9. 《Django开发教程》1.2 在ubuntu上安装Django
  10. 苹果要给高通多少钱?瑞银分析师预计最多支付60亿美元