rule.js
changeset 10 70ece7f758a0
child 12 a9a44cfc3e08
equal deleted inserted replaced
9:961eff57a23f 10:70ece7f758a0
       
     1 "use strict";
       
     2 
       
     3 var board = {};
       
     4 board.create = function() {
       
     5     var brd = [];
       
     6     for (var i = 0; i < 4; i++) {
       
     7         brd[i] = [];
       
     8         for (var j = 0; j < 4; j++) {
       
     9             brd[i][j] = 0;
       
    10         }
       
    11     }
       
    12     return brd;
       
    13 }
       
    14 board.copy = function(from, to) {
       
    15     for (var i = 0; i < 4; i++) {
       
    16         for (var j = 0; j < 4; j++) {
       
    17             to[i][j] = from[i][j];
       
    18         }
       
    19     }
       
    20 }
       
    21 board.freeCnt = function(brd) {
       
    22     var cnt = 0;
       
    23     for (var i = 0; i < 4; i++) {
       
    24         for (var j = 0; j < 4; j++) {
       
    25             if (brd[i][j] === 0)
       
    26                 cnt++;
       
    27         }
       
    28     }
       
    29     return cnt;
       
    30 }
       
    31 board.gameOver = function(brd) {
       
    32     if (board.freeCnt(brd) > 0)
       
    33         return false;
       
    34     for (var i = 0; i < 4; i++) {
       
    35         for (var j = 0; j < 3; j++) {
       
    36             if (brd[i][j] === brd[i][j+1])
       
    37                 return false;
       
    38         }
       
    39     }
       
    40     for (var j = 0; j < 4; j++) {
       
    41         for (var i = 0; i < 3; i++) {
       
    42             if (brd[i][j] === brd[i+1][j])
       
    43                 return false;
       
    44         }
       
    45     }
       
    46     return true;
       
    47 }
       
    48 board.putRandom = function(brd) {
       
    49     var cnt = board.freeCnt(brd);
       
    50     cnt = Math.floor(Math.random() * cnt)+1;
       
    51     for (var i = 0; i < 4 && cnt > 0; i++) {
       
    52         for (var j = 0; j < 4 && cnt > 0; j++) {
       
    53             if (brd[i][j] !== 0)
       
    54                 continue;
       
    55             if (cnt === 1)
       
    56                 brd[i][j] = (Math.random() > .9) ? 2 : 1;
       
    57             cnt--;
       
    58         }
       
    59     }
       
    60 }
       
    61 /* http://www.reddit.com/r/2048/comments/214njx/highest_possible_score_for_2048_warning_math */
       
    62 var boardScoreTbl = [0];
       
    63 for (var i = 1, exp = 2; i < 16; i++, exp *= 2) {
       
    64     boardScoreTbl[i] = (i-1)*exp;
       
    65 }
       
    66 board.score = function(brd) {
       
    67     var score = 0;
       
    68     var max = 0;
       
    69     for (var i = 0; i < 4; i++) {
       
    70         for (var j = 0; j < 4; j++) {
       
    71             var val = brd[i][j];
       
    72             score += boardScoreTbl[val];
       
    73             if (max < val)
       
    74                 max = val;
       
    75         }
       
    76     }
       
    77     return {score: score, max: Math.pow(2, max)};
       
    78 }
       
    79 
       
    80 board.row = {};
       
    81 board.row.init = function() {
       
    82     return {stack: [], curr: 0};
       
    83 }
       
    84 board.row.push = function(state, val) {
       
    85     if (val === 0)
       
    86         return;
       
    87     if (state.curr === 0) {
       
    88         state.curr = val;
       
    89         return;
       
    90     }
       
    91     if (state.curr === val) {
       
    92         state.stack.push(state.curr+1);
       
    93         state.curr = 0;
       
    94     } else {
       
    95         state.stack.push(state.curr);
       
    96         state.curr = val;
       
    97     }
       
    98 }
       
    99 board.row.finish = function(state) {
       
   100     if (state.curr !== 0)
       
   101         state.stack.push(state.curr);
       
   102 }
       
   103 board.move = {};
       
   104 board.move.up = function(brd) {
       
   105     var updated = false;
       
   106     for (var j = 0; j < 4; j++) {
       
   107         var state = board.row.init();
       
   108         for (var i = 0; i < 4; i++) {
       
   109             board.row.push(state, brd[i][j]);
       
   110         }
       
   111         board.row.finish(state);
       
   112         for (var i = 0; i < state.stack.length; i++) {
       
   113             if (brd[i][j] !== state.stack[i])
       
   114                 updated = true;
       
   115             brd[i][j] = state.stack[i];
       
   116         }
       
   117         for (; i < 4; i++) {
       
   118             if (brd[i][j] !== 0)
       
   119                 updated = true;
       
   120             brd[i][j] = 0;
       
   121         }
       
   122     }
       
   123     return updated;
       
   124 };
       
   125 board.move.down = function(brd) {
       
   126     var updated = false;
       
   127     for (var j = 0; j < 4; j++) {
       
   128         var state = board.row.init();
       
   129         for (var i = 3; i >= 0; i--) {
       
   130             board.row.push(state, brd[i][j]);
       
   131         }
       
   132         board.row.finish(state);
       
   133         for (var i = 0; i < state.stack.length; i++) {
       
   134             if (brd[3-i][j] !== state.stack[i])
       
   135                 updated = true;
       
   136             brd[3-i][j] = state.stack[i];
       
   137         }
       
   138         for (; i < 4; i++) {
       
   139             if (brd[3-i][j] !== 0)
       
   140                 updated = true;
       
   141             brd[3-i][j] = 0;
       
   142         }
       
   143     }
       
   144     return updated;
       
   145 };
       
   146 board.move.left = function(brd) {
       
   147     var updated = false;
       
   148     for (var i = 0; i < 4; i++) {
       
   149         var state = board.row.init();
       
   150         for (var j = 0; j < 4; j++) {
       
   151             board.row.push(state, brd[i][j]);
       
   152         }
       
   153         board.row.finish(state);
       
   154         for (var j = 0; j < state.stack.length; j++) {
       
   155             if (brd[i][j] !== state.stack[j])
       
   156                 updated = true;
       
   157             brd[i][j] = state.stack[j];
       
   158         }
       
   159         for (; j < 4; j++) {
       
   160             if (brd[i][j] !== 0)
       
   161                 updated = true;
       
   162             brd[i][j] = 0;
       
   163         }
       
   164     }
       
   165     return updated;
       
   166 };
       
   167 board.move.right = function(brd) {
       
   168     var updated = false;
       
   169     for (var i = 0; i < 4; i++) {
       
   170         var state = board.row.init();
       
   171         for (var j = 3; j >= 0; j--) {
       
   172             board.row.push(state, brd[i][j]);
       
   173         }
       
   174         board.row.finish(state);
       
   175         for (var j = 0; j < state.stack.length; j++) {
       
   176             if (brd[i][3-j] !== state.stack[j])
       
   177                 updated = true;
       
   178             brd[i][3-j] = state.stack[j];
       
   179         }
       
   180         for (; j < 4; j++) {
       
   181             if (brd[i][3-j] !== 0)
       
   182                 updated = true;
       
   183             brd[i][3-j] = 0;
       
   184         }
       
   185     }
       
   186     return updated;
       
   187 };