亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JS實現的貪吃蛇游戲案例詳解

2024-05-06 16:50:28
字體:
來源:轉載
供稿:網友

本文實例講述了JS實現的貪吃蛇游戲。分享給大家供大家參考,具體如下:

github項目地址:https://github.com/LEERTRT/Snake

在<script></script>中,文檔加載完畢后調用:

$(function () {  var game = new Game("canvas");  game.init();});

其中構造函數Game()接收canvas的id作為參數,實例化對象以后,調用init()函數,init()函數里面有三個函數,接下來會一個一個說明。

/** * 初始化函數,生成構造函數實例后調用此函數 */this.init = function () {  /**   * 初始化畫布和果實   */  this.initData();  /**   * 1.清空畫布;2.畫背景格子;3.畫蛇;4.畫果實   */  this.draw();  /**   * 綁定事件:方向和速度控制   */  this.bindEvents();};

第一個,initData():在initData()函數里面,聲明畫布,果實,畫布大小,格子數量,方向,速度,蛇等:

var canvas = document.getElementById(id);if (canvas && canvas.getContext) {  this.ctx = canvas.getContext('2d');}this.foodNode = null;//果實this.size = canvas.width || $(canvas).width();//畫布大小this.columns = 50;//畫布行列數this.direction = 0;//方向this.speed = 10;//速度this.bodyNodes = [];//蛇體

然后隨機生成蛇的位置:

var rdx = Math.round(Math.random() * (this.columns - 1));var rdy = Math.round(Math.random() * (this.columns - 1));

把隨機生成的rdx, rdy放進記錄蛇體的數組中:

this.bodyNodes.push({  x: rdx, y: rdy});

到此,initData()完成。

第二個,draw():draw()函數包含四步:1.清空畫布;2.畫背景;3.畫蛇;4.畫果實:

this.draw = function () {  /**   * 清空畫布   */  this.clear();  /**   * 畫畫布   */  this.drawBG();  /**   * 畫蛇體   */  this.drawBody();  /**   *畫果實   */  this.drawFood();};

1.清空畫布

使用clearRect(0,0,size,size)即可:

this.ctx.clearRect(0, 0, this.size, this.size);

2.畫背景

每個格子大小 = 畫布尺寸/格子數量,然后一行一行畫就行了,和畫棋盤一樣:

var _this = this;var x = 0, y = 0, size = _this.size / _this.columns;_this.ctx.strokeStyle = "rgba(124,124,124,0.1)";//一行一行畫畫布for (var i = 0; i < _this.columns; i++) {  y = i * size;  for (var j = 0; j < _this.columns; j++) {    x = j * size;    _this.ctx.strokeRect(x, y, size, size);  }}

3.畫蛇

前面在initData()里面,把隨機生成的蛇的位置放進了bodyNodes數組里面,

這里把bodyNodes里面的元素用each()取出來畫即可。因為后面當蛇吃了果實后,bodyNodes里面的

元素會增加,所以用each取出所有元素繪畫,現在是在初始化階段,bodyNodes里面只有在initData()

的一個隨機生成的元素。

var nodes = _this.bodyNodes;$.each(nodes, function (i, node) {  _this.ctx.fillRect(node.x * size, node.y * size, size, size);});

4.畫果實

畫果實的時候,先判斷foodNode是否存在,存在的話就直接畫,不存在隨機生成位置,

注意,這時候要判斷隨機生成的果實位置有沒有和蛇重合,重合了要重新畫:

//如果果實重新出現的位置和蛇體重合,重畫果實if (_this.Utils.contains(_this.bodyNodes, {x: rdx, y: rdy})) {   _this.drawFood();} else {   _this.ctx.strokeRect(rdx * size, rdy * size, size, size);   _this.foodNode = {x: rdx, y: rdy};}

到此,初始化畫布和果實數據;繪畫已經完成,這一塊屬于靜態,接下來是動態的綁定事件。

這里主要描述貪吃蛇動態內容,比如前進,吃果實后變大,越界,速度控制等。

在前面,init()函數已經 完成了initData()和draw(),接下來是最后一個函數,bindEvents()。

在bindEvents()函數里面,有2個函數:①方向控制;②時間控制。

①方向控制directionContoller

document.body.onkeydown捕獲按鍵,對ketCode進行判斷,左(37),上(38),右(39),下(40),再將direction根據keyCode置為自己設置的標志即可。這里需要注意一點:如果這時候的方向為x,而按下的方向為-x,那么按鍵無效。比如現在方向是向左,而按下右是無效轉彎的。

case 37: // 左, 1表示右,即當蛇向右行時,按左鍵不能改變方向,下面同理  if (_this.direction == 1) return;  _this.direction = -1;  break;

設置好方向后,調用move()函數,這里控制蛇的移動,就是說到底就是在蛇體數組里面新增頭元素,去掉尾元素,這里還要進行2個判斷:1)蛇有沒有咬到自己;2)有沒有出界。

調用food()方法判斷蛇是否吃到果實,在蛇數組里面設置好元素后,draw()重繪,以此完成了蛇的移動和吃果實。

this.food = function () {  var _this = this;  var headNode = _this.bodyNodes[0];  //吃到果實  if (_this.Utils.equals(headNode, _this.foodNode)) {    _this.bodyNodes.push(_this.foodNode);//push()方法可向數組的末尾添加一個或多個元素,并返回新的長度。    _this.foodNode = null;    var score = _this.bodyNodes.length - 1;    $('#score').text(score);    if (score % 10 == 0) {//加速提高難度      _this.speed += 10;      _this.timerController();    }  }};

②timerController

時間控制,

利用setInterval()函數定時調用move()方法,時間為6000/speed。

this.timerController = function () {  var _this = this;  if (_this.timer) {    clearInterval(_this.timer);  }  _this.timer = setInterval(function () {    _this.move();  }, 6000 / _this.speed);  $('#speed').text(_this.speed);};

最后是工具類方法contains()和equesl()。contains用來判斷新生成隨機果實的位置和蛇重合時重新生成隨機果實,以及蛇自己碰到自己時算游戲結束。

equals用來判斷蛇到果實沒有。他們的區別就是,contains要用each比較,因為蛇體數組有多個,所以需要循環一個一個比較。而equals()只比較蛇頭和果實重合,所以不用循環。

this.Utils = {  contains: function (arr, o) {    var _this = this;    if (!arr || !o) return false;    var flag = false;    $.each(arr, function () {      if (!this) return true;      if (_this.equals(this, o)) {        flag = true;        return false;      }    });    return flag;  },  equals: function (o1, o2) {    if (o1 == o2) return true;    if (!o1 || !o2) return false;    return o1.x == o2.x && o1.y == o2.y;  }};

希望本文所述對大家JavaScript程序設計有所幫助。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩爽爽影院| 亚洲国产中文字幕久久网| 久久亚洲综合国产精品99麻豆精品福利| 91网站免费看| 国产一区二区久久精品| 亚洲视频综合网| 亚洲国产日韩欧美在线动漫| 国产有码在线一区二区视频| 伊人一区二区三区久久精品| 日韩中文字幕在线视频播放| 91精品啪aⅴ在线观看国产| 欧美国产第一页| 成人午夜高潮视频| 97精品一区二区三区| 亚洲欧美中文日韩在线v日本| 国产精品jizz在线观看麻豆| 国产精品精品久久久| 亚洲欧洲国产伦综合| 亚洲福利精品在线| 日韩欧美一区二区三区久久| 欧美一区二区三区四区在线| 91精品啪在线观看麻豆免费| 亚洲精品欧美极品| 欧美壮男野外gaytube| 久久的精品视频| 欧美一级大片视频| 精品呦交小u女在线| 亚洲午夜久久久影院| 精品久久久久久久久久ntr影视| 91国自产精品中文字幕亚洲| 亚洲色图欧美制服丝袜另类第一页| 亚洲天堂第一页| 福利视频一区二区| 亚洲成人av在线| 国产精品一二三在线| 久久精品男人天堂| 日韩视频在线免费| 久久综合久久八八| 日韩av在线影院| 日本一区二区在线播放| 麻豆国产va免费精品高清在线| 一区二区在线视频播放| 亚洲欧美另类中文字幕| 亚洲免费人成在线视频观看| 久久理论片午夜琪琪电影网| 夜夜嗨av色一区二区不卡| 色午夜这里只有精品| 日韩a**站在线观看| 日韩在线一区二区三区免费视频| 精品动漫一区二区三区| 欧美性受xxx| 亚洲缚视频在线观看| 亚洲欧洲日韩国产| 亚洲免费小视频| 国内精品一区二区三区| yellow中文字幕久久| 亚洲一区美女视频在线观看免费| 日韩综合中文字幕| 久久香蕉频线观| 国产视频久久网| 亚洲精品一区二区在线| 最近2019好看的中文字幕免费| 揄拍成人国产精品视频| 久久91超碰青草是什么| 日韩欧美国产高清91| 国产精品一二三视频| 午夜免费在线观看精品视频| 国产999精品视频| 91在线视频精品| 亚洲欧美在线免费观看| 国产午夜精品一区理论片飘花| 97在线看福利| 91久热免费在线视频| 麻豆乱码国产一区二区三区| 亚洲丁香久久久| 午夜精品久久久久久久99热| 国产噜噜噜噜久久久久久久久| 日韩国产高清视频在线| 亚洲第一精品夜夜躁人人躁| 久久久亚洲欧洲日产国码aⅴ| 中文字幕日韩有码| 国产精品十八以下禁看| 亚洲国产精品高清久久久| 日韩精品免费在线| 在线视频欧美日韩| 91人成网站www| 欧美激情2020午夜免费观看| 国产亚洲成精品久久| 国产一区二区色| 国产午夜精品久久久| 午夜免费在线观看精品视频| 国产精品久久久久久久久久99| 日韩激情视频在线播放| 亚洲free性xxxx护士白浆| 亚洲国产欧美一区二区丝袜黑人| 日韩免费在线免费观看| 久久天天躁夜夜躁狠狠躁2022| 欧美黑人一级爽快片淫片高清| 91国自产精品中文字幕亚洲| 波霸ol色综合久久| 久久久久免费视频| 亚洲加勒比久久88色综合| 久久久久久久一区二区三区| 亚洲一区亚洲二区亚洲三区| 韩国三级电影久久久久久| 亚洲精品av在线| 日韩在线高清视频| 亚洲电影免费在线观看| 欧美国产亚洲精品久久久8v| 国产欧美日韩精品丝袜高跟鞋| 日韩欧美一区二区三区| 国产盗摄xxxx视频xxx69| 亚洲国语精品自产拍在线观看| 成人精品aaaa网站| 国产国语刺激对白av不卡| 亚洲999一在线观看www| 欧美福利视频在线观看| 日韩在线播放视频| 国产成人精品电影久久久| 中文字幕在线亚洲| 久久久精品国产| 亚洲成人精品在线| 欧美色另类天堂2015| 一区二区三区视频免费| 欧美日韩国产999| 91久久国产婷婷一区二区| 成人福利在线视频| 亚洲人成网站777色婷婷| 久久久久亚洲精品成人网小说| 大伊人狠狠躁夜夜躁av一区| 国产精品久在线观看| www.欧美精品| 精品国内产的精品视频在线观看| 国内精品久久久久影院优| 青青久久av北条麻妃海外网| 青青久久av北条麻妃黑人| 亚洲第一精品夜夜躁人人躁| 亚洲精品在线观看www| 日韩欧美在线视频观看| 国产一区二区三区在线观看视频| 欧美激情精品久久久久久黑人| 韩国三级电影久久久久久| 欧美日韩国产色视频| 国产一区二区免费| 久久人人97超碰精品888| 久久最新资源网| 欧美日韩裸体免费视频| 亚洲欧美日韩成人| 欧美夫妻性生活xx| 午夜精品在线观看| 91色精品视频在线| 国产精品国产三级国产aⅴ浪潮| 精品日韩视频在线观看| 日韩av观看网址| 成人免费视频网址| 日韩欧美精品中文字幕| 亚洲欧美日韩久久久久久| 国产脚交av在线一区二区| 亚洲深夜福利网站| 欧美电影电视剧在线观看| 91精品综合久久久久久五月天| 国内外成人免费激情在线视频网站| 日韩av免费看| 亚洲第一色中文字幕|