前几天搞定了贪吃蛇自动寻路算法……

写了几天,搞定了贪吃蛇自动寻路……目前在20*20的格子上面可以稳定跑到100+分,200+的话……看运气吧o(╯□╰)o,总之算法还有很多可以修改的地方,而且UI部分还有部分没写的……
总结下:这次写的话主要算法用的是BFS,没有用A*算法,因为太复杂了,用JS实现感觉好难,所以暂时没有写……然后有两种策略,一种是吃到食物还能找到自己尾巴的话就直接去吃食物,如果发现找不到吃食物的路径OR吃了就会死那么就在头部附近找一个格子,格子满足两个条件:一个是到了这个格子之后可以找到去尾巴的路,第二个是这个格子离食物最远……其实策略主要是看了别人写的贪吃蛇算法搞出来的,可惜的是目前还是不能铺满整个格子orz……算法还得改啊哈哈哈o(╯□╰)o
代码如下【只放JS了】:

(function () {
    /*全局变量*/
    var g = {
        //获得or设置盒子的attribute
        attr : function (x, y, att, name) {
            var d = document.getElementById("box_" + x + "_" + y);
            if (d && name)
                d.setAttribute(att, name);
            else if (d)
                return d.getAttribute(att);
        },
        //随机创建点
        create : function (start, end) {
            return Math.floor(Math.random() * (end - start) + start);
        },
        addHandler: function (ele, type, handler) {
            if (ele.length === undefined) { if (ele.addEventListener) { ele.addEventListener(type, handler, false); } else if (ele.attachEvent) { ele.attachEvent("on" + type, handler); } else { ele['on' + type] = handler; } }
            else if (ele.length === 0) { console.log("The element is null!"); return false; }
            else { for (var i = 0; i < ele.length; i ++) {
          if (ele[i].addEventListener) { ele[i].addEventListener(type, handler, false); } else if (ele[i].attachEvent) { ele[i].attachEvent("on" + type, handler); } else { ele[i]['on' + type] = handler; } } } }, removeHandler: function(element, type, handler) { if (ele.length === undefined) { if (ele.removeEventListener) ele.removeEventListener(type, handler, false); else if (ele.detachEvent) ele.detachEvent("on" + type, handler); else ele['on' + type] = null; } else if (ele.length === 0) { return (console.log("the element is null")); } else { for (var i = 0; i < ele.length; i ++) {
             if (ele[i].removeEventListener) ele[i].removeEventListener(type, handler, false); else if (ele[i].detachEvent) ele[i].detachEvent("on" + type, handler); else ele[i]['on' + type] = null; } } }, //运动方向 direction : { left : 37, up : 38, right : 39, down : 40 }, //游戏设定 setting : { size : 20, speed : 500, len : 3, func : null, direct : null } } /*Game构造器*/ function Game (food) { this.snake = new Snake(food); this.food = food; var that = this; /*Snake构造器*/ function Snake (food) { this.headX = 0; this.headY = 0; this.lastX = 0; this.lastY = 0; this.pos = []; this.f = 0; this.h = 0; this.food = food; }; Snake.prototype.init = function () { this.headX = this.headY = this.lastX = this.lastY = 0; this.pos = []; } /*创建蛇*/ Snake.prototype.create = function () { var x = g.create(g.setting.len, g.setting.size / 2), y = g.create(g.setting.len, g.setting.size / 2); //获得蛇的坐标 for (var i = 0; i < g.setting.len; i ++) {
                y --; this.pos.push([x, y]); if (i === 0) { g.attr(x, y, "class", "snake head"); g.attr(x, y, "touchable", "0"); } else if (i === g.setting.len - 1){ g.attr(x, y, "class", "snake tail") g.attr(x, y, "touchable", "1"); } else { g.attr(x, y, "class", "snake"); g.attr(x, y, "touchable", "0"); } } this.headX = this.pos[0][0]; this.headY = this.pos[0][1]; this.lastX = this.pos[this.pos.length - 1][0]; this.lastY = this.pos[this.pos.length - 1][1]; }; /*移动*/ Snake.prototype.move = function () { this.headX = this.pos[0][0]; this.headY = this.pos[0][1]; this.lastX = this.pos[this.pos.length - 1][0]; this.lastY = this.pos[this.pos.length - 1][1]; g.attr(this.lastX, this.lastY, "class", " "); for (var i = this.pos.length - 1; i > 0; i --) {
                  this.pos
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值