88 lines
2.1 KiB
JavaScript
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("");
|
|
}
|