Add some BoardArr function. Speedup score calculation.
authorOleksandr Gavenko <gavenkoa@gmail.com>
Tue, 23 Sep 2014 00:37:34 +0300
changeset 114 1c3fdde0d481
parent 113 fc058d27e829
child 115 9e01c6c0c679
Add some BoardArr function. Speedup score calculation.
board.js
--- a/board.js	Tue Sep 23 00:16:57 2014 +0300
+++ b/board.js	Tue Sep 23 00:37:34 2014 +0300
@@ -24,6 +24,16 @@
 BoardArr.prototype.set = function(i, j, val) {
     this.brd[4*i + j] = val;
 }
+/** Compare boards. */
+BoardArr.prototype.equals = function(brd) {
+    var from = this.brd, to = brd.brd;
+    // More often corners differ, check it first.
+    return from[0] === to[0] && from[3] === to[3] && from[12] === to[12] && from[15] === to[15]
+        && from[1] === to[1] && from[2] === to[2]
+        && from[4] === to[4] && from[5] === to[5] && from[6] === to[6] && from[7] === to[7]
+        && from[8] === to[8] && from[9] === to[9] && from[10] === to[10] && from[11] === to[11]
+        && from[13] === to[13] && from[14] === to[14];
+}
 /* Return and optionally fill 2d board.
  * Doesn't designed to be efficient. */
 BoardArr.prototype.exportTo = function(brd) {
@@ -39,6 +49,32 @@
         brd.brd[i] = this.brd[i];
     return brd;
 }
+/** Number of free cell. */
+BoardArr.prototype.free = function() {
+    var cnt = 0;
+    for (var i = 0; i < 16; i++)
+        if (this.brd[i] === 0)
+            cnt++;
+    return cnt;
+}
+BoardArr.prototype.score = function() {
+    var score = 0;
+    for (var i = 0; i < 16; i++) {
+        var v = this.brd[i][j];
+        if (v > 1)
+            score += (v-1)*(1 << v);
+    }
+    return score;
+}
+BoardArr.prototype.max = function() {
+    var max = 0;
+    for (var i = 0; i < 4; i++) {
+        for (var j = 0; j < 4; j++) {
+            max = Math.max(max, this.brd[i][j]);
+        }
+    }
+    return max;
+}
 
 
 
@@ -81,6 +117,7 @@
         && x1[0] === y1[0] && x1[1] === y1[1] && x1[2] === y1[2] && x1[3] === y1[3]
         && x2[0] === y2[0] && x2[1] === y2[1] && x2[2] === y2[2] && x2[3] === y2[3];
 }
+/** Compare boards. */
 BoardArr2d.prototype.equals = BoardArr2d.prototype.equals_unrolled;
 
 /* Return and optionally fill 2d board. */
@@ -98,6 +135,7 @@
             brd.brd[i][j] = this.brd[i][j];
     return brd;
 }
+/** Number of free cell. */
 BoardArr2d.prototype.free = function() {
     var cnt = 0;
     for (var i = 0; i < 4; i++)
@@ -111,8 +149,8 @@
     for (var i = 0; i < 4; i++) {
         for (var j = 0; j < 4; j++) {
             var v = this.brd[i][j];
-            if (v > 0)
-                score += (v-1)*Math.pow(2, v);
+            if (v > 1)
+                score += (v-1)*(1 << v);
         }
     }
     return score;
@@ -764,6 +802,7 @@
             brd[i][j] = this.brd[4*i + j];
     return brd;
 }
+/** Compare boards. */
 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
@@ -789,6 +828,7 @@
     brd.da = self.da; brd.db = self.db; brd.dc = self.dc; brd.dd = self.dd;
     return brd;
 }
+/** Number of free cell. */
 BoardObj.prototype.free = function() {
     var cnt = 0;
     var brd = this.brd;