board.js
changeset 12 a9a44cfc3e08
parent 9 961eff57a23f
child 14 9b49e710f5a7
--- a/board.js	Sun Sep 07 00:33:47 2014 +0300
+++ b/board.js	Sun Sep 07 03:33:33 2014 +0300
@@ -53,14 +53,14 @@
                 this.brd[i][j] = brd[i][j];
     }
 }
-BoardArr.prototype.get = function(i, j) {
+BoardArr2d.prototype.get = function(i, j) {
     return this.brd[i][j];
 }
-BoardArr.prototype.set = function(i, j, val) {
+BoardArr2d.prototype.set = function(i, j, val) {
     this.brd[i][j] = val;
 }
 /* Return and optionally fill 2d board. */
-BoardArr.prototype.exportTo = function(brd) {
+BoardArr2d.prototype.exportTo = function(brd) {
     brd = brd || [[],[],[],[]];
     for (var i = 0; i < 4; i++)
         for (var j = 0; j < 4; j++)
@@ -74,6 +74,17 @@
             brd.brd[i][j] = this.brd[i][j];
     return brd;
 }
+BoardArr2d.prototype.score = function() {
+    var score = 0;
+    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);
+        }
+    }
+    return score;
+}
 
 BoardArr2d.prototype.canRight = function() {
     for (var i = 0; i < 4; i++) {
@@ -225,47 +236,58 @@
     }
 }
 
-BoardArr2d.prototype.shiftLeft_mostly_unrolled = function(brd) {
+BoardArr2d.prototype.shiftRight_mostly_unrolled = function(brd) {
+    var updated = false;
     var from = this.brd, to = brd.brd;
-    for (var i = 3; i >= 0; i--) {
+    for (var i = 0; i < 4; i++) {
+        var moved = true;
         var f0 = from[i][0], f1 = from[i][1], f2 = from[i][2], f3 = from[i][3];
         if (f3 === 0) {
             if (f2 === 0) {
-                if (f1 === 0) { // a 0 0 0
+                if (f1 === 0) {  // a 0 0 0
+                    if (f0 === 0)
+                        moved = false;
                     f3 = f0;
                     f2 = 0;
-                } else {  // a b 0 0
+                } else {         // a b 0 0
                     f3 = f1;
                     f2 = f0;
                 }
                 f1 = 0;
-            } else { // f2 !== 0 && f3 === 0
-                if (f1 === 0) { // a 0 b 0
+            } else {             // f2 !== 0 && f3 === 0
+                if (f1 === 0) {  // a 0 b 0
                     f3 = f2;
                     f2 = f0;
-                } else { // a b c 0
+                } else {         // a b c 0
                     f3 = f2;
                     f2 = f1;
                     f1 = f0;
                 }
             }
             f0 = 0;
-        } else { // f3 !== 0
+        } else {                 // f3 !== 0
             if (f2 === 0) {
-                if (f1 === 0) { // a 0 0 b
+                if (f1 === 0) {  // a 0 0 b
+                    if (f0 === 0)
+                        moved = false;
                     f2 = f0;
-                } else {  // a b 0 c
+                } else {         // a b 0 c
                     f2 = f1;
                     f1 = f0;
                 }
                 f0 = 0;
-            } else { // f2 !== 0 && f3 !== 0
-                if (f1 === 0) { // a 0 b c
+            } else {             // f2 !== 0 && f3 !== 0
+                if (f1 === 0) {  // a 0 b c
+                    if (f0 === 0)
+                        moved = false;
                     f1 = f0;
                     f0 = 0;
-                } // else: a b c d
+                } else {         // else: a b c d
+                    moved = false;
+                }
             }
         }
+        updated = updated || moved;
         if (f2 === 0) {
             to[i][0] = 0;
             to[i][1] = 0;
@@ -277,6 +299,7 @@
             to[i][0] = 0;
             to[i][1] = 0;
             if (f2 === f3) {
+                updated = true;
                 to[i][2] = 0;
                 to[i][3] = f3 + 1;
             } else {
@@ -286,6 +309,7 @@
             continue;
         }
         if (f2 === f3) {
+            updated = true;
             to[i][0] = 0;
             to[i][3] = f3 + 1;
             if (f0 === f1) {
@@ -298,17 +322,347 @@
         } else {
             to[i][3] = f3;
             if (f1 === f2) {
+                updated = true;
                 to[i][0] = 0;
                 to[i][1] = f0;
                 to[i][2] = f2 + 1;
             } else {
-                to[i][0] = f0;
-                to[i][1] = f1;
-                to[i][2] = f2;
+                if (f0 === f1) {
+                    updated = true;
+                    to[i][0] = 0;
+                    to[i][1] = f1+1;
+                    to[i][2] = f2;
+                } else {
+                    to[i][0] = f0;
+                    to[i][1] = f1;
+                    to[i][2] = f2;
+                }
+            }
+        }
+    }
+    return updated;
+}
+BoardArr2d.prototype.shiftDown_mostly_unrolled = function(brd) {
+    var updated = false;
+    var from = this.brd, to = brd.brd;
+    for (var j = 0; j < 4; j++) {
+        var moved = true;
+        var f0 = from[0][j], f1 = from[1][j], f2 = from[2][j], f3 = from[3][j];
+        if (f3 === 0) {
+            if (f2 === 0) {
+                if (f1 === 0) {  // a 0 0 0
+                    if (f0 === 0)
+                        moved = false;
+                    f3 = f0;
+                    f2 = 0;
+                } else {         // a b 0 0
+                    f3 = f1;
+                    f2 = f0;
+                }
+                f1 = 0;
+            } else {             // f2 !== 0 && f3 === 0
+                if (f1 === 0) {  // a 0 b 0
+                    f3 = f2;
+                    f2 = f0;
+                } else {         // a b c 0
+                    f3 = f2;
+                    f2 = f1;
+                    f1 = f0;
+                }
+            }
+            f0 = 0;
+        } else {                 // f3 !== 0
+            if (f2 === 0) {
+                if (f1 === 0) {  // a 0 0 b
+                    if (f0 === 0)
+                        moved = false;
+                    f2 = f0;
+                } else {         // a b 0 c
+                    f2 = f1;
+                    f1 = f0;
+                }
+                f0 = 0;
+            } else {             // f2 !== 0 && f3 !== 0
+                if (f1 === 0) {  // a 0 b c
+                    if (f0 === 0)
+                        moved = false;
+                    f1 = f0;
+                    f0 = 0;
+                } else {         // else: a b c d
+                    moved = false;
+                }
+            }
+        }
+        updated = updated || moved;
+        if (f2 === 0) {
+            to[0][j] = 0;
+            to[1][j] = 0;
+            to[2][j] = 0;
+            to[3][j] = f3;
+            continue;
+        }
+        if (f1 === 0) {
+            to[0][j] = 0;
+            to[1][j] = 0;
+            if (f2 === f3) {
+                to[2][j] = 0;
+                to[3][j] = f3 + 1;
+                updated = true;
+            } else {
+                to[2][j] = f2;
+                to[3][j] = f3;
+            }
+            continue;
+        }
+        if (f2 === f3) {
+            updated = true;
+            to[0][j] = 0;
+            to[3][j] = f3 + 1;
+            if (f0 === f1) {
+                to[1][j] = 0;
+                to[2][j] = f1 + 1;
+            } else {
+                to[1][j] = f0;
+                to[2][j] = f1;
+            }
+        } else {
+            to[3][j] = f3;
+            if (f1 === f2) {
+                updated = true;
+                to[0][j] = 0;
+                to[1][j] = f0;
+                to[2][j] = f2 + 1;
+            } else {
+                if (f0 === f1) {
+                    updated = true;
+                    to[0][j] = 0;
+                    to[1][j] = f1+1;
+                    to[2][j] = f2;
+                } else {
+                    to[0][j] = f0;
+                    to[1][j] = f1;
+                    to[2][j] = f2;
+                }
             }
         }
     }
+    return updated;
 }
+BoardArr2d.prototype.shiftLeft_mostly_unrolled = function(brd) {
+    var updated = false;
+    var from = this.brd, to = brd.brd;
+    for (var i = 0; i < 4; i++) {
+        var moved = true;
+        var f0 = from[i][0], f1 = from[i][1], f2 = from[i][2], f3 = from[i][3];
+        if (f0 === 0) {
+            if (f1 === 0) {
+                if (f2 === 0) {  // 0 0 0 a
+                    if (f3 === 0)
+                        moved = false;
+                    f0 = f3;
+                    f1 = 0;
+                } else {         // 0 0 a b
+                    f0 = f2;
+                    f1 = f3;
+                }
+                f2 = 0;
+            } else {             // f1 !== 0 && f0 === 0
+                if (f2 === 0) {  // 0 a 0 b
+                    f0 = f1;
+                    f1 = f3;
+                } else {         // 0 a b c
+                    f0 = f1;
+                    f1 = f2;
+                    f2 = f3;
+                }
+            }
+            f3 = 0;
+        } else {                 // f0 !== 0
+            if (f1 === 0) {
+                if (f2 === 0) {  // a 0 0 b
+                    if (f3 === 0)
+                        moved = false;
+                    f1 = f3;
+                } else {         // a 0 b c
+                    f1 = f2;
+                    f2 = f3;
+                }
+                f3 = 0;
+            } else {             // f1 !== 0 && f0 !== 0
+                if (f2 === 0) {  // a b 0 c
+                    if (f3 === 0)
+                        moved = false;
+                    f2 = f3;
+                    f3 = 0;
+                } else {         // else: a b c d
+                    moved = false;
+                }
+            }
+        }
+        updated = updated || moved;
+        if (f1 === 0) {          // a 0 0 0
+            to[i][3] = 0;
+            to[i][2] = 0;
+            to[i][1] = 0;
+            to[i][0] = f0;
+            continue;
+        }
+        if (f2 === 0) {
+            to[i][3] = 0;
+            to[i][2] = 0;
+            if (f1 === f0) {     // a a 0 0
+                updated = true;
+                to[i][1] = 0;
+                to[i][0] = f0 + 1;
+            } else {             // a b 0 0
+                to[i][1] = f1;
+                to[i][0] = f0;
+            }
+            continue;
+        }
+        if (f1 === f0) {
+            updated = true;
+            to[i][3] = 0;
+            to[i][0] = f0 + 1;
+            if (f3 === f2) {     // a a b b
+                to[i][2] = 0;
+                to[i][1] = f2 + 1;
+            } else {             // a a b c
+                to[i][2] = f3;
+                to[i][1] = f2;
+            }
+        } else {
+            to[i][0] = f0;
+            if (f2 === f1) {     // a b b c
+                updated = true;
+                to[i][3] = 0;
+                to[i][2] = f3;
+                to[i][1] = f1 + 1;
+            } else {
+                to[i][1] = f1;
+                if (f2 === f3) { // a b c c
+                    updated = true;
+                    to[i][3] = 0;
+                    to[i][2] = f2+1;
+                } else {         // a b c d
+                    to[i][3] = f3;
+                    to[i][2] = f2;
+                }
+            }
+        }
+   }
+    return updated;
+}
+BoardArr2d.prototype.shiftUp_mostly_unrolled = function(brd) {
+    var updated = false;
+    var from = this.brd, to = brd.brd;
+    for (var j = 0; j < 4; j++) {
+        var moved = true;
+        var f0 = from[0][j], f1 = from[1][j], f2 = from[2][j], f3 = from[3][j];
+        if (f0 === 0) {
+            if (f1 === 0) {
+                if (f2 === 0) {  // 0 0 0 a
+                    if (f3 === 0)
+                        moved = false;
+                    f0 = f3;
+                    f1 = 0;
+                } else {         // 0 0 a b
+                    f0 = f2;
+                    f1 = f3;
+                }
+                f2 = 0;
+            } else {             // f1 !== 0 && f0 === 0
+                if (f2 === 0) {  // 0 a 0 b
+                    f0 = f1;
+                    f1 = f3;
+                } else {         // 0 a b c
+                    f0 = f1;
+                    f1 = f2;
+                    f2 = f3;
+                }
+            }
+            f3 = 0;
+        } else {                 // f0 !== 0
+            if (f1 === 0) {
+                if (f2 === 0) {  // a 0 0 b
+                    if (f3 === 0)
+                        moved = false;
+                    f1 = f3;
+                } else {         // a 0 b c
+                    f1 = f2;
+                    f2 = f3;
+                }
+                f3 = 0;
+            } else {             // f1 !== 0 && f0 !== 0
+                if (f2 === 0) {  // a b 0 c
+                    if (f3 === 0)
+                        moved = false;
+                    f2 = f3;
+                    f3 = 0;
+                } else {         // else: a b c d
+                    moved = false;
+                }
+            }
+        }
+        updated = updated || moved;
+        if (f1 === 0) {          // a 0 0 0
+            to[3][j] = 0;
+            to[2][j] = 0;
+            to[1][j] = 0;
+            to[0][j] = f0;
+            continue;
+        }
+        if (f2 === 0) {
+            to[3][j] = 0;
+            to[2][j] = 0;
+            if (f1 === f0) {     // a a 0 0
+                updated = true;
+                to[1][j] = 0;
+                to[0][j] = f0 + 1;
+            } else {             // a b 0 0
+                to[1][j] = f1;
+                to[0][j] = f0;
+            }
+            continue;
+        }
+        if (f1 === f0) {
+            to[3][j] = 0;
+            to[0][j] = f0 + 1;
+            if (f3 === f2) {     // a a b b
+                updated = true;
+                to[2][j] = 0;
+                to[1][j] = f2 + 1;
+            } else {             // a a b c
+                to[2][j] = f3;
+                to[1][j] = f2;
+            }
+        } else {
+            to[0][j] = f0;
+            if (f2 === f1) {     // a b b c
+                updated = true;
+                to[3][j] = 0;
+                to[2][j] = f3;
+                to[1][j] = f1 + 1;
+            } else {
+                to[1][j] = f1;
+                if (f2 === f3) { // a b c c
+                    updated = true;
+                    to[3][j] = 0;
+                    to[2][j] = f2+1;
+                } else {         // a b c d
+                    to[3][j] = f3;
+                    to[2][j] = f2;
+                }
+            }
+        }
+    }
+    return updated;
+}
+
+BoardArr2d.prototype.left = BoardArr2d.prototype.shiftLeft_mostly_unrolled;
+BoardArr2d.prototype.right = BoardArr2d.prototype.shiftRight_mostly_unrolled;
+BoardArr2d.prototype.up = BoardArr2d.prototype.shiftUp_mostly_unrolled;
+BoardArr2d.prototype.down = BoardArr2d.prototype.shiftDown_mostly_unrolled;