Skip to content

Instantly share code, notes, and snippets.

@sl4m
Created March 15, 2010 05:32
Show Gist options
  • Save sl4m/332557 to your computer and use it in GitHub Desktop.
Save sl4m/332557 to your computer and use it in GitHub Desktop.
/**
move positions
0 | 1 | 2
---+---+---
3 | 4 | 5
---+---+---
6 | 7 | 8
*/
exports.game = function() {
var sys = require('sys');
var WinningPatterns =
[[(/ OO....../),0],[(/O..O.. ../),6],
[(/......OO /),8],[(/.. ..O..O/),2],
[(/ ..O..O../),0],[(/...... OO/),6],
[(/..O..O.. /),8],[(/OO ....../),2],
[(/ ...O...O/),0],[(/..O.O. ../),6],
[(/O...O... /),8],[(/.. .O.O../),2],
[(/O O....../),1],[(/O.. ..O../),3],
[(/......O O/),7],[(/..O.. ..O/),5],
[(/. ..O..O./),1],[(/... OO.../),3],
[(/.O..O.. ./),7],[(/...OO .../),5]];
var BlockingPatterns =
[[(/ X . X /),1],[(/ XX....../),0],[(/X..X.. ../),6],
[(/......XX /),8],[(/.. ..X..X/),2],[(/ ..X..X../),0],
[(/...... XX/),6],[(/..X..X.. /),8],[(/XX ....../),2],
[(/ ...X...X/),0],[(/..X.X. ../),6],[(/X...X... /),8],
[(/.. .X.X../),2],[(/X X....../),1],[(/X.. ..X../),3],
[(/......X X/),7],[(/..X.. ..X/),5],[(/. ..X..X./),1],
[(/... XX.../),3],[(/.X..X.. ./),7],[(/...XX .../),5],
[(/ X X.. ../),0],[(/ ..X.. X /),6],[(/.. ..X X /),8],
[(/ X ..X.. /),2],[(/ XX.. ../),0],[(/X.. .. X /),6],
[(/.. .XX /),8],[(/X ..X.. /),2],[(/ X ..X../),0],
[(/ ..X.. X/),6],[(/..X.. X /),8],[(/X ..X.. /),2]];
var WonPatterns =
[[(/OOO....../),'O'], [(/...OOO.../),'O'],
[(/......OOO/),'O'], [(/O..O..O../),'O'],
[(/.O..O..O./),'O'], [(/..O..O..O/),'O'],
[(/O...O...O/),'O'], [(/..O.O.O../),'O'],
[(/XXX....../),'X'], [(/...XXX.../),'X'],
[(/......XXX/),'X'], [(/X..X..X../),'X'],
[(/.X..X..X./),'X'], [(/..X..X..X/),'X'],
[(/X...X...X/),'X'], [(/..X.X.X../),'X']];
var board = [];
for (var i=0; i<9; i+=1) {
board.push(' ');
}
var X = 'X',
O = 'O';
var players = [X, O],
turn = X;
var moveCPU = function() {
var movePos;
movePos = getWinningPatternMove();
if (movePos === -1) {
movePos = getBlockingPatternMove();
if (movePos === -1) {
movePos = getFirstAvailableMove();
}
}
move(movePos, O);
};
var move = function(pos, piece) {
if (piece !== turn) { return false; }
pos = Number(pos);
if (pos >= 0 && pos <= 8 &&
!isNaN(pos) && board[pos] === ' ') {
board.splice(pos, 1, piece);
turn = (piece === X) ? O : X;
return true;
}
return false;
};
var getDisplay = function() {
var display =
'\n\n' +
' ' + board[0] + ' |' +
' ' + board[1] + ' |' +
' ' + board[2] +
'\n---+---+---\n' +
' ' + board[3] + ' |' +
' ' + board[4] + ' |' +
' ' + board[5] +
'\n---+---+---\n' +
' ' + board[6] + ' |' +
' ' + board[7] + ' |' +
' ' + board[8] +
'\n\n';
return display;
};
var display = function() {
sys.print(getDisplay());
};
var isBoardFilled = function() {
var movePos = getFirstAvailableMove();
if (movePos === -1) {
display();
sys.print('Game is a draw.\n');
process.stdio.close();
return true;
}
return false;
};
var isGameWinner = function() {
var flatBoard = board.join(''),
i, max = WonPatterns.length, array;
var gameWinner;
for (i=0; i<max; i+=1) {
array = flatBoard.match(WonPatterns[i][0]);
if (array) { gameWinner = WonPatterns[i][1]; }
}
if (gameWinner) {
display();
sys.print(gameWinner + ' is the winner!\n');
process.stdio.close();
return true;
}
return false;
};
var getWinningPatternMove = function() {
var flatBoard = board.join(''),
i, max = WinningPatterns.length, array;
for (i=0; i<max; i+=1) {
array = flatBoard.match(WinningPatterns[i][0]);
if (array) { return WinningPatterns[i][1]; }
}
return -1;
};
var getBlockingPatternMove = function() {
var flatBoard = board.join(''),
i, max = BlockingPatterns.length, array;
for (i=0; i<max; i+=1) {
array = flatBoard.match(BlockingPatterns[i][0]);
if (array) { return BlockingPatterns[i][1]; }
}
return -1;
};
var getFirstAvailableMove = function() {
if (board[4] === ' ') {
return 4;
}
return board.indexOf(' ');
};
return {
play: function() {
display();
sys.print("Enter your move [0-8]: ");
process.stdio.addListener('data', function(response) {
if (move(response, X)) {
if (!isGameWinner() && !isBoardFilled()) {
moveCPU();
if (!isGameWinner()) {
display();
sys.print("Enter your move [0-8]: ");
}
}
} else {
sys.print("\nI'm sorry Dave, I'm afraid I can't do that.\n");
sys.print("Enter your move [0-8]: ");
}
});
process.stdio.open();
},
getBoardDisplay : function() {
return getDisplay();
},
getTurn: function() {
return turn;
},
getBoard: function() {
return board.slice(0);
},
getCpuGamePiece: function() {
return O;
},
getHumanGamePiece: function() {
return X;
},
movePlayer: function(pos) {
return move(pos, X);
}
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment