board.js
changeset 93 c2bf15c3b80b
parent 57 94e1b2d0bd31
child 114 1c3fdde0d481
--- 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;
+}
+