4
\$\begingroup\$

I was messing around with Javascript in Khanacademy the other day and this "monstrosity" was born. It's a terrain generator that uses a simplified version of the random walk method.

// current tile position
var BlockX = 200;
var BlockY = 200;
// tile size
var SizeX = 2;
var SizeY = 2;
// min and max X positions
var MinX = 0;
var MaxX = 400;
// min and max Y positions
var MinY = 0;
var MaxY = 400;
// possible position changes
var BlockPosChanges = [-1, 1, 0]; 
// repeats and max repeats
var MaxRepeats = round(random(10*100, 10*1250)); // Do not change! This is at the max safe amount
var Repeats = 0;
// set the background
background(0, 13, 255);
// main program loop
while(Repeats < MaxRepeats) {
 // possible color ranges
 var RedRange = round(random(45, 70));
 var BlueRange = round(random(165, 100));
 var GreenRange = round(random(20, 50));
 // draw a tile
 noStroke();
 fill(RedRange, BlueRange, GreenRange);
 rect(BlockX, BlockY, SizeX, SizeY);
 // change the current tile position
 BlockX += BlockPosChanges[floor(random() * BlockPosChanges.length)];
 BlockY += BlockPosChanges[floor(random() * BlockPosChanges.length)];
 // test if at edge
 if(BlockX <= MinX || BlockX >= MaxX) {
 break;
 }
 // test if at edge
 if(BlockY <= MinY || BlockX >= MaxY) {
 break;
 }
 // increment repeats
 Repeats++;
}

Since this version of Javascript has features that may not be included in other variants, you can test this program here in Khanacademy. What can I improve here?

asked Oct 1, 2014 at 14:12
\$\endgroup\$
2
  • 2
    \$\begingroup\$ This appears to be a follow-up to a previous question. \$\endgroup\$ Commented Oct 2, 2014 at 3:01
  • \$\begingroup\$ Bug: BlockX >= MaxY should be BlockY >= MaxY. \$\endgroup\$ Commented Oct 12, 2014 at 0:48

1 Answer 1

4
\$\begingroup\$

Style

Variables and functions (except constructors) in JavaScript are normally written in camelCase with a leading lowercase letter. It's not mandatory, but you'll find it easier to work with others if you follow a language's conventions. There are many guides out there, but I mostly follow Google's JavaScript Style Guide.

Some of the variables do not change once set. These should use ALL_CAPS to denote that they are constants and probably assigned at the top.

Another point in the guide is to surround all operators and keywords with a space. Omitting the space between if, while, etc. and the opening parenthesis makes it harder to skim without syntax highlighting.

You can omit comments that merely restate the code in prose. At best they waste the readers time, and at worst they become misleading or incorrect when they aren't changed with the code. Good comments state programmer intent or clarify tricky algorithms. This comment adds no value.

// increment repeats
Repeats++;

Bug

As I noted in the comment, you have a typo bug:

if(BlockY <= MinY || BlockX >= MaxY) {
 ^^^^^^

This is common when using similarly-named variables, but it's difficult to avoid doing so in rendering code.

Clarity

You can improve the performance of the random choice between -1, 0, and 1--and in my opinion make it more obvious--using a simpler equation without the array:

BlockX += floor(3 * random()) - 1;

You are using a while loop where a for loop would be more obvious. As written, you have to scan the whole body to see that Repeats only gets incremented once at the end. Use this instead:

for (var Repeats = 0; Repeats < MaxRepeats; ++Repeats) { ... }
answered Oct 12, 2014 at 1:05
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.