HTML5 Canvas实现贪吃蛇(二)

有了一个实心圆,就可想想大致的思路了。

游戏思路

全局变量:global
  • 浏览器类型,区别PC浏览器和手机端的浏览器,broswerType;
  • canvas的长和宽,paleWidth,paleHeight;
  • 实心圆半径,radius;
  • 蛇身前进步长,step;
蛇:snake
  • 蛇身的组成是一个一个实心圆,所以最核心的属性就是长度,设为length;
  • 蛇需要移动,就需要一个前进的方向,设为head;
  • 需要在canvas中绘制蛇身,需要一系列坐标,需要一个数组来存储这些坐标,设为body;
  • 考虑到后续可能要改变蛇前进的速度,设定速度speed;
  • 设置一个定时移动的方法,moveTimer;
食物:food
  • 作为游戏的一个结束条件,给食物设定一个总量,totalNum;
  • 同时可能会放置多个食物,设定一个同时存在的食物数量concurrenctNum;
  • 吞食一个食物之后蛇身增加的长度,energy;
  • 同时放置多个食物时,为了控制食物数量,检测是否生成新食物,将现存食物数量保存下来,presentFoodNum;
  • 绘制多个食物,需要数组存储食物坐标,foodsLocation;

这里有个比较关键的问题就是蛇身具体怎么动起来。首先肯定是根据重绘canvas来让它动起来的,那么就需要两次绘制中snake.body的坐标点有变化,这个变化是根据snake.head这个方向来的,这里约定:0-上,1-下,2-左,3-右。具体到坐标的变化,很直观的想法是后面一个坐标替代前面一个坐标,然后再新增一个坐标,但这样一来,是比较复杂的。我采取的做法是:

  • 根据snake.head生成一个新的圆-newpart;
  • 将newpat插入snake.body;
  • 通过snake.length截取新的蛇身,完成绘制;

这样一来,算法复杂度是很小的。接下来,代码码起来。

首先,绘制边界:

c.width = global.paleWidth;
c.height = global.paleHeight;
cc.beginPath();
cc.fillStyle = "#FFFF00";
cc.lineWidth = 4;
cc.moveTo(0, 0);
cc.lineTo(global.paleWidth - 3, 0);
cc.lineTo(global.paleWidth - 3, global.paleHeight - 3);
cc.lineTo(0, global.paleHeight - 3);
cc.lineTo(0, 0);
cc.stroke();
cc.closePath();

接着,可以在点上面随机找一个绘制一个圆,同时把这个坐标放入snake.body:

var initX = Math.floor(Math.random() * (global.paleWidth + 1)) / 3 * 3;
var initY = Math.floor(Math.random() * (global.paleHeight + 1)) / 3 * 3;
var initLocation = [initX, initY];
snake.body.push(initLocation);
snake.paintCycle(initLocation, global.lineWidth, global.radius);

同时,设置一个定时方法,执行蛇的移动动作:

snake.moveTimer = setInterval(snake.move, 600);

下面构建move方法:

move: function() {
    switch (snake.head) {
        case 0:
            var newPart = [snake.body[snake.body.length - 1][0], snake.body[snake.body.length - 1][1] - global.step];
            if (newPart[1] < 0)
                newPart[1] += global.paleHeight;
            break;
        case 1:
            var newPart = [snake.body[snake.body.length - 1][0], snake.body[snake.body.length - 1][1] + global.step];
            if (newPart[1] > global.paleHeight)
                newPart[1] -= global.paleHeight;
            break;
        case 2:
            var newPart = [snake.body[snake.body.length - 1][0] - global.step, snake.body[snake.body.length - 1][1]];
            if (newPart[0] < 0)
                newPart[0] += global.paleWidth;
            break;
        case 3:
            var newPart = [snake.body[snake.body.length - 1][0] + global.step, snake.body[snake.body.length - 1][1]];
            if (newPart[0] > global.paleWidth)
                newPart[0] -= global.paleWidth;
            break;
    }
    snake.body.push(newPart);
    cc.clearRect(3, 3, global.paleWidth - 10, global.paleHeight - 10);
    if (snake.body.length > snake.length) {
        snake.body = snake.body.splice(1, snake.length);
    }
    for (i = 0; i < snake.body.length; i++) {
        snake.paintCycle(snake.body[i], 5.6, 3);
    }
}

这样,蛇身就会动起来了。接下来就需要设计食物了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值