ai.js
changeset 10 70ece7f758a0
child 12 a9a44cfc3e08
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ai.js	Sun Sep 07 00:19:00 2014 +0300
@@ -0,0 +1,106 @@
+"use strict";
+
+var ai = {};
+
+// Each strategy is a function that except current board position as 2d array and context from
+// previous call to share state/precomputed values between calls.
+
+
+////////////////////////////////////////////////////////////////
+// Random AI.
+////////////////////////////////////////////////////////////////
+
+ai.random = function(brdEngine) {
+    this.brdEngine = brdEngine;
+}
+ai.random.prototype.analyse = function(brd) {
+    var tmpBrd = new this.brdEngine(brd);
+    while (true) {
+        var rnd = Math.floor(Math.random()*4);
+        if (tmpBrd[["canUp", "canDown", "canLeft", "canRight"][rnd]]())
+            return ["up", "down", "left", "right"][rnd];
+    }
+}
+
+
+////////////////////////////////////////////////////////////////
+// 1 level deep on max scores.
+////////////////////////////////////////////////////////////////
+
+ai.nextMaxScore = function(brd) {
+    var tmpBrd = board.create();
+    board.copy(brd, tmpBrd);
+    var maxScore = -1;
+    var action;
+    if (board.move.up(tmpBrd)) {
+        maxScore = board.score(tmpBrd).score;
+        action = "up";
+    }
+    board.copy(brd, tmpBrd);
+    if (board.move.left(tmpBrd)) {
+        var score = board.score(tmpBrd).score;
+        if (maxScore < score) {
+            action = "left";
+            maxScore = score;
+        }
+    }
+    board.copy(brd, tmpBrd);
+    if (board.move.down(tmpBrd)) {
+        var score = board.score(tmpBrd).score;
+        if (maxScore < score) {
+            action = "down";
+            maxScore = score;
+        }
+    }
+    board.copy(brd, tmpBrd);
+    if (board.move.right(tmpBrd)) {
+        var score = board.score(tmpBrd).score;
+        if (maxScore < score) {
+            action = "right";
+            maxScore = score;
+        }
+    }
+    return action;
+}
+
+
+////////////////////////////////////////////////////////////////
+// 1 level deep on max value.
+////////////////////////////////////////////////////////////////
+
+ai.nextMaxValue = function(brd) {
+    var tmpBrd = board.create();
+    board.copy(brd, tmpBrd);
+    var maxMax = -1;
+    var action;
+    if (board.move.up(tmpBrd)) {
+        maxMax = board.score(tmpBrd).max;
+        action = "up";
+    }
+    board.copy(brd, tmpBrd);
+    if (board.move.left(tmpBrd)) {
+        var max = board.score(tmpBrd).max;
+        if (maxMax < max) {
+            action = "left";
+            maxMax = max;
+        }
+    }
+    board.copy(brd, tmpBrd);
+    if (board.move.down(tmpBrd)) {
+        var max = board.score(tmpBrd).max;
+        if (maxMax < max) {
+            action = "down";
+            maxMax = max;
+        }
+    }
+    board.copy(brd, tmpBrd);
+    if (board.move.right(tmpBrd)) {
+        var max = board.score(tmpBrd).max;
+        if (maxMax < max) {
+            action = "right";
+            maxMax = max;
+        }
+    }
+    return action;
+}
+