diff -r 1959a0505639 -r c2bf15c3b80b board.js --- a/board.js Mon Sep 22 20:57:50 2014 +0300 +++ b/board.js Mon Sep 22 21:29:21 2014 +0300 @@ -764,3 +764,196 @@ brd[i][j] = this.brd[4*i + j]; return brd; } +BoardObj.prototype.equals = function(brd) { + var self = this.brd; + return self.aa == brd.aa && self.ad == brd.ad && self.da == brd.da && self.dd == brd.dd + && self.ab == brd.ab && self.ac == brd.ac + && self.ba == brd.ba && self.ca == brd.ca + && self.bd == brd.bd && self.cd == brd.cd + && self.db == brd.db && self.dc == brd.dc + && self.bb == brd.bb && self.bc == brd.bc && self.cb == brd.cb && self.cc == brd.cc; +}; +BoardObj.prototype.copy = function(brd) { + var self = this.brd; + if ( ! brd) { + var newBrd = new Object(BoardObj.prototype); + newBrd.brd = { aa: self.aa, ab: self.ab, ac: self.ac, ad: self.ad, + ba: self.ba, bb: self.bb, bc: self.bc, bd: self.bd, + ca: self.ca, cb: self.cb, cc: self.cc, cd: self.cd, + da: self.da, db: self.db, dc: self.dc, dd: self.dd }; + return newBrd; + } + brd.aa = self.aa; brd.ab = self.ab; brd.ac = self.ac; brd.ad = self.ad; + brd.ba = self.ba; brd.bb = self.bb; brd.bc = self.bc; brd.bd = self.bd; + brd.ca = self.ca; brd.cb = self.cb; brd.cc = self.cc; brd.cd = self.cd; + brd.da = self.da; brd.db = self.db; brd.dc = self.dc; brd.dd = self.dd; + return brd; +} +BoardObj.prototype.free = function() { + var cnt = 0; + var brd = this.brd; + if (brd.aa === 0) cnt++; if (brd.ab === 0) cnt++; if (brd.ac === 0) cnt++; if (brd.ad === 0) cnt++; + if (brd.ba === 0) cnt++; if (brd.bb === 0) cnt++; if (brd.bc === 0) cnt++; if (brd.bd === 0) cnt++; + if (brd.ca === 0) cnt++; if (brd.cb === 0) cnt++; if (brd.cc === 0) cnt++; if (brd.cd === 0) cnt++; + if (brd.da === 0) cnt++; if (brd.db === 0) cnt++; if (brd.dc === 0) cnt++; if (brd.dd === 0) cnt++; + return cnt; +} +BoardObj.prototype.score = function() { + var score = 0; + var brd = this.brd; + var v = brd.aa; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.ab; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.ac; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.ad; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.ba; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.bb; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.bc; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.bd; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.ca; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.cb; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.cc; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.cd; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.da; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.db; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.dc; + if (v > 1) score += (v-1)*(1 << v); + var v = brd.dd; + if (v > 1) score += (v-1)*(1 << v); + return score; +} +BoardObj.prototype.max = function() { + var brd = this.brd; + var max = brd.aa; + max = Math.max(max, brd.ab); + max = Math.max(max, brd.ac); + max = Math.max(max, brd.ad); + max = Math.max(max, brd.ba); + max = Math.max(max, brd.bb); + max = Math.max(max, brd.bc); + max = Math.max(max, brd.bd); + max = Math.max(max, brd.ca); + max = Math.max(max, brd.cb); + max = Math.max(max, brd.cc); + max = Math.max(max, brd.cd); + max = Math.max(max, brd.da); + max = Math.max(max, brd.db); + max = Math.max(max, brd.dc); + max = Math.max(max, brd.dd); + return max; +} +BoardObj.prototype.find = function(val) { + var xy = []; + var brd = this.brd; + if (brd.aa === val) xy.push([0,0]); if (brd.ab === val) xy.push([0,1]); if (brd.ac === val) xy.push([0,2]); if (brd.ad === val) xy.push([0,3]); + if (brd.ba === val) xy.push([1,0]); if (brd.bb === val) xy.push([1,1]); if (brd.bc === val) xy.push([1,2]); if (brd.bd === val) xy.push([1,3]); + if (brd.ca === val) xy.push([2,0]); if (brd.cb === val) xy.push([2,1]); if (brd.cc === val) xy.push([2,2]); if (brd.cd === val) xy.push([2,3]); + if (brd.da === val) xy.push([3,0]); if (brd.db === val) xy.push([3,1]); if (brd.dc === val) xy.push([3,2]); if (brd.dd === val) xy.push([3,3]); + return xy; +} +BoardObj.prototype.atEdge = function(val) { + var brd = this.brd; + return (brd.aa === val) || (brd.ab === val) || (brd.ac === val) || (brd.ad === val) + || (brd.ba === val) || (brd.bd === val) + || (brd.ca === val) || (brd.cd === val) + || (brd.da === val) || (brd.db === val) || (brd.dc === val) || (brd.dd === val); +} +BoardObj.prototype.atCorner = function(val) { + var brd = this.brd; + return (brd.aa === val) || (brd.ad === val) || (brd.da === val) || (brd.dd === val); +} + +BoardObj.prototype.canRight = function() { + var brd = this.brd; + var f0 = brd.aa, f1 = brd.ab, f2 = brd.ac, f3 = brd.ad; + if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; + if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; + if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; + var f0 = brd.ba, f1 = brd.bb, f2 = brd.bc, f3 = brd.bd; + if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; + if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; + if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; + var f0 = brd.ca, f1 = brd.cb, f2 = brd.cc, f3 = brd.cd; + if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; + if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; + if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; + var f0 = brd.da, f1 = brd.db, f2 = brd.dc, f3 = brd.dd; + if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; + if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; + if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; + return false; +} +BoardObj.prototype.canLeft = function() { + var brd = this.brd; + var f0 = brd.aa, f1 = brd.ab, f2 = brd.ac, f3 = brd.ad; + if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; + if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; + if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; + var f0 = brd.ba, f1 = brd.bb, f2 = brd.bc, f3 = brd.bd; + if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; + if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; + if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; + var f0 = brd.ca, f1 = brd.cb, f2 = brd.cc, f3 = brd.cd; + if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; + if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; + if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; + var f0 = brd.da, f1 = brd.db, f2 = brd.dc, f3 = brd.dd; + if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; + if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; + if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; + return false; +} +BoardObj.prototype.canUp = function() { + var brd = this.brd; + var f0 = brd.aa, f1 = brd.ba, f2 = brd.ca, f3 = brd.da; + if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; + if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; + if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; + var f0 = brd.ab, f1 = brd.bb, f2 = brd.cb, f3 = brd.db; + if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; + if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; + if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; + var f0 = brd.ac, f1 = brd.bc, f2 = brd.cc, f3 = brd.dc; + if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; + if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; + if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; + var f0 = brd.ad, f1 = brd.bd, f2 = brd.cd, f3 = brd.dd; + if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; + if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; + if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; + return false; +} +BoardObj.prototype.canDown = function() { + var brd = this.brd; + var f0 = brd.aa, f1 = brd.ba, f2 = brd.ca, f3 = brd.da; + if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; + if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; + if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; + var f0 = brd.ab, f1 = brd.bb, f2 = brd.cb, f3 = brd.db; + if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; + if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; + if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; + var f0 = brd.ac, f1 = brd.bc, f2 = brd.cc, f3 = brd.dc; + if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; + if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; + if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; + var f0 = brd.ad, f1 = brd.bd, f2 = brd.cd, f3 = brd.dd; + if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; + if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; + if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; + return false; +} +