DEV Community

Dice Rolling Program

Aaron McCollum on July 24, 2020

Recently I started playing a game of Dungeons and Dragons with friends, and the first night I noticed I lacked the various sets of dice you need to...
Collapse
 
pentacular profile image
pentacular • • Edited

You repeat yourself a lot. :)

The following technique may help avoid that.

const d = (sides) =>
  () => Math.ceil(Math.random() * sides);

const d20 = d(20);
const d12 = d(12);

console.log(d20());

Here d is a function which generates parameterized functions by using lexical closure.

Collapse
 
shadowtime2000 profile image
shadowtime2000 •

You don't need to have a function that returns another function. You can simplify it to this:

function d(sides) {
  return Math.floor(Math.random() * sides + 1);
}

And use it with this:

console.log(d(20));
Collapse
 
aaronmccollum profile image
Aaron McCollum •

Mind blown. Thank you all! I'm just now getting into ES6 and shorthand functions etc. I just love how there are ways to do in 10 lines what I did in ~50-60 lines. Incredible.

I'll be referencing this when I update the code in the next few weeks. Thank you both!

Collapse
 
pentacular profile image
pentacular •

That's true, but his code wants to call functions directly.

Also, why are you adding 1 and then flooring?

Thread Thread
 
shadowtime2000 profile image
shadowtime2000 •

I am adding one because Math.random() returns a float between 0 and 1, but it never includes 1, so you could never get 20 without adding 1.

Thread Thread
 
pentacular profile image
pentacular •

Why not use Math.ceil?

Collapse
 
christinamcmahon profile image
Christina •

Great job! It looks like the other commenters beat me to it as far as suggestions since I was also thinking of ways to have code that is more DRY (Don't Repeat Yourself). Overall, I love seeing you go from idea to useful app! If you do end up writing a function that lets you pass the sides as an argument, you could add a feature so that the user can enter a custom sided die. Good luck!