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
JavaScript
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 );
};