写了几天,搞定了贪吃蛇自动寻路……目前在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