UNPKG

casino-server

Version:

An multi-rule scalable online poker game server powered by redis, node.js and socket.io

218 lines (185 loc) 4.27 kB
var POKER_COLORS = { 4: '♠', // spade 3: '♥', // heart 2: '♣', // club 1: '♦' // diamond }; var POKER_NUMBERS = { 14 : 'A', 13 : 'K', 12 : 'Q', 11 : 'J', 10 : '10', 9 : '9', 8 : '8', 7 : '7', 6 : '6', 5 : '5', 4 : '4', 3 : '3', 2 : '2', 0 : '?' }; var POKER_NUMBER_RANK = { 'A': 14, 'K': 13, 'Q': 12, 'J': 11, '10': 10, '9': 9, '8': 8, '7': 7, '6': 6, '5': 5, '4': 4, '3': 3, '2': 2, '?': 0, '': 0 }; var POKER_COLOR_RANK = { 'S': 4, 'H': 3, 'C': 2, 'D': 1, '': 0 }; var RED_JOKER = (6 << 4) | 15; var BLACK_JOKER = (5 << 4) | 15; var POKER_CARDS = {}; for(var color=1; color<=4; color++) { for(var number=2; number<=14; number++) { var card = (color << 4) | number; POKER_CARDS[ card ] = POKER_NUMBERS[ number ] + '' + POKER_COLORS[ color ]; } } POKER_CARDS[ RED_JOKER ] = '@'; POKER_CARDS[ BLACK_JOKER ] = '*'; POKER_CARDS[ 0 ] = '?'; exports = module.exports = Poker; function Poker(str){ if(typeof str === 'string') { var c = POKER_COLOR_RANK[ str.charAt(0) ]; var n = POKER_NUMBER_RANK[ str.substring(1) ]; if(c && n) { return (c << 4) | n; } else { return 0; } } else if(typeof str === 'object') { var cards = []; for(var i=0; i<str.length; i++) { cards.push( Poker(str[i]) ); } return cards; } else { return 0; } } Poker.RED_JOKER = RED_JOKER; Poker.BLACK_JOKER = BLACK_JOKER; Poker.SPADE = 4; Poker.HEART = 3; Poker.CLUB = 2; Poker.DIAMOND = 1; Poker.COLORS = POKER_COLORS; Poker.NUMBERS = POKER_NUMBERS; Poker.CARDS = POKER_CARDS; Poker.NUMBER_RANK = POKER_NUMBER_RANK; Poker.visualize = function( cards ) { if(typeof cards === 'number') return POKER_CARDS[ cards ]; var v_cards = []; for(var i=0, len=cards.length; i<len; i++) { v_cards.push( POKER_CARDS[ cards[i] ] ); } return v_cards; }; Poker.newSet = function( options ) { var no_joker = true, no_color = [], no_number = [], no_card = []; if(options) { if(typeof options.no_joker === 'boolean') no_joker = options.no_joker; if(typeof options.no_color === 'object') no_color = options.no_color; if(typeof options.no_number === 'object') no_number = options.no_number; if(typeof options.no_card === 'object') no_card = options.no_card; } var cards = []; for(var color=1; color<=4; color++) { if(no_color.indexOf(color) >= 0) continue; for(var number=2; number<=14; number++) { if(no_number.indexOf(number) >= 0) continue; var card = (color << 4) | number; if(no_card.indexOf(card) >= 0) continue; cards.push( card ); } } if(! no_joker) { cards.push( RED_JOKER ); cards.push( BLACK_JOKER ); } return cards; }; Poker.clone = function(cards) { var cloned = []; for(var i=0; i<cards.length; i++) { cloned[i] = cards[i]; } return cloned; }; Poker.draw = function(cards, n) { var len = cards.length; if(len < n) return []; var subset = []; while(n -- > 0) { var i = Math.floor( Math.random() * len ); subset.push( cards[i] ); cards.splice(i,1); // NOTICE: splice will return an array len --; } return subset; }; Poker.randomize = function( cards ) { var randomized = this.draw(cards, cards.length); while(randomized.length > 0) { cards.push( randomized.shift() ); } return cards; }; Poker.compareColorNumber = function(a, b) { if(a == b) return 0; else { var aColor = a >> 4, aNumber = a & 0x0f; var bColor = b >> 4, bNumber = b & 0x0f; if(aColor == bColor) return aNumber - bNumber; else return aColor - bColor; } }; Poker.compareNumberColor = function(a, b) { if(a == b) return 0; else { var aColor = a >> 4, aNumber = a & 0x0f; var bColor = b >> 4, bNumber = b & 0x0f; if(aNumber == bNumber) return aColor - bColor; else return aNumber - bNumber; } }; Poker.compare = function(a, b) { return (a & 0xff) - (b & 0xff); }; Poker.sort = Poker.sortByColor = function( cards ) { return cards.sort( Poker.compareColorNumber ).reverse(); }; Poker.sortByNumber = function( cards ) { return cards.sort( Poker.compareNumberColor ).reverse(); }; Poker.merge = function( a, b ) { return a.concat(b); }; Poker.print = function( cards ) { var str = cards.join(','); console.log( str ); }; Poker.view = function( cards ) { var str = Poker.visualize(cards).join(','); console.log( str ); };