Created
January 12, 2023 23:30
-
-
Save saulr7/f06ffd9715f8074b68d4505038d6f712 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* eslint-disable no-console */ | |
| const seedrandom = require('seedrandom'); | |
| const { generateDeck } = require('./utils/hilo-utils'); | |
| const { Hilo } = require('../constants'); | |
| const { DECK } = Hilo; | |
| const { Suits, Values } = DECK; | |
| const KING = 'K'; | |
| const ACE = 'A'; | |
| const getRamdonCard = () => { | |
| const rng = seedrandom(); | |
| const randomSuit = Math.floor(rng() * Suits.length); | |
| const randomValue = Math.floor(rng() * Values.length); | |
| const suit = Suits[randomSuit]; | |
| const value = Values[randomValue]; | |
| return { value, suit }; | |
| }; | |
| const isSameCard = (c1 = {}, c2 = {}) => c1.suit === c2.suit && c1.value === c2.value; | |
| const reduceCards = (deck = [], baseDeck = []) => { | |
| return baseDeck.reduce((t = [], card) => { | |
| const alreadyPlayed = deck.find((c) => isSameCard(c, card)); | |
| if (alreadyPlayed) { | |
| return t; | |
| } | |
| return [...t, card]; | |
| }, []); | |
| }; | |
| const getBaseDeck = () => { | |
| const deck = []; | |
| Suits.forEach((suit) => Values.forEach((value) => deck.push({ suit, value }))); | |
| return deck; | |
| }; | |
| const getOdds = (card = [], leftCards = []) => { | |
| const value = card.value; | |
| const cardIndex = Values.findIndex((c) => c === value); | |
| const cardsGreaterOrEqual = []; | |
| const cardsLowerOrEqual = []; | |
| leftCards.forEach((leftCard) => { | |
| const index = Values.findIndex((value) => value === leftCard.value); | |
| if (index === cardIndex && value === ACE) { | |
| cardsLowerOrEqual.push(leftCard); | |
| } else if (index === cardIndex && value === KING) { | |
| cardsGreaterOrEqual.push(leftCard); | |
| } else if (index === cardIndex) { | |
| cardsGreaterOrEqual.push(leftCard); | |
| } else if (index > cardIndex) { | |
| cardsGreaterOrEqual.push(leftCard); | |
| } else if (index < cardIndex) { | |
| cardsLowerOrEqual.push(leftCard); | |
| } | |
| }); | |
| const leftCardLength = leftCards.length; | |
| const greaterOrEqual = parseFloat((cardsGreaterOrEqual.length / leftCardLength) * 100 || 0).toFixed(2); | |
| const lowerOrEqual = parseFloat((cardsLowerOrEqual.length / leftCardLength) * 100 || 0).toFixed(2); | |
| return { greaterOrEqual, lowerOrEqual }; | |
| }; | |
| const runGame = () => { | |
| const clicks = []; | |
| const cardsAndOdds = []; | |
| const startCard = getRamdonCard(); | |
| const baseDeck = getBaseDeck(); | |
| for (let i = 0; i < 52; i++) { | |
| const deck = generateDeck('abhash1', startCard, clicks); | |
| const currentCard = deck[deck.length - 1]; | |
| const leftCards = reduceCards(deck, baseDeck); | |
| const odds = getOdds(currentCard, leftCards); | |
| cardsAndOdds.push({ i: i + 1, card: currentCard.value, ...odds }); | |
| clicks.push(i); | |
| } | |
| return cardsAndOdds; | |
| }; | |
| console.log(runGame()); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment