This is one of the projects from freeCodeCamp. It's a game of Simon (a memory game). I would like a review on my code.
var generatedPattern = [];
var playerPattern = [];
var patternLength = 1;
var redRef = 1;
var greenRef = 2;
var blueRef = 3;
var yellowRef = 4;
function generateNextPatternValue() {
if (patternLength == 20) {
gameReset();
} else {
var next = getRandomNum(1, 4);
if (next === generatedPattern[generatedPattern.length - 1] && next == 4)
next--;
else if (next === generatedPattern[generatedPattern.length - 1])
next++;
generatedPattern.push(next);
animateGeneratedPattern();
}
}
function getRandomNum(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function animateRed(lightup) {
if (lightup) {
var audio = new Audio("https://s3.amazonaws.com/freecodecamp/simonSound1.mp3");
audio.play();
}
$("#1").toggleClass("animateRed");
}
function animateGreen(lightup) {
if (lightup) {
var audio = new Audio("https://s3.amazonaws.com/freecodecamp/simonSound2.mp3");
audio.play();
}
$("#2").toggleClass("animateGreen");
}
function animateBlue(lightup) {
if (lightup) {
var audio = new Audio("https://s3.amazonaws.com/freecodecamp/simonSound3.mp3");
audio.play();
}
$("#3").toggleClass("animateBlue");
}
function animateYellow(lightup) {
if (lightup) {
var audio = new Audio("https://s3.amazonaws.com/freecodecamp/simonSound4.mp3");
audio.play();
}
$("#4").toggleClass("animateYellow");
}
function animateGeneratedPattern() {
var i = 0;
function animateNextPattern(lightup) {
if (!generatedPattern || generatedPattern.length === i) {
return;
}
switch (generatedPattern[i]) {
case 1:
animateRed(lightup);
break;
case 2:
animateGreen(lightup);
break;
case 3:
animateBlue(lightup);
break;
case 4:
animateYellow(lightup);
break;
}
if (lightup) {
// Long delay before turning light off
setTimeout(function() {
animateNextPattern(false);
}, 1000);
} else {
// Small delay before turning on next light
i++;
setTimeout(function() {
animateNextPattern(true);
}, 100);
}
}
animateNextPattern(true);
}
function gameReset() {
if (patternLength == 20)
alert("You Have Won");
document.getElementById("start").disabled = false;
playerPattern = [];
generatedPattern = [];
patternLength = 1;
updateLength();
restoreColors();
}
function restoreColors() {
$("#1").removeClass("animateRed");
$("#2").removeClass("animateGreen");
$("#3").removeClass("animateBlue");
$("#4").removeClass("animateYellow");
}
function updateLength() {
$("#length").empty();
var txtNode = document.createTextNode(patternLength);
document.getElementById("length").appendChild(txtNode);
}
function animateScreen(turnOn) {
if (turnOn) {
var audio = new Audio("http://www.sounds.beachware.com/2illionzayp3may/illwavul/CLNKBEEP.mp3");
audio.play();
}
$("body").toggleClass("wrongSeries");
}
function wrongChoice() {
animateScreen(true);
setTimeout(function() {
animateScreen(false);
}, 100);
}
function unbind() {
$("#1").unbind("click");
$("#2").unbind("click");
$("#3").unbind("click");
$("#4").unbind("click");
}
function bind() {
$("#1").bind("click", function() {
if (document.getElementById("start").disabled) {
playerPattern.push(1);
if (checkSeries()) {
animateRed(true);
setTimeout(function() {
animateRed(false);
}, 500);
}
}
});
$("#2").bind("click", function() {
if (document.getElementById("start").disabled) {
playerPattern.push(2);
if (checkSeries()) {
animateGreen(true);
setTimeout(function() {
animateGreen(false);
}, 500);
}
}
});
$("#3").bind("click", function() {
if (document.getElementById("start").disabled) {
playerPattern.push(3);
if (checkSeries()) {
animateBlue(true);
setTimeout(function() {
animateBlue(false);
}, 500);
}
}
});
$("#4").bind("click", function() {
if (document.getElementById("start").disabled) {
playerPattern.push(4);
if (checkSeries()) {
animateYellow(true);
setTimeout(function() {
animateYellow(false);
}, 500);
}
}
});
}
function checkSeries() {
if (playerPattern[playerPattern.length - 1] !== generatedPattern[playerPattern.length - 1]) {
if (document.getElementById("strict").checked) {
wrongChoice();
gameReset();
document.getElementById("start").disabled = true;
setTimeout(generateNextPatternValue, 1500);
} else {
unbind();
wrongChoice();
playerPattern = [];
setTimeout(animateGeneratedPattern, 1500);
setTimeout(bind, 1500 * patternLength);
}
return false;
} else if (playerPattern.length == patternLength) {
unbind();
patternLength++;
updateLength();
playerPattern = [];
setTimeout(generateNextPatternValue, 1000);
setTimeout(bind, 1500 * patternLength);
return true;
}
return true;
}
window.addEventListener("load", updateLength);
window.addEventListener("load", bind);
$("#start").on("click", function() {
document.getElementById("start").disabled = true;
generateNextPatternValue();
});
$("#reset").on("click", gameReset);
Full code here.