贪吃蛇程序 php,微信小程序-贪吃蛇教程实例

很久很久以前,差不多大半年前吧,笔者发布了一篇关于OC版贪食蛇开发的文章,时隔多月,微信小程序横空出世,于是闲来无事的我又写了一个小程序版

下面这段话请务必阅读

笔者是做iOS的,而小程序大部分都是前端的知识,笔者之前没有做过类似开发,所以代码写的相当烂,很多东西都是一边查资料一边写的,请各位轻喷,阿门!

进入正题

页面布局

关于小程序笔者就不做介绍了,官方有详细文档,我们还是先来看张图吧

dddec9605e8e2ba6d49ebfe7d023b081.png

就是这个样子的,游戏界面跟之前的OC版是差不多的,以笔者的水平,只能设计成这样了,毕竟不是专业的,话说这蛇怎么长的像个J(和)B(谐)啊:joy:

先来看看用来添加组件的wxml文件

up

left

{{btnTitle}}

right

down

内容是相当简单滴,上面一个view,里面放一个画布,下面一个view,里面放5个按钮

再来看看wxss布局

01d628e7de2d57daa53b78831d3ae860.png

内容不多,其实笔者对CSS也不是很了解,很多年前学习过,然而早随着:hankey:排出去了,也许还有更优的布局方式,不过凑合着用吧

功能实现

布局还是很简单的,虽然不熟,但是多尝试几下还是可以弄出来的,接下来功能逻辑的实现才是重点,编程语言当然是js了。

话说笔者当年学js的时候,可是写了满满一本的笔记,然而......算了,过去的就让他过去吧,往事不提也罢。

思路其实与OC版的一样

蛇:创建一个点坐标数组,然后以坐标点为中心在画布上画矩形

食物:随机一个坐标点,该点不能在蛇身上,否则重新随机

蛇的移动:把蛇尾的坐标移到蛇头前面就行了

吃到食物:每次蛇移动完毕后,如果蛇头的坐标与食物的坐标一样,则蛇增长

蛇的增长:在蛇尾后面加一个点坐标即可

游戏结束:蛇头越界或撞到自己身体即游戏结束

创建蛇//创建蛇,初始为5节,nodeWH为矩形的边长

function createSnake(){

nodes.splice(0, nodes.length) //清空数组

for (var i = 4; i >= 0; i--) {

var node = new Node(nodeWH * (i + 0.5), nodeWH * 0.5)

nodes.push(node);

}

}

创建食物function createFood(){

//矩形的边长为10,画布宽度为250,高度为350,所以x只能取5-245,y只能取5-345

var x = parseInt(Math.random() * 24) * nodeWH + nodeWH * 0.5

var y = parseInt(Math.random() * 34) * nodeWH + nodeWH * 0.5

//如果食物的坐标在蛇身上,则重新创建

for (var i = 0; i < nodes.length; i++) {

var node = nodes[i]

if (node.x == x && node.y == y) {

createFood()

return

}

}

//Node为自定义的类,有两个属性x和y,表示坐标

food = new Node(x,y)

}

蛇的移动

蛇的移动是有方向的,所以用一个变量direction来记录蛇的移动方向,游戏开始时,默认是向右移动。

上面有说到蛇的移动就是把蛇尾的坐标移到蛇头前面,但是这个前面并不是固定的,而是根据方向来判断的,如果向右移动则右边为前方,以此类推

吃到食物与蛇增长

每次移动完毕后,判断蛇头的坐标是否与食物的坐标相等就OK了,吃到食物后蛇的长度会增加,并且要创建一个新的食物function isEatedFood(){

var head = nodes[0]

if (head.x == food.x && head.y == food.y) {

score++

nodes.push(lastPoint)

createFood()

}

}

上面的代码中,lastPoint就是蛇每次移动前,蛇尾的坐标,如果移动后吃到食物,那么直接在移动前的蛇尾处加上一节即可

游戏结束

每次移动后,都要判断蛇头是否超过画布,或者撞到自己的身体function isDestroy(){

var head = nodes[0]

//判断是否撞到自己身体

for (var i = 1; i < nodes.length; i++) {

var node = nodes[i]

if (head.x == node.x && head.y == node.y) {

gameOver()

}

}

//判断水平方向是否越界

if (head.x < 5 || head.x > 245) {

gameOver()

}

//判断垂直方向是否越界

if (head.y < 5 || head.y > 345) {

gameOver()

}

}

界面绘制

每次移动都要绘制,所以需要一个定时器,笔者用的setIntervalfunction move(){

lastPoint = nodes[nodes.length - 1]

var node = nodes[0]

var newNode = {x: node.x, y: node.y}

switch (direction) {

case 'up':

newNode.y -= nodeWH;

break;

case 'left':

newNode.x -= nodeWH;

break;

case 'right':

newNode.x += nodeWH;

break;

case 'down':

newNode.y += nodeWH;

break;

}

nodes.pop()

nodes.unshift(newNode)

moveEnd()

}

function startGame() {

if (isGameOver) {

direction = 'right'

createSnake()

createFood()

score = 0

isGameOver = false

}

timer = setInterval(move,300)

}

网上说setInterval的性能并不怎么好,建议用requestAnimationFrame,但是很遗憾,笔者不会用,准确的说是不知道怎么暂停var animateId = 0

function move(){

.

.

.

animateId = requestAnimationFrame(move)

}

function startGame(){

.

.

.

animateId = requestAnimationFrame(move)

}

使用上面的方法可以实现蛇的移动与界面重绘,然而每次执行animateId都会被赋予新的值,所以使用cancelAnimationFrame(animateId)无法暂停,如果有懂前端开发的大神请指导下

差不多整个逻辑就是这样的,喜欢研究的可以自己尝试下

【相关推荐】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat启动时自动加载Servlet

转自&#xff1a;http://zhaoyongpan.blog.51cto.com/2714930/676239 想实现这样的功能&#xff1a; 1. Tomcat启动时随即启动Servlet; 2. Servlet启动时定时执行一个任务。 要点&#xff1a; 1、Tomcat中启动Servlet时&#xff0c;只需要在Servlet所在的工程的配置文件web…

internal java compiler error_Java异常处理总结

背景 最近专门负责团队的项目质量。我在治理异常日志过程中&#xff0c;总结了一下Java的异常处理。上面是我整理的最近自己比较常见的异常知识地图。异常知识地图概述 从异常知识地图最左边的根开始看&#xff0c;地图从左到右的连线连接的类之间有实实在在的父…

cuda nvcc版本不一致_windows 验证CUDA和CUDNN是否安装成功

安装完成CUDA&#xff0c;使用 nvcc -V 验证是否安装成功&#xff0c;看到如下信息说明安装成功接下来就可以安装 cuDNN 了。安装cuDNN下载 cuDNN&#xff0c;下载之前需要先注册一下 Nvidia 的账号&#xff0c;下载地址为&#xff1a;https://developer.nvidia.com/rdp/cudnn-…

Nova Cell

Nova Cell V2 详解 现在 &#xff0c;OpenStack 在控制平面上的性能瓶颈主要在 Message Queue 和 Database 。 尤其是 Message Queue , 随着计算节点的增加 &#xff0c; 性能变的越来越差 。 为了应对这种情况 &#xff0c; Nova 很早之前提出来 nova-cell ( 以下以 cellv1 代…

Android 通过WIFI状态监听广播,判断进入指定wifi范围

原文地址&#xff1a;http://blog.csdn.net/kongxiuqi/article/details/52524500 --------------------------------------------- WIFI状态变化会发送广播&#xff0c;一些可用的广播在WifiManger.java中可以看到。 广播一&#xff1a;WIFI 状态开关变化的监听&#xff0c;en…

java 截取byte数组_2020年的秋招已经开始了!最新Java面试题大全(文末附参考答案)送给大家...

包含的模块本文分为十九个模块&#xff0c;分别是&#xff1a;Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM共包含 208 道面…

MVP模式在Android项目中的使用

烦了在Activity中编写太多的代码&#xff0c;该app由我来主导。就选择用MVP模式。 概述 MVP是模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;、主持人&#xff08;Presenter&#xff09;的缩写&#xff0c;分别代表项目中3个不同的模块。 模型&#…

运行时错误7内存溢出_C++程序运行时的内存模型

C程序在运行时会将内存划分为4个区域&#xff1a;1代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理2全局区&#xff1a;存放程序的全局变量、静态变量、常量3栈区&#xff1a;由编译器进行自动分配和释放&#xff0c;存放函数的参数值&#xff0c;局部…

玩转Android之MVVM开发模式实战,炫酷的DataBinding!

原文&#xff1a;http://blog.csdn.net/u012702547/article/details/52077515 --------------------------------------------------------- MVP可以结合android的DataBinding -------------------------以下转载--------------- C# 很早就有了MVVM的开发模式&#xff0c;An…

打造一款便携版的Sublime Text

https://segmentfault.com/a/1190000000707661 https://www.cnblogs.com/52cik/p/sublime-diy.html 直接安装Sublime Text&#xff0c;不要打开 大家可以参照上文提到的《Sublime Text 全程指引》中的步骤去进行安装。我这里使用的是Sublime Text 2&#xff0c;其实3也是一样的…

confluence创建页面加载缓慢_树莓派4B使用docker安装confluence

说明confluence是一个专业的企业知识管理与协同软件&#xff0c;可以用于构建企业wiki。通过它可以实现团队成员之间的协作和知识共享。现在大多数公司都会部署一套confluence&#xff0c;用作内部wiki。另外confluence也可以作为个人的知识管理工具来用&#xff0c;只需要花10…

matlab粒子加速器仿真,粒子群算法优化PID参数 仿真不出结果 程序如下

用的是《MATLAB智能算法30个案例分析》中的程序1.文件名为PSO_PID.mfunction z PSO_PID(x)assignin(base,Kp,x(1)); % 粒子群依次赋值给Kp 这部分运行结果> PSO_PIDassignin(base,Ki,x(2)); …

CentOS5、6的启动流程

CentOS5/6的启动流程启动流程画了张图,看着更清晰些: (centos7的启动流程变化挺大的,这部分待补充)补充(/etc/rc.d/rc.local 不属于任何服务,为特殊文件,可将不能定义为服务又想开机运行的命令定义在此文件中)添加自定义服务:[rootel5 init.d]# vi /etc/init.d/testsrv #!/bin…

Spark交互式分析平台Apache Zeppelin的安装

Zeppelin介绍 Apache Zeppelin提供了web版的类似ipython的notebook&#xff0c;用于做数据分析和可视化。背后可以接入不同的数据处理引擎&#xff0c;包括Spark, Hive, tajo等&#xff0c;原生支持Scala, Java, shell, markdown等。它的整体展现和使用形式和Databricks Cloud是…

win7 php zend,win7系统打开WZend Studio PHP出错的解决方法

很多朋友安装win7系统后&#xff0c;在使用的过程中会遇到win7系统打开WZend Studio PHP出错的情况&#xff0c;可能有很多用户还是不能自己处理win7系统打开WZend Studio PHP出错的问题&#xff0c;其实简单的来说处理win7系统打开WZend Studio PHP出错的问题只需要按照 1、在…

9个元素换6次达到排序序列_C语言必学的12个排序算法:希尔排序(第3篇)

基本思想希尔排序&#xff08;Shells Sort&#xff09;&#xff0c;以发明人命名&#xff0c;又称为缩小增量排序&#xff0c;也是一种插入排序算法。主要思想&#xff1a;直接插入排序算法时间和待排数据有关&#xff0c;其平均复杂度是O(n^2)&#xff0c;但是在待排数据已经有…

java快捷键禁用_pycharm 掌握这些快捷键,你就是大神!!

最重要的快捷键1. ctrlshiftA:万能命令行 2. shift两次:查看资源文件新建工程第一步操作1. module设置把空包分层去掉,compact empty middle package 2. 设置当前的工程是utf-8,设置的Editor-->File Encodings-->全部改成utf-8,注释1. ctrl/:单行注释光标操作1. ctrlalte…

如何在 5 分钟内读懂区块链的架构思维?

作为入门者&#xff0c;如何在最短的时间了解区块链技术&#xff0c;区块链思维&#xff0c;以及比特币的金融原理呢&#xff1f;本文尝试从比特币的架构设计思维出发&#xff0c;让人从宏观上搞清楚区块链的技术本质。 本文授权转载自阿里技术 作者 | 郑吉 区块链不是一种技术…

arduino 上传项目出错_Arduino多核编程:简单例子

不管你是Arduino领域的新手还是经验丰富的开发人员&#xff0c;很可能你还只使用过单核在进行编程。 这没有什么好笑的---- 事实上&#xff0c;直到几天前我才使用Arduino IDE进行了第一次多核编程。 我和所有其他Arduino粉丝都非常喜欢IDE的易用性以及MicroController 开发所需…

Hadoop-RPC应用demo

Hadoop里的rpc框架可以单独拿出来使用。jar包全在hadoop-common工程里。 导入hadoop-common工程里&#xff08;hadoop-2.7.3为例&#xff09;&#xff1a; hadoop-common-2.7.3.jar \hadoop-2.7.3\share\hadoop\common\lib下的全部jar包 实例 rpc.client 客户端 rpc.pr…