canvas贪吃蛇

canvas贪吃蛇



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body{
            text-align: center;
        }
        #canvas{
            box-shadow: 0 5px 40px black;

        }
    </style>
</head>
<body>
    <canvas id="canvas" width="800" height="500"></canvas>
</body>
<!--<script src="snake.js"></script>-->
<script>
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d"); //获取画板


    var snake = {
        head:null,      //蛇头
        snakeArray:null ,//整蛇数组、包括蛇头
        direction:"right"//蛇的运动方向,后期根据键盘来定
    };


    initSnake() ;//初始化
    drawSnake() ;//绘制到页面上

    var foot = randomCreateFoot(); //得到食物
    draw(foot);

    //让蛇动起来
    var t = setInterval(function () {
        context.clearRect(0,0,canvas.width,canvas.height);
        moveSnake() ;//移动蛇
        drawSnake() ;//绘制到页面上
        draw(foot) ;
    },500);



    //蛇移动
    function moveSnake() {
        /* 蛇移动原理:
         *  (1)创建一段,放到蛇头的位置。
         *  (2)将蛇头的位置,往前推进20px,到底往哪个方向推进,就需要根据当前按键盘的方向了。
         *  (3)如果吃到了食物,就不删除最后一节,否则删除删除最后一节
         */
        var snakeArray = snake.snakeArray;

        var modiy = createSectionObj(snake.head.x,snake.head.y,20,20,"gray");

        snakeArray.splice(1,0,modiy);

        //修改蛇头
        switch (snake.direction){
            case "up" :{
                snake.head.y = snake.head.y - 20;
                break;
            }
            case "down" :{
                snake.head.y = snake.head.y + 20;
                break;
            }
            case "left" :{
                snake.head.x = snake.head.x - 20;
                break;
            }
            case "right" :{
                snake.head.x = snake.head.x + 20;
                break;
            }
        }

        if(isEat()){
            foot = randomCreateFoot();
        }else {
            snakeArray.pop();
        }
        if(isGameOver()){
            clearInterval(t);

            // setTimeout(function () {
            //     context.clearRect(0,0,canvas.width,canvas.height);
            // },500);

            alert("game Over :"+snakeArray.length);
        }

    }

    //随机出现食物
    function randomCreateFoot() {
        /*
         * 蛇的一块一块是宽度和高度是20,所以我们将canvas的宽度和高度分成多块,
         * 食物随机出现在某一块上
         *
         * 既然是随机出现食物,有可能出现的位置刚好是在蛇身上。
         * 所以,如果出现在蛇身上,需要重新生成
         *
         * */
        var widthRange = canvas.width / 20 - 1;
        var heightRange = canvas.height / 20 - 1;

        var x = Math.round(Math.random() * widthRange) * 20;
        var y = Math.round(Math.random() * heightRange) * 20;

        return createSectionObj(x,y,20,20,"yellow");

    }



    //初始化 -默认蛇的长度是4
    function initSnake() {
        var snakeArray = []; //数组的第一个作为蛇头

        for(var i = 0;i < 4;i++){
            var sectionObj = createSectionObj(20*i,0,20,20,"gray");
            snakeArray.unshift(sectionObj);
        }

        //蛇头的颜色是红色的
        var head = snakeArray[0];
        head.color = "red";

        //将两个后面常用的东西定为属性,方便后面调用
        snake.head=  head;
        snake.snakeArray = snakeArray;

    }

    //创建一节蛇对象
    function createSectionObj(x,y,w,h,color) {
        return {
            x:x,
            y:y,
            w:w,
            h:h,
            color:color
        }
    }

    //判断是否吃到食物
    function isEat() {
        if(foot.x == snake.head.x && foot.y == snake.head.y){
            return true;
        }else {
            return false;
        }
    }


    //绘制蛇
    function drawSnake() {
        var snakeArray = snake.snakeArray;
        for(var i = 0;i< snakeArray.length;i++){
            var section = snakeArray[i];
            draw(section)
        }
    }
    //绘制一节蛇
    function draw(section) {
        context.beginPath();
        context.fillStyle = section.color;
        context.rect(section.x,section.y,section.w,section.h);
        context.fill();
        context.stroke();
    }

    //判断游戏是否结束
    function isGameOver() {
        /*
         *  (1)头碰到墙壁
         *  (2)头碰到自己
         * */

        var canvasWidth = canvas.width;
        var canvasHeigh = canvas.height;
        var head = snake.head;
        if(head.x < 0 || head.y < 0 || head.x > canvasWidth || head.y > canvasHeigh ){
            return true;
        }

        for (var i = 1;i<snake.snakeArray.length;i++){
            var section = snake.snakeArray[i];
            if(section.x == head.x && section.y == head.y){
                return true;
            }
        }

        return false;
    }


    //根据键盘事件,判断蛇头的方向
    document.addEventListener("keydown",function (e) {
        var keycode = e.keyCode;
        /* 40:下,
         * 38:上,
         * 37:左,
         * 39:右;
         */
        //注意:如果原来蛇头是往右,不能直接向左,不能直接掉头
        if(keycode == 40 && snake.direction != "up"){
            snake.direction = "down";
        }else if(keycode == 38 && snake.direction !="down"){
            snake.direction = "up";
        }else if(keycode == 39 && snake.direction !="left"){
            snake.direction = "right";
        }else if(keycode == 37 && snake.direction !="right"){
            snake.direction = "left";
        }
        e.preventDefault();
    });


</script>
</html>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值