UNPKG

deckbuilder

Version:

A deck building and management tool any card based games in the browser or Node.

82 lines (70 loc) 7.72 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.fisherYates = fisherYates; exports.strip = strip; /** * Shuffle the deck using the Fisher-Yates method. * * The Fisher-Yates method is one of the best array randomization techniques available which makes it a good method for * shuffling the deck. * * @param {Array<Card>} deck The deck to shuffle. * @param {number} [times=1] The number of times to repeat the shuffle using this method. * * @returns {Array<Card>|boolean} Returns the shuffled deck */ function fisherYates(deck) { var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; while (times > 0) { var i = deck.length; if (i === 0) return false; while (--i) { var j = Math.floor(Math.random() * (i + 1)); var cardI = deck[i]; var cardJ = deck[j]; deck[i] = cardJ; deck[j] = cardI; } times--; } return deck; } /** * Shuffle the deck using the strip method. * * The strip method involves cutting the deck at a random point and putting the cut part back in the deck at a random * position. * * @param {Array<Card>} deck The deck to shuffle. * @param {number} [times=1] The number of times to repeat the shuffle using this method. * * @returns {Array<Card>} Returns the shuffled deck */ function strip(deck) { var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var cutMax = Math.floor(deck.length * (1 / 4)); var splitNum = randomInt(3, cutMax); while (times > -1) { var deckSplit = deck.splice(0, splitNum); var insertPos = randomInt(0, deck.length); var deck1 = deck.slice(0, insertPos); var deck2 = deck.slice(insertPos); deck = deck1.concat(deckSplit, deck2); times--; } return deck; } /** * Generates a random number between two values. * * @param {number} min The minimum value that can be returned. * @param {number} max The maximum value that can be returned. * * @returns {number} Returns a value between the minimum and maximum values. */ function randomInt(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zaHVmZmxlLnRzIl0sIm5hbWVzIjpbImZpc2hlcllhdGVzIiwiZGVjayIsInRpbWVzIiwiaSIsImxlbmd0aCIsImoiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJjYXJkSSIsImNhcmRKIiwic3RyaXAiLCJjdXRNYXgiLCJzcGxpdE51bSIsInJhbmRvbUludCIsImRlY2tTcGxpdCIsInNwbGljZSIsImluc2VydFBvcyIsImRlY2sxIiwic2xpY2UiLCJkZWNrMiIsImNvbmNhdCIsIm1pbiIsIm1heCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0FBSUE7Ozs7Ozs7Ozs7O0FBV08sU0FBU0EsV0FBVCxDQUFxQkMsSUFBckIsRUFBbUY7QUFBQSxNQUEzQ0MsS0FBMkMsdUVBQTNCLENBQTJCOztBQUV4RixTQUFPQSxLQUFLLEdBQUcsQ0FBZixFQUFrQjtBQUVoQixRQUFJQyxDQUFTLEdBQUdGLElBQUksQ0FBQ0csTUFBckI7QUFFQSxRQUFJRCxDQUFDLEtBQUssQ0FBVixFQUFhLE9BQU8sS0FBUDs7QUFFYixXQUFPLEVBQUVBLENBQVQsRUFBWTtBQUVWLFVBQU1FLENBQVMsR0FBR0MsSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ0UsTUFBTCxNQUFpQkwsQ0FBQyxHQUFHLENBQXJCLENBQVgsQ0FBbEI7QUFFQSxVQUFNTSxLQUFLLEdBQUdSLElBQUksQ0FBQ0UsQ0FBRCxDQUFsQjtBQUNBLFVBQU1PLEtBQUssR0FBR1QsSUFBSSxDQUFDSSxDQUFELENBQWxCO0FBRUFKLE1BQUFBLElBQUksQ0FBQ0UsQ0FBRCxDQUFKLEdBQVVPLEtBQVY7QUFDQVQsTUFBQUEsSUFBSSxDQUFDSSxDQUFELENBQUosR0FBVUksS0FBVjtBQUVEOztBQUVEUCxJQUFBQSxLQUFLO0FBRU47O0FBRUQsU0FBT0QsSUFBUDtBQUVEO0FBRUQ7Ozs7Ozs7Ozs7Ozs7QUFXTyxTQUFTVSxLQUFULENBQWVWLElBQWYsRUFBa0U7QUFBQSxNQUFoQ0MsS0FBZ0MsdUVBQWhCLENBQWdCO0FBRXZFLE1BQU1VLE1BQU0sR0FBR04sSUFBSSxDQUFDQyxLQUFMLENBQVdOLElBQUksQ0FBQ0csTUFBTCxJQUFlLElBQUksQ0FBbkIsQ0FBWCxDQUFmO0FBRUEsTUFBTVMsUUFBUSxHQUFHQyxTQUFTLENBQUMsQ0FBRCxFQUFJRixNQUFKLENBQTFCOztBQUVBLFNBQU9WLEtBQUssR0FBRyxDQUFDLENBQWhCLEVBQW1CO0FBRWpCLFFBQU1hLFNBQVMsR0FBR2QsSUFBSSxDQUFDZSxNQUFMLENBQVksQ0FBWixFQUFlSCxRQUFmLENBQWxCO0FBQ0EsUUFBTUksU0FBUyxHQUFHSCxTQUFTLENBQUMsQ0FBRCxFQUFJYixJQUFJLENBQUNHLE1BQVQsQ0FBM0I7QUFFQSxRQUFNYyxLQUFLLEdBQUdqQixJQUFJLENBQUNrQixLQUFMLENBQVcsQ0FBWCxFQUFjRixTQUFkLENBQWQ7QUFDQSxRQUFNRyxLQUFLLEdBQUduQixJQUFJLENBQUNrQixLQUFMLENBQVdGLFNBQVgsQ0FBZDtBQUVBaEIsSUFBQUEsSUFBSSxHQUFHaUIsS0FBSyxDQUFDRyxNQUFOLENBQWFOLFNBQWIsRUFBd0JLLEtBQXhCLENBQVA7QUFFQWxCLElBQUFBLEtBQUs7QUFFTjs7QUFFRCxTQUFPRCxJQUFQO0FBRUQ7QUFFRDs7Ozs7Ozs7OztBQVFBLFNBQVNhLFNBQVQsQ0FBbUJRLEdBQW5CLEVBQWdDQyxHQUFoQyxFQUFxRDtBQUVuRCxTQUFPakIsSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ0UsTUFBTCxNQUFpQmUsR0FBRyxHQUFHRCxHQUFOLEdBQVksQ0FBN0IsSUFBa0NBLEdBQTdDLENBQVA7QUFFRCIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IENhcmQgZnJvbSAnLi4vaW50ZXJmYWNlcy9DYXJkJztcclxuXHJcbi8qKlxyXG4gKiBTaHVmZmxlIHRoZSBkZWNrIHVzaW5nIHRoZSBGaXNoZXItWWF0ZXMgbWV0aG9kLlxyXG4gKiBcclxuICogVGhlIEZpc2hlci1ZYXRlcyBtZXRob2QgaXMgb25lIG9mIHRoZSBiZXN0IGFycmF5IHJhbmRvbWl6YXRpb24gdGVjaG5pcXVlcyBhdmFpbGFibGUgd2hpY2ggbWFrZXMgaXQgYSBnb29kIG1ldGhvZCBmb3JcclxuICogc2h1ZmZsaW5nIHRoZSBkZWNrLlxyXG4gKiBcclxuICogQHBhcmFtIHtBcnJheTxDYXJkPn0gZGVjayBUaGUgZGVjayB0byBzaHVmZmxlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3RpbWVzPTFdIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzaHVmZmxlIHVzaW5nIHRoaXMgbWV0aG9kLlxyXG4gKiBcclxuICogQHJldHVybnMge0FycmF5PENhcmQ+fGJvb2xlYW59IFJldHVybnMgdGhlIHNodWZmbGVkIGRlY2tcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmaXNoZXJZYXRlcyhkZWNrOiBBcnJheTxDYXJkPiwgdGltZXM6IG51bWJlciA9IDEpOiAoQXJyYXk8YW55PiB8IGJvb2xlYW4pIHtcclxuXHJcbiAgd2hpbGUgKHRpbWVzID4gMCkge1xyXG5cclxuICAgIGxldCBpOiBudW1iZXIgPSBkZWNrLmxlbmd0aDtcclxuXHJcbiAgICBpZiAoaSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHdoaWxlICgtLWkpIHtcclxuXHJcbiAgICAgIGNvbnN0IGo6IG51bWJlciA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xyXG5cclxuICAgICAgY29uc3QgY2FyZEkgPSBkZWNrW2ldO1xyXG4gICAgICBjb25zdCBjYXJkSiA9IGRlY2tbal07XHJcblxyXG4gICAgICBkZWNrW2ldID0gY2FyZEo7XHJcbiAgICAgIGRlY2tbal0gPSBjYXJkSTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgdGltZXMtLTtcclxuXHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGVjaztcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTaHVmZmxlIHRoZSBkZWNrIHVzaW5nIHRoZSBzdHJpcCBtZXRob2QuXHJcbiAqIFxyXG4gKiBUaGUgc3RyaXAgbWV0aG9kIGludm9sdmVzIGN1dHRpbmcgdGhlIGRlY2sgYXQgYSByYW5kb20gcG9pbnQgYW5kIHB1dHRpbmcgdGhlIGN1dCBwYXJ0IGJhY2sgaW4gdGhlIGRlY2sgYXQgYSByYW5kb21cclxuICogcG9zaXRpb24uXHJcbiAqIFxyXG4gKiBAcGFyYW0ge0FycmF5PENhcmQ+fSBkZWNrIFRoZSBkZWNrIHRvIHNodWZmbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZXM9MV0gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHNodWZmbGUgdXNpbmcgdGhpcyBtZXRob2QuXHJcbiAqIFxyXG4gKiBAcmV0dXJucyB7QXJyYXk8Q2FyZD59IFJldHVybnMgdGhlIHNodWZmbGVkIGRlY2tcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzdHJpcChkZWNrOiBBcnJheTxDYXJkPiwgdGltZXM6IG51bWJlciA9IDEpOiBBcnJheTxDYXJkPiB7XHJcblxyXG4gIGNvbnN0IGN1dE1heCA9IE1hdGguZmxvb3IoZGVjay5sZW5ndGggKiAoMSAvIDQpKTtcclxuXHJcbiAgY29uc3Qgc3BsaXROdW0gPSByYW5kb21JbnQoMywgY3V0TWF4KTtcclxuXHJcbiAgd2hpbGUgKHRpbWVzID4gLTEpIHtcclxuXHJcbiAgICBjb25zdCBkZWNrU3BsaXQgPSBkZWNrLnNwbGljZSgwLCBzcGxpdE51bSk7XHJcbiAgICBjb25zdCBpbnNlcnRQb3MgPSByYW5kb21JbnQoMCwgZGVjay5sZW5ndGgpO1xyXG5cclxuICAgIGNvbnN0IGRlY2sxID0gZGVjay5zbGljZSgwLCBpbnNlcnRQb3MpO1xyXG4gICAgY29uc3QgZGVjazIgPSBkZWNrLnNsaWNlKGluc2VydFBvcyk7XHJcblxyXG4gICAgZGVjayA9IGRlY2sxLmNvbmNhdChkZWNrU3BsaXQsIGRlY2syKTtcclxuXHJcbiAgICB0aW1lcy0tO1xyXG5cclxuICB9XHJcblxyXG4gIHJldHVybiBkZWNrO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiB0d28gdmFsdWVzLlxyXG4gKiBcclxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiBUaGUgbWluaW11bSB2YWx1ZSB0aGF0IGNhbiBiZSByZXR1cm5lZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1heCBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSByZXR1cm5lZC5cclxuICogXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYSB2YWx1ZSBiZXR3ZWVuIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcy5cclxuICovXHJcbmZ1bmN0aW9uIHJhbmRvbUludChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xyXG5cclxuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluKTtcclxuXHJcbn0iXX0=