canvse小游戏-贪吃蛇

思路:
* 1、分别构造方块、蛇、食物三个对象
* 2、蛇由一个一个小方块组成,食物随机生成
* 3、将蛇身的每一个方块排列放在数组中
* 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");

    /*构造一个方块*/
    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);
    };

    /*构造一个蛇的对象*/
    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(){

        //添加一个方块,和蛇的头部重合,然后将头部根据点击方向向前移动
        var rect = new Rect(this.head.x,this.head.y,this.head.w,this.head.h,'green');
        this.snakeArr.splice(1,0,rect);

        //判断蛇的头部和食物是否产生碰撞,是就重新生成一个食物,否者就删除最后一个方块
        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;
        }

        //如果蛇的头部超出画布边界,就清除定时器,结束游戏
        if(snake.head.x > oC.width || snake.head.y > oC.height || snake.head.x < 0 || snake.head.y < 0){
            clearInterval(timer);
        }

        //如果蛇头与蛇身相撞,清除定时器,结束游戏
        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);
            }
        }
    };

    //实例化一条蛇,初始状态
    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();
    };

    //随机数函数
    function random(m,n){
        return parseInt(Math.random()*(n-m)+m);
    }

    //生成食物函数
    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;
    }

    //判断食物与蛇头碰撞函数
    function Eat(){
        if(snake.head.x === food.x && snake.head.y === food.y){
            return true;
        }else{
            return false;
        }
    }
</script>
</body>
</html>

效果图:

image.png

感谢小pxu

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 前言 闲着没事干,想起多年前学java时,笔者撸过的俄罗斯方块,坦克大战,贪食蛇,现如今已抛弃java多年,投入i...
    codingZero阅读 8,069评论 12 54
  • 上周看到一个大腿用20行代码写了贪吃蛇游戏,觉得好屌,分享一下他的代码。原文地址戳这👉: 原文链接。废话不多说,看...
    linwalker阅读 802评论 0 16
  • C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程...
    小辰带你看世界阅读 1,051评论 0 3
  • 修得几世的因 才可得这世上难得的缘 那天阳光正暖 我低头走路 你侧脸赏景 就这么撞到 你浅笑 我低眉 异口同声的“...
    静若青莲阅读 1,092评论 20 39
  • 今天产品发布新版本,加班至现在刚刚到家。相比前几年的加班,现在并不算很晚(23:30),但却觉得有点累。 每天一篇...
    IT学思想阅读 314评论 8 1