author | Oleksandr Gavenko <gavenkoa@gmail.com> |
Mon, 08 Sep 2014 19:42:32 +0300 | |
changeset 21 | ed0292f0c7c6 |
parent 20 | ab294e8db00c |
child 24 | 079bcd734b68 |
permissions | -rw-r--r-- |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
1 |
"use strict"; |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
2 |
|
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
3 |
var ai = {}; |
19
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
4 |
ai.dirs = ["up", "down", "left", "right"]; |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
5 |
|
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
6 |
// Each strategy is a function that except current board position as 2d array and context from |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
7 |
// previous call to share state/precomputed values between calls. |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
8 |
|
12
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
9 |
|
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
10 |
|
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
11 |
//////////////////////////////////////////////////////////////// |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
12 |
// Random AI. |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
13 |
//////////////////////////////////////////////////////////////// |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
14 |
|
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
15 |
ai.random = function(brdEngine) { |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
16 |
this.brdEngine = brdEngine; |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
17 |
} |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
18 |
ai.random.prototype.analyse = function(brd) { |
12
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
19 |
var origBrd = new this.brdEngine(brd); |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
20 |
while (true) { |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
21 |
var rnd = Math.floor(Math.random()*4); |
12
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
22 |
if (origBrd[["canUp", "canDown", "canLeft", "canRight"][rnd]]()) |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
23 |
return ["up", "down", "left", "right"][rnd]; |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
24 |
} |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
25 |
} |
12
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
26 |
/* Mark that next board will be unrelated to previous, so any stored precompution can be cleared. */ |
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
27 |
ai.random.prototype.cleanup = function() { } |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
28 |
|
12
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
29 |
|
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
30 |
|
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
31 |
//////////////////////////////////////////////////////////////// |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
32 |
// 1 level deep on max scores. |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
33 |
//////////////////////////////////////////////////////////////// |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
34 |
|
12
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
35 |
ai.nextMaxScore = function(brdEngine) { |
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
36 |
this.brdEngine = brdEngine; |
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
37 |
} |
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
38 |
ai.nextMaxScore.prototype.analyse = function(brd) { |
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
39 |
var origBrd = new this.brdEngine(brd); |
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
40 |
var nextBrd = new this.brdEngine(); |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
41 |
var maxScore = -1; |
19
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
42 |
var bestDir; |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
43 |
for (var i = 0; i < ai.dirs.length; i++) { |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
44 |
var dir = ai.dirs[i]; |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
45 |
if (origBrd[dir](nextBrd)) { |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
46 |
var score = nextBrd.score(); |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
47 |
if (maxScore < score) { |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
48 |
bestDir = dir; |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
49 |
maxScore = score; |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
50 |
} |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
51 |
} |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
52 |
} |
19
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
53 |
return bestDir; |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
54 |
} |
12
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
55 |
/* Mark that next board will be unrelated to previous, so any stored precompution can be cleared. */ |
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
56 |
ai.nextMaxScore.prototype.cleanup = function() { } |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
57 |
|
12
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
58 |
|
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
59 |
|
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
60 |
//////////////////////////////////////////////////////////////// |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
61 |
// 1 level deep on max value. |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
62 |
//////////////////////////////////////////////////////////////// |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
63 |
|
12
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
64 |
ai.nextMaxValue = function(brdEngine) { |
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
65 |
this.brdEngine = brdEngine; |
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
66 |
} |
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
67 |
ai.nextMaxValue.prototype.analyse = function(brd) { |
14
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
68 |
var origBrd = new this.brdEngine(brd); |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
69 |
var nextBrd = new this.brdEngine(); |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
70 |
var maxMax = -1; |
19
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
71 |
var bestDir; |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
72 |
for (var i = 0; i < ai.dirs.length; i++) { |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
73 |
var dir = ai.dirs[i]; |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
74 |
if (origBrd[dir](nextBrd)) { |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
75 |
var max = nextBrd.score(); |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
76 |
if (maxMax < max) { |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
77 |
maxMax = max; |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
78 |
bestDir = dir; |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
79 |
} |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
80 |
} |
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
81 |
} |
19
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
82 |
return bestDir; |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
83 |
} |
12
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
84 |
/* Mark that next board will be unrelated to previous, so any stored precompution can be cleared. */ |
a9a44cfc3e08
Moves for 2d array board + test toolkit.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
10
diff
changeset
|
85 |
ai.nextMaxScore.prototype.cleanup = function() { } |
10
70ece7f758a0
Move rule and AI engine to separate files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff
changeset
|
86 |
|
14
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
87 |
|
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
88 |
//////////////////////////////////////////////////////////////// |
18
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
89 |
// N level deep on score value without random simulation. |
14
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
90 |
//////////////////////////////////////////////////////////////// |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
91 |
|
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
92 |
ai.deepMaxScore = function(brdEngine) { |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
93 |
this.brdEngine = brdEngine; |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
94 |
} |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
95 |
ai.deepMaxScore.prototype.analyse = function(brd) { |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
96 |
var origBrd = new this.brdEngine(brd); |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
97 |
var nextBrd = new this.brdEngine(); |
18
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
98 |
var prevScore = -1, nextScore = -1; |
14
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
99 |
var maxScore = -1; |
18
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
100 |
var bestDir; |
19
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
101 |
for (var i = 0; i < ai.dirs.length; i++) { |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
102 |
var dir = ai.dirs[i]; |
18
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
103 |
if (origBrd[dir](nextBrd)) { |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
104 |
nextScore = nextBrd.score(); |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
105 |
var score = this.bestScore(nextBrd); |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
106 |
// console.log("dir: %o, prevScore: %o, nextScore: %o, maxScore: %o, score: %o", dir, prevScore, nextScore, maxScore, score); |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
107 |
if (maxScore < score || (maxScore === score && prevScore < nextScore)) { |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
108 |
prevScore = nextScore; |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
109 |
maxScore = score; |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
110 |
bestDir = dir; |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
111 |
} |
14
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
112 |
} |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
113 |
} |
18
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
114 |
return bestDir; |
14
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
115 |
} |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
116 |
ai.deepMaxScore.prototype.bestScore = function(brd, seenBrds) { |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
117 |
if (seenBrds) { |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
118 |
for (var i = 0; i < seenBrds.length; i++) |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
119 |
if (brd.equals(seenBrds[i])) |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
120 |
return 0; |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
121 |
} else { |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
122 |
seenBrds = []; |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
123 |
} |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
124 |
seenBrds.push(brd); |
18
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
125 |
var currScore = brd.score(); |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
126 |
var maxScore = currScore; |
14
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
127 |
var nextBrd = new this.brdEngine(); |
19
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
128 |
for (var i = 0; i < ai.dirs.length; i++) { |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
129 |
if (brd[ai.dirs[i]](nextBrd)) { |
18
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
130 |
var score = nextBrd.score(); |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
131 |
if (score > currScore) |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
132 |
maxScore = Math.max(maxScore, this.bestScore(nextBrd, seenBrds)); |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
133 |
} |
42d62e5123b2
Choose move that lead to maximum next score among all possible when next moves
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
14
diff
changeset
|
134 |
} |
14
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
135 |
return maxScore; |
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
136 |
} |
19
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
137 |
/* Mark that next board will be unrelated to previous, so any stored precompution can be cleared. */ |
94a4201d27a3
Fold code into loops.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
18
diff
changeset
|
138 |
ai.deepMaxScore.prototype.cleanup = function() { } |
14
9b49e710f5a7
Add "N level deep on score value without random" AI.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
12
diff
changeset
|
139 |
|
20
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
140 |
|
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
141 |
//////////////////////////////////////////////////////////////// |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
142 |
// N level deep on score value + max value prefer corner, |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
143 |
// without random simulation. |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
144 |
//////////////////////////////////////////////////////////////// |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
145 |
|
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
146 |
/* cfg.cornerBonus - value to add if max value at corner. */ |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
147 |
/* cfg.edgeBonus - value to add if max value at edge. */ |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
148 |
ai.deepMaxScoreCorner = function(brdEngine, cfg) { |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
149 |
this.brdEngine = brdEngine; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
150 |
this.cfg = cfg || {}; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
151 |
this.cfg.cornerBonus = this.cfg.cornerBonus || 20000; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
152 |
this.cfg.edgeBonus = this.cfg.edgeBonus || 100; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
153 |
this.cfg.freeBonus = this.cfg.edgeBonus || 100; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
154 |
} |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
155 |
ai.deepMaxScoreCorner.prototype.scoreCorner = function(brd) { |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
156 |
var score = brd.score(); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
157 |
var max = brd.max(); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
158 |
if (brd.atCorner(max)) |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
159 |
score += this.cfg.cornerBonus; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
160 |
else if (brd.atEdge(max)) |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
161 |
score += this.cfg.edgeBonus; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
162 |
score += brd.free() * this.cfg.freeBonus; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
163 |
return score; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
164 |
} |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
165 |
ai.deepMaxScoreCorner.prototype.scoreEdge = function(brd) { |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
166 |
var score = brd.score(); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
167 |
var max = brd.max(); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
168 |
if (brd.atEdge(max)) |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
169 |
score += this.cfg.edgeBonus; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
170 |
score += brd.free() * this.cfg.freeBonus; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
171 |
return score; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
172 |
} |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
173 |
ai.deepMaxScoreCorner.prototype.analyse = function(brd) { |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
174 |
var origBrd = new this.brdEngine(brd); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
175 |
var nextBrd = new this.brdEngine(); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
176 |
var prevScore = -1, nextScore = -1; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
177 |
var maxScore = -1; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
178 |
var bestDir; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
179 |
for (var i = 0; i < ai.dirs.length; i++) { |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
180 |
var dir = ai.dirs[i]; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
181 |
if (origBrd[dir](nextBrd)) { |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
182 |
nextScore = this.scoreCorner(nextBrd); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
183 |
var score = this.bestScore(nextBrd); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
184 |
// console.log("dir: %o, prevScore: %o, nextScore: %o, maxScore: %o, score: %o", dir, prevScore, nextScore, maxScore, score); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
185 |
if (maxScore < score || (maxScore === score && prevScore < nextScore)) { |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
186 |
prevScore = nextScore; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
187 |
maxScore = score; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
188 |
bestDir = dir; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
189 |
} |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
190 |
} |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
191 |
} |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
192 |
return bestDir; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
193 |
} |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
194 |
ai.deepMaxScoreCorner.prototype.bestScore = function(brd, seenBrds) { |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
195 |
if (seenBrds) { |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
196 |
for (var i = 0; i < seenBrds.length; i++) |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
197 |
if (brd.equals(seenBrds[i])) |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
198 |
return 0; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
199 |
} else { |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
200 |
seenBrds = []; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
201 |
} |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
202 |
seenBrds.push(brd); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
203 |
var currScore = this.scoreEdge(brd); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
204 |
var maxScore = currScore; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
205 |
var nextBrd = new this.brdEngine(); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
206 |
for (var i = 0; i < ai.dirs.length; i++) { |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
207 |
if (brd[ai.dirs[i]](nextBrd)) { |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
208 |
var score = this.scoreEdge(nextBrd); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
209 |
if (score > currScore) |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
210 |
maxScore = Math.max(maxScore, this.bestScore(nextBrd, seenBrds)); |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
211 |
} |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
212 |
} |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
213 |
return maxScore; |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
214 |
} |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
215 |
/* Mark that next board will be unrelated to previous, so any stored precompution can be cleared. */ |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
216 |
ai.deepMaxScoreCorner.prototype.cleanup = function() { } |
ab294e8db00c
Add detecting value at edge or corner, free cell count. Added AI that count
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
19
diff
changeset
|
217 |
|
21
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
218 |
|
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
219 |
//////////////////////////////////////////////////////////////// |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
220 |
// N level deep with random simulation. |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
221 |
//////////////////////////////////////////////////////////////// |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
222 |
|
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
223 |
/* cfg.cornerBonus - value to add if max value at corner. */ |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
224 |
/* cfg.edgeBonus - value to add if max value at edge. */ |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
225 |
ai.expectimax = function(brdEngine, cfg) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
226 |
this.brdEngine = brdEngine; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
227 |
this.cfg = cfg || {}; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
228 |
this.cfg.balance = this.cfg.balance || .9; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
229 |
if (!this.cfg.depth || this.cfg.depth < 0 || 8 <= this.cfg.depth) |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
230 |
this.cfg.depth = 5; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
231 |
this.cfg.cornerBonus = this.cfg.cornerBonus || 20000; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
232 |
this.cfg.edgeBonus = this.cfg.edgeBonus || 100; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
233 |
this.cfg.freeBonus = this.cfg.edgeBonus || 100; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
234 |
this.cfg.weightPriority = this.cfg.weightPriority || 10; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
235 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
236 |
ai.expectimax.prototype.lvl1Score = function(brd) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
237 |
var score = brd.score(); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
238 |
var max = brd.max(); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
239 |
if (brd.atCorner(max)) |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
240 |
score += this.cfg.cornerBonus; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
241 |
else if (brd.atEdge(max)) |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
242 |
score += this.cfg.edgeBonus; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
243 |
score += brd.free() * this.cfg.freeBonus; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
244 |
return score; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
245 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
246 |
ai.expectimax.prototype.lvlnScore = function(brd) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
247 |
var score = brd.score(); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
248 |
// var max = brd.max(); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
249 |
// if (brd.atCorner(max)) |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
250 |
// score += this.cfg.cornerBonus; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
251 |
// else if (brd.atEdge(max)) |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
252 |
// score += this.cfg.edgeBonus; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
253 |
// score += brd.free() * this.cfg.freeBonus; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
254 |
return score; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
255 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
256 |
ai.expectimax.prototype.analyse = function(brd) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
257 |
var origBrd = new this.brdEngine(brd); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
258 |
var nextBrd = new this.brdEngine(); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
259 |
var prevScore = -1, nextScore = -1; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
260 |
var maxWeight = -1; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
261 |
var bestDir; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
262 |
this.cleanup(); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
263 |
for (var i = 0; i < ai.dirs.length; i++) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
264 |
var dir = ai.dirs[i]; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
265 |
if (origBrd[dir](nextBrd)) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
266 |
nextScore = this.lvl1Score(nextBrd); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
267 |
var weight = this.weight(nextBrd, 0); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
268 |
// console.log("dir: %o, prevScore: %o, nextScore: %o, maxWeight: %o, weight: %o", dir, prevScore, nextScore, maxWeight, weight); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
269 |
if (maxWeight + this.cfg.weightPriority < weight || (maxWeight <= weight && prevScore < nextScore)) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
270 |
prevScore = nextScore; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
271 |
maxWeight = weight; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
272 |
bestDir = dir; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
273 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
274 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
275 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
276 |
this.cleanup(); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
277 |
return bestDir; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
278 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
279 |
ai.expectimax.prototype.weight = function(brd, depth) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
280 |
if (depth === this.cfg.depth) |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
281 |
return this.lvlnScore(brd); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
282 |
if (this.cache[depth]) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
283 |
var cache = this.cache[depth]; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
284 |
for (var i = cache.length-1; i >= 0; i--) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
285 |
if (brd.equals(cache[i].brd)) |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
286 |
return cache[i].weight; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
287 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
288 |
} else { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
289 |
this.cache[depth] = []; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
290 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
291 |
var weight = 0; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
292 |
var free = 0; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
293 |
for (var i = 0; i < 3; i++) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
294 |
for (var j = 0; j < 3; j++) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
295 |
if (brd.get(i, j) === 0) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
296 |
var randBoard = brd.copy(); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
297 |
randBoard.set(i, j, 1); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
298 |
var nextBrd = new this.brdEngine(); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
299 |
var n = 0, w = 0; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
300 |
for (var diri = 0; diri < ai.dirs.length; diri++) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
301 |
if (randBoard[ai.dirs[diri]](nextBrd)) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
302 |
w += this.weight(nextBrd, depth+1); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
303 |
n++; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
304 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
305 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
306 |
if (n > 0) |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
307 |
w = w / n; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
308 |
weight += this.cfg.balance * w; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
309 |
randBoard.set(i, j, 2); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
310 |
var n = 0, w = 0; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
311 |
for (var diri = 0; diri < ai.dirs.length; diri++) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
312 |
if (randBoard[ai.dirs[diri]](nextBrd)) { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
313 |
w += this.weight(nextBrd, depth+1); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
314 |
n++; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
315 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
316 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
317 |
if (n > 0) |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
318 |
w = w / n; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
319 |
weight += this.cfg.balance * w; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
320 |
free++; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
321 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
322 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
323 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
324 |
if (free > 0) |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
325 |
weight = weight / free; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
326 |
this.cache[depth].push({brd: brd, weight: weight}); |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
327 |
return weight; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
328 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
329 |
/* Mark that next board will be unrelated to previous, so any stored precompution can be cleared. */ |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
330 |
ai.expectimax.prototype.cleanup = function() { |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
331 |
this.cache = []; |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
332 |
} |
ed0292f0c7c6
Expectimax implementation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
20
diff
changeset
|
333 |