<html>
<head>
<meta charset=utf-8 />
<title>JS Bin</title>
<script type="text/javascript">
function Game() {
var game = this;
this.board = document.getElementById('board');
this.squares = this.board.getElementsByTagName('input');
this.gameover = false;
this.board.onclick = function(e) {
if( game.gameover) return;
e = e || window.event;
var t = e.srcElement || e.target;
if( t.tagName === "INPUT") {
if( t.value) return; // square already played
t.value = "O";
game.checkForWin("X");
}
};
this.checkForWin = function(next) {
var i, line;
for(i=0; i<game.winningLinesCount; i++) {
line = game.winningLines[i];
if( game.squares[line[0]].value == game.squares[line[1]].value
&& game.squares[line[0]].value == game.squares[line[2]].value
&& game.squares[line[0]].value != "") {
game.squares[line[0]].style.backgroundColor =
game.squares[line[1]].style.backgroundColor =
game.squares[line[2]].style.backgroundColor = "#80ff80";
game.gameover = true;
break;
}
}
if( !game.gameover && next == "X") {
game.computerPlay();
}
};
this.winningLines = [
[0,1,2],[3,4,5],[6,7,8], //rows
[0,3,6],[1,4,7],[2,5,8], //cols
[0,4,8],[2,4,6] //diagonals
];
this.winningLinesCount = this.winningLines.length;
this.computerPlay = function() {
var play = function(x) {
game.squares[x].value = "X";
game.checkForWin("O");
};
// look for danger
var i, line, danger = [], dangermod = {"X":-1,"O":1,"":0};
for(i=0; i<game.winningLinesCount; i++) {
line = game.winningLines[i];
danger[Math.abs(dangermod[game.squares[line[0]].value]
+ dangermod[game.squares[line[1]].value]
+ dangermod[game.squares[line[2]].value])] = line;
}
if( danger[2]) {
// 2 of same symbol - either a win for computer or a need to block
line = danger[2];
if( game.squares[line[0]].value == "") play(line[0]);
else if( game.squares[line[1]].value == "") play(line[1]);
else if( game.squares[line[2]].value == "") play(line[2]);
}
else {
// no danger, pick a random square - this is where the AI would go to adjust difficulty
var available = [];
for(i=0; i<9; i++) if(game.squares[i].value == "") available.push(i);
play(available[Math.floor(Math.random()*available.length)]);
}
};
}
</script>
</head>
<body>
<table border=1 id="board">
<tr>
<td><input size=1 readonly /></td>
<td><input size=1 readonly /></td>
<td><input size=1 readonly /></td>
</tr>
<tr>
<td><input size=1 readonly /></td>
<td><input size=1 readonly /></td>
<td><input size=1 readonly /></td>
</tr>
<tr>
<td><input size=1 readonly /></td>
<td><input size=1 readonly /></td>
<td><input size=1 readonly /></td>
</tr>
</table>
<script type="text/javascript">new Game();</script>
</body>
</html>
Output
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |