pnpm install readline-sync
var rs = require('readline-sync')
let tokens = 5;
let highestTokenValueReached = 5;
while (tokens > 0) {
tokens--;
let ranks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
let suits = [0, 1, 2, 3];
let deck = [];
let dealtCards = [];
let discardedCards;
function returnRankString(num) {
if (num === 1) {
return "A";
} else if (num > 1 && num < 11) {
return num;
} else if (num === 11) {
return "J";
} else if (num === 12) {
return "Q";
} else if (num === 13) {
return "K";
} else {
return "error in returnRankString";
}
}
function returnSuitString(num) {
if (num === 0) {
return "Clubs";
} else if (num === 1) {
return "Diamonds";
} else if (num === 2) {
return "Hearts";
} else if (num === 3) {
return "Spades";
} else {
return "error in returnSuitString";
}
}
for (let i = 0; i < suits.length; i++) {
for (let j = 0; j < ranks.length; j++) {
deck.push([ranks[j], suits[i]]);
}
}
function shuffle(deck) {
for (let i = deck.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
[deck[i], deck[j]] = [deck[j], deck[i]];
}
return deck;
}
let shuffledDeck = shuffle(deck);
function dealCards(shuffledDeck, num) {
for (let i = 1; i <= num; i++) {
dealtCards.push(shuffledDeck.shift());
}
}
dealCards(shuffledDeck, 5);
console.log("");
console.log("//////////////////");
console.log(" Dealing cards...");
console.log("//////////////////");
console.log("");
console.log("*** Starting hand ***");
for (let i = 0; i < dealtCards.length; i++) {
console.log((i + 1) + ": " + returnRankString(dealtCards[i][0]) + " of " + returnSuitString(dealtCards[i][1]));
}
console.log("");
discardedCards = rs.question("Enter card number(s) to discard 0-5 cards.('esc' to quit)\n")
if (discardedCards === 'esc') {
console.log("You entered 'Cancel' or 'esc'. Ending game.");
break;
}
discardedCards = Array.from(new Set(discardedCards.split(''))).toString().replaceAll(",","");
console.log("Discarded:");
if (discardedCards.match(/^$/)) {
console.log("None");
} else if (!(discardedCards.match(/^[1-5]{1,5}$/))) {
discardedCards = "";
console.log("User input invalid. No cards discarded.");
}
for (let i = 0; i < discardedCards.length; i++) {
let indexOfDiscardedCards = discardedCards[i] - 1;
console.log(" " + discardedCards[i] + ": " + returnRankString(dealtCards[indexOfDiscardedCards][0]) + " of " + returnSuitString(dealtCards[indexOfDiscardedCards][1]));
dealtCards.splice(indexOfDiscardedCards, 1, shuffledDeck.shift());
}
console.log("");
console.log("*** Final hand ***");
for (let i = 0; i < dealtCards.length; i++) {
console.log((i + 1) + ": " + returnRankString(dealtCards[i][0]) + " of " + returnSuitString(dealtCards[i][1]));
}
console.log("");
for (let i = 0; i < dealtCards.length; i++) {
if (dealtCards[i][0] === 13) {
for (let i = 0; i < dealtCards.length; i++) {
if (dealtCards[i][0] === 1) {
dealtCards[i][0] = 14;
}
}
break;
}
}
dealtCards.sort((function(index){
return function(a, b){
return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 : 1));
};
})(0));
function isFlush(dealtCards) {
let suit = dealtCards[0][1];
for (let i = 1; i < dealtCards.length; i++) {
if (dealtCards[i][1] !== suit) {
return false;
}
}
return true;
}
function isStraight(dealtCards) {
let rank = dealtCards[0][0];
for (let i = 1; i < dealtCards.length; i++) {
if (rank + 1 === dealtCards[i][0]) {
rank += 1;
} else {
return false;
}
}
return true;
}
function isFourOfAKind(dealtCards) {
let firstNumCount = 0;
let lastNumCount = 0;
for (let i = 0; i < dealtCards.length; i++) {
if (dealtCards[i][0] === dealtCards[0][0]) {
firstNumCount++;
} else if (dealtCards[i][0] === dealtCards[4][0]) {
lastNumCount++;
}
}
if (firstNumCount === 4 || lastNumCount === 4) {
return true;
}
}
function isFullHouse(dealtCards) {
let firstNumCount = 0;
let lastNumCount = 0;
for (let i = 0; i < dealtCards.length; i++) {
if (dealtCards[i][0] === dealtCards[0][0]) {
firstNumCount++;
} else if (dealtCards[i][0] === dealtCards[4][0]) {
lastNumCount++;
}
}
if (firstNumCount === 3 && lastNumCount === 2 || firstNumCount === 2 && lastNumCount === 3) {
return true;
}
}
function threeOfAKind(dealtCards) {
let numCount = 1;
for (let i = 0; i < dealtCards.length - 2; i++) {
for (let j = i + 1; j < dealtCards.length; j++) {
if ( dealtCards[i][0] === dealtCards[j][0] ) {
numCount++;
if (numCount > 2) {
return true;
}
}
}
numCount = 1;
}
}
function twoPairs(dealtCards) {
if (dealtCards[0][0] === dealtCards[1][0]) {
if (dealtCards[2][0] === dealtCards[3][0] || dealtCards[3][0] === dealtCards[4][0]) {
return true;
}
} else if (dealtCards[1][0] === dealtCards[2][0] && dealtCards[3][0] === dealtCards[4][0]) {
return true;
}
}
function onePair(dealtCards) {
for (let i = 0; i < dealtCards.length - 1; i++) {
if (dealtCards[i][0] === dealtCards[i + 1][0]) {
return true;
}
}
}
if ( dealtCards[0][0] === 10 && isFlush(dealtCards) && isStraight(dealtCards) ) {
console.log("~~ Royal flush! (+250 tokens)");
tokens += 250;
} else if ( isFlush(dealtCards) && isStraight(dealtCards) ) {
console.log("~~ Straight flush! (+50 tokens)");
tokens += 50;
} else if (isFourOfAKind(dealtCards)) {
console.log("~~ Four of a kind! (+25 tokens)");
tokens += 25;
} else if (isFullHouse(dealtCards)) {
console.log("~~ Full house! (+6 tokens)");
tokens += 6;
} else if (isFlush(dealtCards)) {
console.log("~~ Flush! (+5 tokens)");
tokens += 5;
} else if (isStraight(dealtCards)) {
console.log("~~ Straight! (+4 tokens)");
tokens += 4;
} else if (threeOfAKind(dealtCards)) {
console.log("~~ Three of a kind! (+3 tokens)");
tokens += 3;
} else if (twoPairs(dealtCards)) {
console.log("~~ Two pairs! (+2 tokens)");
tokens += 2;
} else if (onePair(dealtCards)) {
console.log("~~ One pair! (+1 token)");
tokens += 1;
} else {
console.log("~~ High card! (+0 token)");
}
console.log("~~ Remaining tokens: " + tokens);
console.log("");
if (tokens > highestTokenValueReached) {
highestTokenValueReached = tokens;
}
}
console.log("");
console.log("*** GAME OVER ***");
console.log("");
console.log("highestTokenValueReached: " + highestTokenValueReached);