貪吃蛇程序 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.pswp.cn/news/538928.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538928.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538928.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python遙感數據有償處理_利用python讀寫tiff遙感影像數據

from osgeo import gdal# 讀圖像文件def read_img(filename):dataset gdal.Open(filename) # 打開文件im_width dataset.RasterXSize # 柵格矩陣的列數im_height dataset.RasterYSize # 柵格矩陣的行數im_geotrans dataset.GetGeoTransform() # 仿射矩陣im_proj dataset.G…

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;地圖從左到右的連線連接的類之間有實實在在的父…

java異步刷新集合,同步和異步集合的性能測試,異步集合性能測試,package cn.o

同步和異步集合的性能測試&#xff0c;異步集合性能測試,package cn.opackage cn.outofmemory.snippets.core;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.Vector;import java.util.concurrent.TimeUnit;public class Co…

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…

2018年度最佳網頁設計與開發教程

任何一個網站從開發到最終上線&#xff0c; 都是需要團隊協作且謹慎的一個過程&#xff0c;而實際中往往會遇到各類問題&#xff0c;所以網頁設計師通常需要扮演多種角色&#xff0c;除了掌握必備的網頁設計技能外&#xff0c;更應該對后期的開發流程及內容有所了解&#xff0c…

mysql_ping()函數的作用以及返回值的類型正確的是,[單選] mysql_ping()函數的作用以及返回值的類型正確的是:()...

[單選] mysql_ping()函數的作用以及返回值的類型正確的是&#xff1a;()更多相關問題中華田園犬&#xff0c;雄性&#xff0c;2歲&#xff0c;昨晚外出未歸&#xff0c;今晨發現患犬精神沉郁&#xff0c;呼吸急促&#xff0c;體溫39℃&#xff0c;左胸側壁中下部有創1884年新疆…

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;局部…

php strip_tags 少,詳解PHP函數 strip_tags的用法不足之處

這篇文章主要介紹了詳解PHP函數 strip_tags 處理字符串缺陷bug的相關資料,需要的朋友可以參考下詳解PHP函數 strip_tags 處理字符串缺陷bugPHP 函數 strip_tags() 是一個常用函數&#xff0c;該函數可以剝去字符串中的 HTML、XML 以及 PHP 的標簽。極大方便了對字符串的操作&am…

玩轉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…

python用map提取一個數的個十百位數_如何使用python中的map函數?

我們在使用python過程中&#xff0c;為了避免錯誤刪除&#xff0c;會選擇做好一個序列后可以插入另外的序列中做為新序列的一部分內容。方便完成一些復雜的工程或多個片段分別編輯后再串成一個完整工程的操作。之前小編向大家介紹了在序列中起到累計作用的reduce函數(https://w…

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是…