tetris-prng
Version:
A Fibonacci linear feedback shift register used as a PRNG (Pseudo-random Number Generator), as in NES Tetris.
56 lines (43 loc) • 1.92 kB
JavaScript
var tprng = require('./');
init(tprng, 900, 1, 'Tetris seed, 16 bits, (range 0-65535)', 65000);
init(tprng.lfsr(0x8988, [1, 9], 31), 900, 1, 'Tetris seed, 32 bits');
//init(tprng.seeded(0x0, 1, 9, 31), 600, 1, '0 seed, 32 bits');
init(tprng.lfsr(0xFFFFFFFF, [1, 9], 31), 900, 1, '0xFFFFFFFF seed, 32 bits');
init(tprng.lfsr(0x8988, [16,15,13,4], 31), 900, 1, 'Tetris seed, 4 taps, 32 bits');
init(tprng.lfsr(0xFFFFFFFF, [16,15,13,4], 31), 900, 1, '0xFFFFFFFF seed, 4 taps, 32 bits');
init(tprng.lfsr(0x11, [16,15,13,4], 31), 900, 1, '0x11 seed, 4 taps, 32 bits');
function init(gen, renderWidth, renderHeight, label, scale) {
scale = scale || 1;
var cvs = document.createElement('canvas');
var ctx = cvs.getContext('2d');
cvs.width = renderWidth;
cvs.height = renderHeight;
var p = document.createElement('p');
p.textContent = label;
var container = document.createElement('div');
container.appendChild(cvs);
container.appendChild(p);
document.body.appendChild(container);
var style = document.createElement('style');
style.textContent = ''
+ 'p { margin-top: 0; font-size: 120%; }'
+ 'canvas { -webkit-transform: scaleY(10); transform: scaleY(10); }';
document.head.appendChild(style);
var lastNumbers = Array(1000).join(0).split('').map(function() { return -1 });
(function render() {
lastNumbers.shift();
lastNumbers.push(gen());
ctx.clearRect(0, 0, renderWidth, renderHeight);
var imgdata = ctx.getImageData(0, 0, renderWidth, renderHeight);
for (var i = 0; i < lastNumbers.length; i++) {
var alpha = Math.floor(i / (lastNumbers.length - 1) * 255);
var value = lastNumbers[i];
var x = Math.floor((value / 0xFFFFFFFF) * renderWidth * scale);
var y = renderHeight / 2;
if (x < 0) continue;
imgdata.data[x*4+3] = alpha;
}
ctx.putImageData(imgdata, 0, 0);
requestAnimationFrame(render);
}())
}