RosettaCodeData/Task/Deal-cards-for-FreeCell/JavaScript/deal-cards-for-freecell.js

88 lines
2.1 KiB
JavaScript

"use strict";
/*
* Microsoft C Run-time-Library-compatible Random Number Generator
* Copyright by Shlomi Fish, 2011.
* Released under the MIT/X11 License
* ( http://en.wikipedia.org/wiki/MIT_License ).
* */
/* This uses Joose 2.x-or-above, an object system for JavaScript - http://code.google.com/p/joose-js/ . */
Class('MSRand', {
has: {
seed: { is: rw, },
},
methods: {
rand: function() {
this.setSeed((this.getSeed() * 214013 + 2531011) & 0x7FFFFFFF);
return ((this.getSeed() >> 16) & 0x7fff);
},
max_rand: function(mymax) {
return this.rand() % mymax;
},
shuffle: function(deck) {
if (deck.length) {
var i = deck.length;
while (--i) {
var j = this.max_rand(i+1);
var tmp = deck[i];
deck[i] = deck[j];
deck[j] = tmp;
}
}
return deck;
},
},
});
/*
* Microsoft Windows Freecell / Freecell Pro boards generation.
*
* See:
*
* - http://rosettacode.org/wiki/Deal_cards_for_FreeCell
*
* - http://www.solitairelaboratory.com/mshuffle.txt
*
* Under MIT/X11 Licence.
*
* */
function deal_ms_fc_board(seed) {
var randomizer = new MSRand({ seed: seed });
var num_cols = 8;
var _perl_range = function(start, end) {
var ret = [];
for (var i = start; i <= end; i++) {
ret.push(i);
}
return ret;
};
var columns = _perl_range(0, num_cols-1).map(function () { return []; });
var deck = _perl_range(0, 4*13-1);
randomizer.shuffle(deck);
deck = deck.reverse()
for (var i = 0; i < 52; i++) {
columns[i % num_cols].push(deck[i]);
}
var render_card = function (card) {
var suit = (card % 4);
var rank = Math.floor(card / 4);
return "A23456789TJQK".charAt(rank) + "CDHS".charAt(suit);
}
var render_column = function(col) {
return ": " + col.map(render_card).join(" ") + "\n";
}
return columns.map(render_column).join("");
}