var rs =require('readline-sync')let tokens =5;let highestTokenValueReached =5;while(tokens >0){// continue while user has at least 1 token
tokens--;// deduct one token per hand played// starting variableslet ranks =[1,2,3,4,5,6,7,8,9,10,11,12,13];// 1 = "Ace", 11 = "Jack", 12 = "Queen", 13 = "King"let suits =[0,1,2,3];// 0: "Clubs", 1: "Diamonds", 2: "Hearts", 3: "Spades"let deck =[];let dealtCards =[];let discardedCards;// function to print rank strings for userfunctionreturnRankString(num){if(num ===1){return"A";}elseif(num >1&& num <11){return num;}elseif(num ===11){return"J";}elseif(num ===12){return"Q";}elseif(num ===13){return"K";}else{return"error in returnRankString";}}// function to print suit strings for userfunctionreturnSuitString(num){if(num ===0){return"Clubs";}elseif(num ===1){return"Diamonds";}elseif(num ===2){return"Hearts";}elseif(num ===3){return"Spades";}else{return"error in returnSuitString";}}// build deckfor(let i =0; i < suits.length; i++){for(let j =0; j < ranks.length; j++){
deck.push([ranks[j], suits[i]]);}}// shuffle deck via Fisher-Yates (https://www.freecodecamp.org/news/how-to-shuffle-an-array-of-items-using-javascript-or-typescript/)functionshuffle(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]];// array destructuring assignment syntax to swap cards}return deck;}let shuffledDeck =shuffle(deck);// deal cardsfunctiondealCards(shuffledDeck, num){for(let i =1; i <= num; i++){
dealtCards.push(shuffledDeck.shift());}}dealCards(shuffledDeck,5);// print console lines (so prompt doesn't cover initial output);
console.log("");
console.log("//");
console.log(" Dealing cards...");
console.log("//");
console.log("");// print starting hand
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("");// prompt user to discard 0-5 cards (include instruction on how to quit)// discardedCards = prompt("Enter card number(s) to discard 0-5 cards. ('Cancel'/'esc' to quit)");
discardedCards = rs.question("Enter card number(s) to discard 0-5 cards.('esc' to quit)\n")// if user quits program, print to console and quit gameif(discardedCards ==='esc'){
console.log("You entered 'Cancel' or 'esc'. Ending game.");break;}// remove potential duplicates
discardedCards = Array.from(newSet(discardedCards.split(''))).toString().replaceAll(",","");// log action for user
console.log("Discarded:");// if no cards discardedif(discardedCards.match(/^$/)){// regex: empty string (discarded no cards)
console.log("None");// if user input does NOT match accepted range}elseif(!(discardedCards.match(/^[1-5]{1,5}$/))){// regex: 1-5 cards (w/card number of 1-5)
discardedCards ="";// assign discardedCards to empty string
console.log("User input invalid. No cards discarded.");// and notify user}// replace discarded cardsfor(let i =0; i < discardedCards.length; i++){let indexOfDiscardedCards = discardedCards[i]-1;// this is index of card in dealtCards// log discardedCards for user
console.log(" "+ discardedCards[i]+": "+returnRankString(dealtCards[indexOfDiscardedCards][0])+" of "+returnSuitString(dealtCards[indexOfDiscardedCards][1]));// discard discardedCards and replace with cards from shuffledDeck
dealtCards.splice(indexOfDiscardedCards,1, shuffledDeck.shift());// start, del count, item}
console.log("");// print final hand
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("");// if final hand has a "K" (13)for(let i =0; i < dealtCards.length; i++){if(dealtCards[i][0]===13){// change value of all "A" cards from 1 to 14for(let i =0; i < dealtCards.length; i++){if(dealtCards[i][0]===1){
dealtCards[i][0]=14;}}break;}}// sort final hand
dealtCards.sort((function(index){returnfunction(a, b){return(a[index]=== b[index]?0:(a[index]< b[index]?-1:1));};})(0));// index 0// NOTE: functions used to evaluate final handfunctionisFlush(dealtCards){let suit = dealtCards[0][1];for(let i =1; i < dealtCards.length; i++){if(dealtCards[i][1]!== suit){returnfalse;}}returntrue;}functionisStraight(dealtCards){let rank = dealtCards[0][0];for(let i =1; i < dealtCards.length; i++){if(rank +1=== dealtCards[i][0]){
rank +=1;}else{returnfalse;}}returntrue;}functionisFourOfAKind(dealtCards){let firstNumCount =0;let lastNumCount =0;for(let i =0; i < dealtCards.length; i++){if(dealtCards[i][0]=== dealtCards[0][0]){// compare to first card
firstNumCount++;}elseif(dealtCards[i][0]=== dealtCards[4][0]){// compare to last card
lastNumCount++;}}if(firstNumCount ===4|| lastNumCount ===4){returntrue;}}functionisFullHouse(dealtCards){let firstNumCount =0;let lastNumCount =0;for(let i =0; i < dealtCards.length; i++){if(dealtCards[i][0]=== dealtCards[0][0]){// compare to first card
firstNumCount++;}elseif(dealtCards[i][0]=== dealtCards[4][0]){// compare to last card
lastNumCount++;}}if(firstNumCount ===3&& lastNumCount ===2|| firstNumCount ===2&& lastNumCount ===3){returntrue;}}functionthreeOfAKind(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){returntrue;}}}
numCount =1;}}functiontwoPairs(dealtCards){if(dealtCards[0][0]=== dealtCards[1][0]){if(dealtCards[2][0]=== dealtCards[3][0]|| dealtCards[3][0]=== dealtCards[4][0]){returntrue;}}elseif(dealtCards[1][0]=== dealtCards[2][0]&& dealtCards[3][0]=== dealtCards[4][0]){returntrue;}}functiononePair(dealtCards){for(let i =0; i < dealtCards.length -1; i++){if(dealtCards[i][0]=== dealtCards[i +1][0]){returntrue;}}}// NOTE: function callsif( dealtCards[0][0]===10&&isFlush(dealtCards)&&isStraight(dealtCards)){// Royal flush?
console.log("~~ Royal flush! (+250 tokens)");
tokens +=250;}elseif(isFlush(dealtCards)&&isStraight(dealtCards)){// Straight flush
console.log("~~ Straight flush! (+50 tokens)");
tokens +=50;}elseif(isFourOfAKind(dealtCards)){// Four of a kind?
console.log("~~ Four of a kind! (+25 tokens)");
tokens +=25;}elseif(isFullHouse(dealtCards)){// Full house?
console.log("~~ Full house! (+6 tokens)");
tokens +=6;}elseif(isFlush(dealtCards)){// Flush?
console.log("~~ Flush! (+5 tokens)");
tokens +=5;}elseif(isStraight(dealtCards)){// Straight?
console.log("~~ Straight! (+4 tokens)");
tokens +=4;}elseif(threeOfAKind(dealtCards)){// Three of a kind?
console.log("~~ Three of a kind! (+3 tokens)");
tokens +=3;}elseif(twoPairs(dealtCards)){// Two pairs?
console.log("~~ Two pairs! (+2 tokens)");
tokens +=2;}elseif(onePair(dealtCards)){// One pair?
console.log("~~ One pair! (+1 token)");
tokens +=1;}else{// High card
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);