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

首頁 > 開發 > HTML5 > 正文

H5 canvas實現貪吃蛇小游戲

2024-09-05 07:22:04
字體:
來源:轉載
供稿:網友

本文介紹了H5 canvas實現貪吃蛇小游戲,分享給大家,具體如下:

實現效果如下

實現思路:

ps:這個只是思路,詳細可看代碼注釋

一、先把蛇畫出來

  1. 定義一下蛇的結構,用一個數組保存一堆矩形,包含蛇頭(紅)和蛇身(灰)。
  2. 畫蛇(初始狀態)

二、蛇能動(重點)

  1. 蛇移動方式:自始至終都只有蛇頭在動
    1. 畫一個灰色的方塊,位置與蛇頭重疊
    2. 將這個方塊插到數組中蛇頭后面一個的位置arrar.splice(0,1,rect)
    3. 砍去末尾的方塊array.pop()
    4. 將蛇頭向設定方向移動一格
  2. 需要一個保存方向的變量(direction)
  3. 根據方向進行移動,一次移動一個格
  4. 根據按鍵改方向

三、隨機投放食物

  1. 需要隨機食物的位置
  2. 需要判斷食物在不在蛇身上。

四、吃食物

  1. 判斷食物是否與蛇頭重疊
  2. 數組加一個元素(少刪除一個元素就是加一個元素)
  3. 生成新的食物

五、gameover

  1. 撞墻判定
  2. 裝自己判定
     
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Document</title>    <style>        #canvas{            box-shadow: 0 5px 40px black;        }    </style></head><body>    <canvas id="canvas" width="800" height="500"></canvas></body><script>    var canvas = document.getElementById('canvas');    var context = canvas.getContext('2d');    //構造對象方塊    function Rect (x,y,w,h,color) {        this.x = x;        this.y = y;        this.w = w;        this.h = h;        this.color = color;    }    //畫方塊的方法    Rect.prototype.draw = function () {        context.beginPath();        context.fillStyle = this.color;        context.rect(this.x,this.y,this.w,this.h);        context.fill();        context.stroke();    }    //構造對象蛇    function Snake () {        //定義一個空數組存放組成整蛇的方塊對象        var snakeArray = [];        //畫出4個方塊,設置成灰色        for (var i = 0; i < 4; i++) {            var rect = new Rect(i*20,0,20,20,"gray");            //之所以用splice(往前加)而不是用push(往后加),是為了讓蛇頭出現在數組第一個位置            snakeArray.splice(0,0,rect);             }        //把數組第一個作為蛇頭,蛇頭設成紅色        var head = snakeArray[0];        head.color = "red";        //此處將兩個后面常用的東西定為屬性,方便后面調用        this.head = snakeArray[0];  //蛇頭        this.snakeArray = snakeArray;  //整蛇數組        //給定初始位置向右(同keyCode右箭頭)        this.direction = 39;    }    //畫蛇的方法    Snake.prototype.draw = function () {        for (var i = 0; i < this.snakeArray.length; i++) {            this.snakeArray[i].draw();        }     }    //蛇移動的方法    Snake.prototype.move = function () {        //此處是核心部分,蛇的 移動方式        //1、畫一個灰色的方塊,位置與蛇頭重疊        //2、將這個方塊插到數組中蛇頭后面一個的位置        //3、砍去末尾的方塊        //4、將蛇頭向設定方向移動一格        var rect = new Rect(this.head.x,this.head.y,this.head.w,this.head.h,"gray");        this.snakeArray.splice(1,0,rect);        //判斷是否吃到食物,isEat判定函數寫在最后了        //吃到則食物重新給位置,不砍去最后一節,即蛇變長        //沒吃到則末尾砍掉一節,即蛇長度不變        if (isEat()){            food = new getRandomFood();        }else{            this.snakeArray.pop();        }        //設置蛇頭的運動方向,37 左,38 上,39 右,40 下        switch (this.direction) {            case 37:                this.head.x -= this.head.w                break;            case 38:                this.head.y -= this.head.h                break;            case 39:                this.head.x += this.head.w                break;            case 40:                this.head.y += this.head.h                break;            default:                    break;        }        // gameover判定        // 撞墻        if (this.head.x > canvas.width || this.head.x < 0 || this.head.y > canvas.height || this.head.y < 0){            clearInterval(timer);        }        // 撞自己,循環從1開始,避開蛇頭與蛇頭比較的情況        for (var i = 1; i < this.snakeArray.length; i++) {            if (this.snakeArray[i].x == this.head.x && this.snakeArray[i].y == this.head.y){                clearInterval(timer);            }        }    }    //畫出初始的蛇    var snake = new Snake()    snake.draw();    //畫出初始的食物    var food = new getRandomFood()    //定時器    var timer = setInterval(function () {        context.clearRect(0,0,canvas.width,canvas.height);        food.draw();        snake.move();        snake.draw();    }, 100)    //鍵盤事件,其中的if判定是為了讓蛇不能直接掉頭    document.onkeydown = function (e) {        var ev = e||window.event;        switch(ev.keyCode){            case 37:{                if (snake.direction !== 39){                    snake.direction = 37;                }                break;            }            case 38:{                if (snake.direction !== 40){                    snake.direction = 38;                }                break;            }            case 39:{                if (snake.direction !== 37){                    snake.direction = 39;                }                break;            }            case 40:{                if (snake.direction !== 38){                    snake.direction = 40;                }                break;            }            }        ev.preventDefault();    }    //隨機函數,獲得[min,max]范圍的值    function getNumberInRange (min,max) {        var range = max-min;         var r = Math.random();        return Math.round(r*range+min)    }    //構建食物對象    function getRandomFood () {        //判定食物是否出現在蛇身上,如果是重合,則重新生成一遍        var isOnSnake = true;        //設置食物出現的隨機位置        while(isOnSnake){            //執行后先將判定條件設置為false,如果判定不重合,則不會再執行下列語句            isOnSnake = false;            var indexX = getNumberInRange(0,canvas.width/20-1);            var indexY = getNumberInRange(0,canvas.height/20-1);            var rect = new Rect(indexX*20, indexY*20, 20, 20, "green");            for (var i = 0; i < snake.snakeArray.length; i++) {                if(snake.snakeArray[i].x == rect.x && snake.snakeArray[i].y == rect.y){                    //如果判定重合,將其設置為true,使隨機數重給                    isOnSnake = true;                    break;                }            }        }        //返回rect,使得實例化對象food有draw的方法        return rect;    }    //判定吃到食物,即蛇頭坐標與食物坐標重合    function isEat () {        if (snake.head.x == food.x && snake.head.y == food.y){            return true;        } else {            return false;        }    }</script></html>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品18久久久久久首页狼| 亚洲国产精品电影在线观看| 97超级碰在线看视频免费在线看| 亚洲区bt下载| 日韩高清电影好看的电视剧电影| 在线视频欧美日韩精品| 日韩国产高清视频在线| 在线精品视频视频中文字幕| 日本不卡视频在线播放| 欧美午夜宅男影院在线观看| 日韩中文av在线| 欧美日韩国产成人| 亚洲一区二区三区xxx视频| 色偷偷91综合久久噜噜| 日韩亚洲在线观看| 黑人巨大精品欧美一区二区一视频| 亚洲成av人影院在线观看| 亚洲国产精久久久久久| 在线视频精品一| 欧美做受高潮电影o| 日韩激情av在线免费观看| 日韩电影在线观看永久视频免费网站| 亚洲欧洲午夜一线一品| 欧美激情中文字幕在线| 日韩中文字幕免费视频| 高清在线视频日韩欧美| 成人啪啪免费看| 亚洲激情视频网| 亚洲激情视频在线| 亚洲欧洲一区二区三区在线观看| 欧美国产亚洲精品久久久8v| 成人福利网站在线观看| 亚洲影院污污.| 日韩av免费看网站| 久久久亚洲国产天美传媒修理工| 欧美福利小视频| 国产69精品99久久久久久宅男| 欧美一性一乱一交一视频| 精品欧美激情精品一区| 深夜成人在线观看| 亚洲精品久久久久久下一站| 亚洲日韩第一页| 欧美日韩人人澡狠狠躁视频| 日本欧美精品在线| 国产精品96久久久久久| 亚洲图片在区色| 亚洲国产精彩中文乱码av在线播放| 亚洲日韩第一页| 亚洲精品资源美女情侣酒店| 国模精品系列视频| 色妞色视频一区二区三区四区| 亚洲第一色中文字幕| 91国内产香蕉| www日韩中文字幕在线看| 北条麻妃一区二区在线观看| 国产精品久久婷婷六月丁香| 久久的精品视频| 国产成人精品在线视频| 欧美日韩综合视频网址| 日韩中文字幕在线播放| 欧美乱大交做爰xxxⅹ性3| 97精品伊人久久久大香线蕉| 国产精品美女主播在线观看纯欲| 久久国产精品免费视频| 日韩在线国产精品| 高清在线视频日韩欧美| 美女999久久久精品视频| 日韩欧美一区二区三区久久| 国产精品十八以下禁看| 国产日韩欧美日韩大片| 国产精品第10页| 日韩av在线免费观看| 日韩成人在线播放| 亚洲成人精品视频| 91影视免费在线观看| 国产日韩欧美在线播放| 国产日韩换脸av一区在线观看| 亚洲欧美日韩第一区| 日韩中文字幕第一页| 精品国产乱码久久久久久虫虫漫画| 国产精品久久久久久久久| 中文字幕精品网| 日韩成人激情影院| 另类色图亚洲色图| 欧美成在线观看| 国产欧美精品va在线观看| 亚洲欧美日韩久久久久久| 国产成人久久精品| 国产精品日本精品| 亚洲九九九在线观看| 欧美日韩一二三四五区| 91亚洲精品在线| 国产在线视频一区| 精品久久久999| 亚洲日本欧美中文幕| 久久久久一本一区二区青青蜜月| 韩国欧美亚洲国产| 欧美性猛交xxxx富婆| 茄子视频成人在线| 狠狠色狠狠色综合日日五| 国产女人18毛片水18精品| 亚洲一区精品电影| 成人高清视频观看www| 国产精品福利片| 欧美日韩第一页| 亚洲欧洲在线看| 亚洲黄色在线看| 成人国产精品免费视频| 亚洲欧洲国产精品| 亚洲欧美国产另类| 国产精品亚洲精品| 久久久av亚洲男天堂| 欧美在线观看日本一区| 久久久久久久久久久国产| 国产性猛交xxxx免费看久久| 日韩视频第一页| 久久久精品一区| 欧美夫妻性生活xx| 精品国产91久久久久久| 欧美风情在线观看| 国产精品一久久香蕉国产线看观看| 精品视频在线播放| 亚洲午夜国产成人av电影男同| 91wwwcom在线观看| 九九热精品在线| 亚洲欧美中文日韩在线| 欧美日本精品在线| 欧美日韩国产综合视频在线观看中文| 自拍偷拍亚洲欧美| 国产成人精品最新| 亚洲精品日韩丝袜精品| 91亚洲va在线va天堂va国| 国模精品视频一区二区三区| 日韩精品在线播放| 97在线视频免费看| 91久久综合亚洲鲁鲁五月天| 神马久久久久久| 精品视频在线播放| 成人午夜高潮视频| 成人网在线免费看| 欧美黄网免费在线观看| 亚洲视频欧美视频| 欧美日韩国产成人| 亚洲日韩中文字幕在线播放| 国产欧美最新羞羞视频在线观看| 91免费欧美精品| 国产精品久久久久久久久久东京| 一区二区在线视频| 亚洲xxxx视频| 美女国内精品自产拍在线播放| 欧美色图在线视频| 精品国产乱码久久久久久虫虫漫画| 久久影视电视剧免费网站清宫辞电视| 国产999在线| 精品久久久久久久中文字幕| 国产精品三级美女白浆呻吟| 中文字幕精品视频| 91精品国产777在线观看| 97国产在线视频| 2020国产精品视频| 亚洲欧美中文在线视频| 日本三级韩国三级久久| 久久中文字幕国产| 亚洲第一精品夜夜躁人人躁|