Я строю функцию PokerHand()
, которая должна взять 5-карточную руку в виде строки и засчитать их в соответствии с правилами Техасского Холдема.Я написал код так, чтобы он сначала сортировался по рангу.Таким образом, рука const handOne = ('AC 4S 5S 8C AH')
становится let sortedHandOne = ["4S", "5S", "8C", "AC", "AH"]
(что работает), а затем разбивается на массив рангов и соответствующих мастей (что не работает).Когда я запускаю функцию suitAndRank, я ожидаю rankArray = ["4", "5", "8", "A", "A"]
и suitArray = ["C", "C", "H", "S", "S"]
, но получаю пустые массивы.Я не могу понять, почему.
Вот код:
function PokerHand() {
//get ranks of hands
const handOne = ('AC 4S 5S 8C AH');
//const handTwo = ('4S 5S 8C AS AD');
let rankArray = [];
let suitArray = [];
// let rankArrayTwo = [];
// let suitArrayTwo = [];
const suits = ["C", "D", "H", "S"]
const ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]
let arrayHandOne = handOne.split(" ");
//let arrayHandTwo = handTwo.split(" ");
function sorted() {
let sortedHand = [];
for (let i = 0; i < ranks.length; i++) {
for (let j = 0; j < arrayHandOne.length; j++ ) {
if (ranks[i] === arrayHandOne[j].charAt(0)) {
sortedHand.push(arrayHandOne[j])
}
}
}
return sortedHand;
}
console.log(sorted())
let sortedHandOne = sorted(arrayHandOne);
//let sortedHandTwo = sortedHand(arrayHandTwo);
console.log(sortedHandOne)
function suitAndRank(sortedHandOne) {
console.log(sorted)
for (i = 0; i< sortedHandOne.length; i++) {
let sted = sortedHandOne;
rankArray.push(sted[i].charAt(0))
suitArray.push(sted[i].charAt(1))
}
}
console.log(rankArray, suitArray)
function countSuites(suitArray) {
let suitCount = {};
suitArray.forEach(function(x) { suitCount[x] = (suitCount[x] || 0)+1; });
return suitCount;
}
function countRanks(rankArray) {
let rankCount = {};
rankArray.forEach(function(x) { rankCount[x] = (rankCount[x] || 0)+1; });
return rankCount;
}
function isFlush() {
let cS = countSuites(suitArray);
if(Object.keys(cS).find(key => cS[key] === 5)) {
return true;
} else {
return false;
}
}
function isStraight() {
let index = ranks.indexOf(rankArray[0])
let ref = ranks.slice(index, index + 5).join("")
let section = rankArray.slice(0).join("")
if (section === "10JQKA" && section === ref) {
return "ROYALSTRAIGHT";
} else if (section === "A2345" || section === ref) {
return "STRAIGHT";
}else {
return "FALSE";
}
}
function pairs() {
let rS = countRanks(rankArray)
return Object.keys(rS).filter((key) => rS[key] === 2).length
}
function whichHand() {
let rS = countRanks(rankArray)
if (isFlush() === true && isStraight() === "ROYALSTRAIGHT") {
console.log('Royal Flush')
} else if (isFlush() === true && isStraight() === "STRAIGHT") {
console.log("Straight Flush")
} else if (Object.keys(rS).find(key => rS[key] === 4)) {
console.log("Four of a Kind")
} else if (Object.keys(rS).find(key => rS[key] === 3) && pairs() === 2) {
console.log("Full House")
} else if (isFlush === true) {
console.log("Flush")
} else if (isStraight === "STRAIGHT") {
console.log("Straight")
} else if (Object.keys(rS).find(key => rS[key] === 3)) {
console.log("Three of a Kind")
} else if (pairs() === 2) {
console.log("Two Pair")
}else if(pairs() === 1) {
console.log("Pair")
}else {
console.log('High Card', rankArray[rankArray.length-1])
}
}
return whichHand();
}
// const hands = ['Royal flush', 'Straight flush', 'Four of a kind', 'Full house',
// 'Flush', 'Straight', 'Three of a kind', 'Two pairs', 'Pair', 'High card']
// //compare ranks of hands and return results
PokerHand();