小白理解 js 20行代码实现贪吃蛇


小白理解 js 20行代码实现贪吃蛇 

偶然发现网上很多20行js实现贪吃蛇游戏的代码,但多数没有注释,作为一个新手非常痛苦,于是想试着理解,经历了数个小时后,终于摸到了一丝皮毛,故分享出来。

声明:代码不是原创,借鉴自前辈,自是尝试理解,若有侵权,抱歉!

<!doctype html >
< html >
< body >
< canvas id="can" width="400" height="400"style="background: Black" ></ canvas >
< script >

    //sn 数组 ????ctx:获取id为can的2d面板(解决:fx是用来控制蛇移动的量,由于t% 20 * 20 + 1,每次会向右移动20px)
    //n 表示每次位于数组最前面的数

   
var sn = [ 42, 41 ], dz = 43, fx = 1, n, ctx = document. getElementById( "can"). getContext( "2d");

    function draw(t, c) {
        ctx. fillStyle = c;  //设置颜色

        //绘制图形,显示时的左上角(x,y)坐标,图形的宽高(设置成18可能是因为存在边框)

        ctx
. fillRect(t % 20 * 20 + 1,~~(t / 20) * 20 + 1, 18, 18);
    }

    //用户按下键盘时产生的事件,当sn[1]- sn[0] == (n = [ -1, -20, 1, 20 ][(e || event).keyCode - 37] || fx)(不懂)
    //为true时,fx=fx,反之fx=n;(解决:左上右下方向键对应n数组内取值,其他键将超出下标无法取值)

   
document. onkeydown = function(e){
        fx = sn[ 1] - sn[ 0] == ( n = [- 1, - 20, 1, 20 ][(e || event). keyCode - 37] || fx) ? fx : n
   
};
    ! function() {
        sn. unshift( n = sn[ 0] + fx);  //向sn数组头部插入数值n,n=42+1;
        //当刚插入的值不在头部时或者刚插入的值不在画板中时,或者一直向右或向下不变移动18次后,或者向上向左一直移动2次后,结束游戏

       
if ( sn. indexOf( n, 1) > 0 || n< 0|| n> 399 || fx == 1 && n % 20 == 0 || fx == - 1 && n % 20 == 19)
            return alert( "GAME OVER");

        //初始化蛇的位置???

        draw
( n, "Lime");

        if ( n == dz) {
            //产生0-40的随机整数,在sn数组中查找dz的位置,以确保产生的食物不于蛇重叠。

            
while( sn. indexOf( dz = ~~( Math. random() * 400))>= 0);

            //在面板中绘制黄色的食物。

            draw
( dz, "Yellow");
        } else

       
//将数组的最后一个元素删除,即在面板中绘制黑色的图形进行遮盖
            draw
( sn. pop(), "Black");

        //在130毫秒间隔后重复执行???(解决:是用来控制速度的量,并使重复执行当前函数,并不是属于else范围中)

       
setTimeout( arguments. callee, 130);
    }();
</ script >
</ body >
</ html >

如有错误,欢迎一起讨论。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值