利用Canvas+js实现贪吃蛇

Posted wukongk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Canvas+js实现贪吃蛇相关的知识,希望对你有一定的参考价值。

今天想写一个贪吃蛇的页面,于是就选择了Canvs,不过只实现蛇身的长度是1的情况,对于蛇身大于2的情况,我还没想出来 如何绘制蛇,等查资料后,再来实现

下面是源码部分:

html

<div style=" text-align: center">
        <canvas id="myCanvas" width="630" height="630"></canvas>
    </div>
    <div style="position: absolute;top: 300px;left: 30px;">score:<span id="score">0</span></div>
js部分:
window.onload = function() 
        var canvas = document.getElementById('myCanvas'),
            span_score = document.getElementById('score'),
            context = canvas.getContext('2d'),
            maxNumber = 630,
            stride = 15,
            x = 31,
            y = 61,
            SnakeLen = 1,
            speed = 500,
            direct = 37,
            food_x = Math.ceil(Math.random() * 40 + 2) * 15 + 1,
            food_y = Math.ceil(Math.random() * 40 + 2) * 15 + 1,
            score = 0,
            timer;

        init();
        update();

        document.οnkeydοwn=function(event) 
            clearInterval(timer)
            direct = event.keyCode;
            update();
        
        // 定时更新画面
        function update() 
            timer = setInterval(function() 
                var _x = x,
                    _y = y;
                // 37:左 38:上 39:右  40:下
                switch (direct) 
                    case 37:
                        x = x - stride;
                        break;
                    case 38:
                        y = y - stride;
                        break;
                    case 39:
                        x = x + stride;
                        break;
                    case 40:
                         y = y + stride;
                        break;
                    default:
                        x = x - stride;
                        break;
                
                // 到达边界
                if(x < 1 || y < 1 || x > maxNumber || y > maxNumber) 
                    clearInterval(timer);
                    alert("Game over!");
                 else 
                    // 擦除贪吃蛇
                    clear(_x,_y);
                    // 重新绘制贪吃蛇
                    draw(x,y);
                    
                    // 检测是否吃到食物
                    checkFood();
                
            ,speed)
        

        // 绘制贪吃蛇
        function drawSnake() 
            //
        

        // 检测是否吃到食物
        function checkFood() 
            if(x === food_x && y === food_y) 
                food_x = Math.ceil(Math.random() * 40 + 2) * 15 + 1;
                food_y = Math.ceil(Math.random() * 40 + 2) * 15 + 1;
                draw(food_x,food_y);
                SnakeLen++;
                score += 10;
                span_score.innerHTML = score;
            
        

        // 清除
        function clear(x,y) 
            context.clearRect(x,y,stride - 2,stride - 2);
        
        // 画食物
        function draw(x,y) 
            context.fillRect(x,y,stride - 2,stride - 2);
        
        // 初始化函数
        function init() 
            context.lineWidth = 1;
            context.fillStyle = '#69D69E';
            context.strokeStyle="#89EFA3";
            var i = 0;
            while(i <= maxNumber) 
                context.moveTo(0, i);
                context.lineTo(maxNumber,i);
                context.stroke();

                context.moveTo(i,0);
                context.lineTo(i,maxNumber);
                context.stroke();
                i += stride;
            
            draw(food_x,food_y);
            console.log("foodx"+food_x+"foody"+food_y);
            draw(x,y);
        
    
其中,drawSnake函数是实现蛇身长度大于2时,实现的,很可惜,现在还未实现,里面有很多多余配置参数,等改进后,就能用到了。


在开始时,我将小方块的设置为15*15,绘制的小蛇方块也是15*15,在每次小蛇运动时,就会把网格线顺便擦除,所以刚开始在draw函数调用init函数(在刚开始时),想重新绘制网格线,发现,小方块运动的速度很慢,这是是说 这种方法不可取,每次重新绘制网格线,花费的时间太多,

在update函数中,一开始,就先擦除小蛇,再判断小蛇是否到达边界,假如小蛇到达边界,虽然游戏结束,但是小蛇不减了,因为,小蛇被我擦除了,小蛇的新位置超出了边界,绘制出来,也不会出现在  画布上,我感觉 这个结果 不太符合常理,所以就使用了两个临时变量保存,这样解决了问题,花费的资源就多了。。。不知道还有什么其他的好办法。。


PS:所有测试都是在最新版本谷歌浏览器下进行

以上是关于利用Canvas+js实现贪吃蛇的主要内容,如果未能解决你的问题,请参考以下文章

利用Canvas+js实现贪吃蛇

利用Canvas+js实现贪吃蛇

利用Canvas+js实现贪吃蛇

Canvas实现简单贪吃蛇

40行贪吃蛇 原生js

手把手教学h5小游戏 - 贪吃蛇