-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.js
More file actions
72 lines (67 loc) · 2.94 KB
/
main.js
File metadata and controls
72 lines (67 loc) · 2.94 KB
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
document.addEventListener("DOMContentLoaded", function(event) {
const options = ['rock', 'paper', 'scissors'];
const net = new brain.recurrent.LSTM();
const buffer = ['scissors', 'rock', 'paper', 'scissors'];
let data = [buffer.slice()];
const domMyMove = document.getElementById('you');
const domCpuMove = document.getElementById('rnn');
const domOpts = document.getElementById('options');
const domResult = document.getElementById('result');
const myMoveOrig = domMyMove.innerHTML;
let cpuNextMove = calcNextMove();
const cpuWinLoss = [0.3, 0.3, 0.3];
options.forEach(optId => {
document.getElementById(optId).addEventListener('click', evt => {
const myMoveIdx = options.indexOf(optId);
const scoreValues = {
[options[myMoveIdx]]: 0.3, // tie
[options[(myMoveIdx + 1) % 3]]: 1, // cpu wins
[options[(myMoveIdx + 2) % 3]]: 0 // cpu loses
};
cpuWinLoss.push(scoreValues[cpuNextMove]);
if (scoreValues[cpuNextMove] === 0) {
domResult.innerHTML = 'YOU WON!';
domResult.className = 'win';
} else if (scoreValues[cpuNextMove] === 1) {
domResult.innerHTML = 'YOU LOSE!';
domResult.className = 'lose';
} else {
domResult.innerHTML = 'TIED!';
domResult.className = 'tie';
}
buffer.push(optId);
data.push(buffer.slice(-4));
data = data.slice(-13);
domMyMove.innerHTML = optId;
domCpuMove.innerHTML = cpuNextMove;
let oldmove = cpuNextMove
// domOpts.className += ' disabled';
setTimeout(() => {
cpuNextMove = calcNextMove();
setTimeout(() => {
domMyMove.innerHTML = optId;
domCpuMove.innerHTML = oldmove;
domOpts.className = '';
domResult.className = '';
const cpuScore = cpuWinLoss.reduce((t, s) => t + Math.floor(s), 0);
const myScore = cpuWinLoss.reduce((t, s) => t + Math.floor(Math.abs(s - 1)), 0);
const youScoreCount = document.getElementById('you-score');
const rnnScoreCount = document.getElementById('rnn-score');
youScoreCount.innerHTML = `
${myScore}
`;
rnnScoreCount.innerHTML = `
${cpuScore}
`;
}, 0);
}, 0);
});
});
function calcNextMove() {
net.train(data, {iterations: 200, errorThresh: 0.025});
const nextMove = net.run(buffer.slice(-3));
const nextMoveIdx = options.indexOf(nextMove);
const cpuMoveIdx = (nextMoveIdx + 1) % 3;
return options[cpuMoveIdx];
}
});