canvse小游戲-貪吃蛇

思路:
* 1制肮、分別構(gòu)造方塊、蛇递沪、食物三個對象
* 2豺鼻、蛇由一個一個小方塊組成,食物隨機生成
* 3款慨、將蛇身的每一個方塊排列放在數(shù)組中
* 4拘领、始終是蛇頭在移動方向,添加的新的方塊放在蛇頭的后面樱调,然后去掉蛇尾(既最后一個小方塊)
* 如果整體移動的話在拐彎的時候就麻煩了约素,這個方法正好
代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #canvasOne{
            background: #cccccc;
        }
    </style>
</head>
<body>
<canvas id="canvasOne" width="800" height="600"></canvas>

<script>
    var oC = document.getElementById("canvasOne");
    var gd = oC.getContext("2d");

    /*構(gòu)造一個方塊*/
    function Rect(x,y,w,h,cl){
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
        this.color = cl;
    }

    /*添加畫方塊的方法*/
    Rect.prototype.draw = function (){
        gd.beginPath();
        gd.fillStyle = this.color;
        gd.fillRect(this.x,this.y,this.w,this.h);
    };

    /*構(gòu)造一個蛇的對象*/
    function Snake(){
        var snakeArr = [];
        for(var i = 0; i < 5; i++){
            var rect = new Rect(i*20,0,20,20,'green');
            snakeArr.splice(0,0,rect);
        }

        var head = snakeArr[0];
        head.color = 'yellow';

        this.head = head;
        this.snakeArr = snakeArr;

        this.direction = 39;
    }

    /*添加畫蛇的方法*/
    Snake.prototype.draw = function(){
        for(var i = 0;i < this.snakeArr.length; i++){
            this.snakeArr[i].draw();
        }
    };

    /*添加蛇移動的方法*/
    Snake.prototype.move = function(){

        //添加一個方塊届良,和蛇的頭部重合,然后將頭部根據(jù)點擊方向向前移動
        var rect = new Rect(this.head.x,this.head.y,this.head.w,this.head.h,'green');
        this.snakeArr.splice(1,0,rect);

        //判斷蛇的頭部和食物是否產(chǎn)生碰撞圣猎,是就重新生成一個食物士葫,否者就刪除最后一個方塊
        if(Eat()){
            food = new Food();
        }else{
            this.snakeArr.pop();
        }

        //判斷鍵盤點擊的方向,改變蛇頭的位置
        switch (this.direction){
            case 38:
                this.head.y -= this.head.h;break;
            case 40:
                this.head.y += this.head.h;break;
            case 37:
                this.head.x -= this.head.w;break;
            case 39:
                this.head.x += this.head.w;break;
            default:
                break;
        }

        //如果蛇的頭部超出畫布邊界送悔,就清除定時器慢显,結(jié)束游戲
        if(snake.head.x > oC.width || snake.head.y > oC.height || snake.head.x < 0 || snake.head.y < 0){
            clearInterval(timer);
        }

        //如果蛇頭與蛇身相撞,清除定時器欠啤,結(jié)束游戲
        for(var i = 1; i < snake.snakeArr.length; i++){
            if(snake.head.x === snake.snakeArr[i].x && snake.head.y === snake.snakeArr[i].y){
                clearInterval(timer);
            }
        }
    };

    //實例化一條蛇荚藻,初始狀態(tài)
    var snake = new Snake();
    snake.draw();

    //隨機生成一個食物
    var food = new Food();

    //添加定時器,讓蛇移動
    var timer = setInterval(function(){
        gd.clearRect(0,0,oC.width,oC.height);
        food.draw();
        snake.move();
        snake.draw();
    },1000);

    //上右下左 38,39,40,37洁段,為了避免蛇直接反向应狱,在case里面需要加一個判斷
    document.onkeydown = function(event){
        var ev = event || window.event;
        switch (ev.keyCode){
            case 38:
                if(snake.direction !== 40){
                    snake.direction = 38;
                    break;
                }
            case 40:
                if(snake.direction !== 38){
                    snake.direction = 40;
                    break;
                }
            case 37:
                if(snake.direction !== 39){
                    snake.direction = 37;
                    break;
                }
            case 39:
                if(snake.direction !== 37){
                    snake.direction = 39;
                    break;
                }
            default:
                break;
        }
        ev.preventDefault();
    };

    //隨機數(shù)函數(shù)
    function random(m,n){
        return parseInt(Math.random()*(n-m)+m);
    }

    //生成食物函數(shù)
    function Food(){
        var food_bool = true;
        while(food_bool){
            food_bool = false;
            var foodX = random(0,oC.width/20-1);
            var foodY = random(0,oC.height/20-1);
            var rect = new Rect(foodX*20, foodY*20, 20, 20, 'green');
            for(var i = 0;i < snake.snakeArr.length; i++){
                if(snake.snakeArr[i].x === foodX && snake.snakeArr[i].y === foodY){
                    food_bool = true;
                    break;
                }
            }
        }
        return rect;
    }

    //判斷食物與蛇頭碰撞函數(shù)
    function Eat(){
        if(snake.head.x === food.x && snake.head.y === food.y){
            return true;
        }else{
            return false;
        }
    }
</script>
</body>
</html>

效果圖:

image.png

感謝小pxu

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市祠丝,隨后出現(xiàn)的幾起案子疾呻,更是在濱河造成了極大的恐慌,老刑警劉巖写半,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岸蜗,死亡現(xiàn)場離奇詭異,居然都是意外死亡叠蝇,警方通過查閱死者的電腦和手機璃岳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悔捶,“玉大人铃慷,你說我怎么就攤上這事⊙坠Γ” “怎么了枚冗?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛇损。 經(jīng)常有香客問我赁温,道長,這世上最難降的妖魔是什么淤齐? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任股囊,我火速辦了婚禮,結(jié)果婚禮上更啄,老公的妹妹穿的比我還像新娘稚疹。我一直安慰自己,他們只是感情好祭务,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布内狗。 她就那樣靜靜地躺著怪嫌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柳沙。 梳的紋絲不亂的頭發(fā)上岩灭,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音赂鲤,去河邊找鬼噪径。 笑死,一個胖子當著我的面吹牛数初,可吹牛的內(nèi)容都是我干的找爱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼泡孩,長吁一口氣:“原來是場噩夢啊……” “哼车摄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起珍德,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤练般,失蹤者是張志新(化名)和其女友劉穎矗漾,沒想到半個月后锈候,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡敞贡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年泵琳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片誊役。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡获列,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛔垢,到底是詐尸還是另有隱情击孩,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布鹏漆,位于F島的核電站巩梢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏艺玲。R本人自食惡果不足惜括蝠,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饭聚。 院中可真熱鬧忌警,春花似錦、人聲如沸秒梳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朋譬,卻和暖如春弧满,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背此熬。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工庭呜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人犀忱。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓募谎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阴汇。 傳聞我的和親對象是個殘疾皇子数冬,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 閑著沒事干,想起多年前學java時搀庶,筆者擼過的俄羅斯方塊拐纱,坦克大戰(zhàn),貪食蛇哥倔,現(xiàn)如今已拋棄java多年秸架,投入i...
    codingZero閱讀 8,104評論 12 54
  • 上周看到一個大腿用20行代碼寫了貪吃蛇游戲,覺得好屌咆蒿,分享一下他的代碼东抹。原文地址戳這??: 原文鏈接。廢話不多說沃测,看...
    linwalker閱讀 810評論 0 16
  • C語言是面向過程的缭黔,而C++是面向?qū)ο蟮?C和C++的區(qū)別: C是一個結(jié)構(gòu)化語言,它的重點在于算法和數(shù)據(jù)結(jié)構(gòu)蒂破。C程...
    小辰帶你看世界閱讀 1,068評論 0 3
  • 修得幾世的因 才可得這世上難得的緣 那天陽光正暖 我低頭走路 你側(cè)臉賞景 就這么撞到 你淺笑 我低眉 異口同聲的“...
    靜若青蓮閱讀 1,101評論 20 39
  • 今天產(chǎn)品發(fā)布新版本馏谨,加班至現(xiàn)在剛剛到家。相比前幾年的加班附迷,現(xiàn)在并不算很晚(23:30)惧互,但卻覺得有點累。 每天一篇...
    IT學思想閱讀 323評論 8 1