-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsimbackgammon.js
94 lines (78 loc) · 3.23 KB
/
simbackgammon.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
* MIT License
*
* Copyright (c) 2022-2023 Greg Whitehead
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
const optparse = require('optparse');
const stats = require("stats");
const mcts = require("mcts");
const game = require("backgammon");
var switches = [
['-n', '--nruns NUMBER', 'Number of runs'],
['-p', '--player NAME', 'Player']
];
var availablePlayers = {
"random": function() { return new mcts.RandomPlayer(); },
"mcts10": function() { return new mcts.MCTSPlayer({ nTrials: 10, nTrialsPerSeed: 1 }); },
"mcts100": function() { return new mcts.MCTSPlayer({ nTrials: 100, nTrialsPerSeed: 10 }); },
"mcts1000": function() { return new mcts.MCTSPlayer({ nTrials: 1000, nTrialsPerSeed: 100 }); },
"mcts10000": function() { return new mcts.MCTSPlayer({ nTrials: 10000, nTrialsPerSeed: 100 }); },
"mcts100000": function() { return new mcts.MCTSPlayer({ nTrials: 100000, nTrialsPerSeed: 100 }); }
};
var parser = new optparse.OptionParser(switches);
parser.banner = 'Usage: ./run.sh simbackgammon.js [options]';
var nruns = 1;
parser.on('nruns', function(opt, value) {
nruns = value;
});
var players = [];
parser.on('player', function(opt, value) {
players.push(value);
});
parser.parse(process.argv)
if (players.length == 0) {
console.log(parser.toString()+
Object.keys(availablePlayers).reduce((previousValue, currentValue) => previousValue+"\n "+currentValue, "\n\nAvailable players:"));
return;
}
var wins = [0, 0, 0];
for (var n = 1; n <= nruns; n++) {
console.log("\nrun "+n);
var g = new game.Game();
if (g.nPlayers != players.length) {
console.log("ERROR: need "+g.nPlayers+" players, "+players.length+" specified");
return;
}
var ps = players.map(function(name) {
if (availablePlayers.hasOwnProperty(name))
return availablePlayers[name]();
console.log("ERROR: unknown player: "+name);
return null;
});
if (ps.includes(null)) {
return;
}
ps[0].searchCallback = mcts.searchCallback;
ps[1].searchCallback = mcts.searchCallback;
mcts.playgame(g, ps);
wins[g.winner]++;
console.log("\ndraw,"+players+"\n"+wins+"\n"+wins.map(function(v){return (1.0*v/n).toFixed(2)}));
}