poker-evaluatehand
Version:
A library to evaluate 3, 5, 6 or 7 card poker hands (Updated from poker-evaluator)
123 lines (110 loc) • 2.29 kB
JavaScript
var fs = require("fs");
var path = require("path");
var ThreeCardConverter = require("./3CardConverter");
module.exports = {
HANDTYPES: [
"invalid hand",
"high card",
"one pair",
"two pairs",
"three of a kind",
"straight",
"flush",
"full house",
"four of a kind",
"straight flush"
],
CARDS: {
"2c": 1,
"2d": 2,
"2h": 3,
"2s": 4,
"3c": 5,
"3d": 6,
"3h": 7,
"3s": 8,
"4c": 9,
"4d": 10,
"4h": 11,
"4s": 12,
"5c": 13,
"5d": 14,
"5h": 15,
"5s": 16,
"6c": 17,
"6d": 18,
"6h": 19,
"6s": 20,
"7c": 21,
"7d": 22,
"7h": 23,
"7s": 24,
"8c": 25,
"8d": 26,
"8h": 27,
"8s": 28,
"9c": 29,
"9d": 30,
"9h": 31,
"9s": 32,
"tc": 33,
"td": 34,
"th": 35,
"ts": 36,
"jc": 37,
"jd": 38,
"jh": 39,
"js": 40,
"qc": 41,
"qd": 42,
"qh": 43,
"qs": 44,
"kc": 45,
"kd": 46,
"kh": 47,
"ks": 48,
"ac": 49,
"ad": 50,
"ah": 51,
"as": 52
},
evalHand: function(cards) {
if (!this.ranks) {
throw new Error("HandRanks.dat not loaded");
}
if (cards.length != 7 && cards.length != 6 && cards.length != 5 && cards.length != 3) {
throw new Error("Hand must be 3, 5, 6, or 7 cards, but got " + cards.length);
}
//if 3 card hand, fill in to make 5 card
if (cards.length == 3) {
cards = ThreeCardConverter.fillHand(cards);
}
//if passing in string formatted hand, convert first
if (typeof cards[0] == "string") {
cards = cards.map(function(card) {
return this.CARDS[card.toLowerCase()];
}.bind(this));
}
return this.eval(cards);
},
eval: function(cards) {
var p = 53;
for (var i = 0; i < cards.length; i++) {
p = this.evalCard(p + cards[i]);
}
if (cards.length == 5 || cards.length == 6) {
p = this.evalCard(p)
}
return {
handType: p >> 12,
handRank: p & 0x00000fff,
value: p,
handName: this.HANDTYPES[p >> 12]
}
},
evalCard: function(card) {
return this.ranks.readUInt32LE(card * 4);
}
}
var ranksFile = path.join(__dirname, '../data/HandRanks.dat');
module.exports.ranks = fs.readFileSync(ranksFile);